Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 22

Μηχανική Μάθηση σε Python

(Machine Learning)

Διάλεξη 4η

Δ. Κάβουρας

(2022)

Δ. Κάβουρας, Ph.D. 1 Μηχανική Μάθηση 04_22: Εποπτευόμενη Μάθηση I


Contents

4. ΕΠΟΠΤΕΥΟΜΕΝΗ ΜΗΧΑΝΙΚΗ ΜΑΘΗΣΗ I(supervised machine learning Ι) 3

4.1 Εισαγωγή 3
4.2. ΤΑΞΙΝΟΜΗΣΗ (Classification) 4
4.2.1. Ταξινομητής ελάχιστης απόστασης 4
Παράδειγμα 1: 6
4.2.2. Ταξινομητής ελάχιστης ευκλείδειας απόστασης για 2 ή περισσότερες κατηγορίες 7
Παράδειγμα 2: 8
Παράδειγμα 3: 12
Άσκηση 4 18

Δ. Κάβουρας, Ph.D. 2 Μηχανική Μάθηση 04_22: Εποπτευόμενη Μάθηση I


4. ΕΠΟΠΤΕΥΟΜΕΝΗ ΜΗΧΑΝΙΚΗ ΜΑΘΗΣΗ I(supervised machine
learning Ι)
4.1 Εισαγωγή

Η Εποπτευόμενη Μηχανική Μάθηση (ΕΜΜ) είναι ένα διεθνώς αναγνωρισμένο επιστημονικό


πεδίο, με πολλές εφαρμογές, που έχει σαν αντικείμενο την ανάλυση, αναγνώριση, και
κατηγοριοποίηση ή ταξινόμηση κάποιας πληροφορίας (π.χ. σήμα, εικόνα, κείμενο κ.ά.) σε
κάποια συγκεκριμένη κατηγορία. Η ΕΜΜ έχει βρει πολλές εφαρμογές σε διάφορα επιστημονικά
πεδία όπως στην επιστήμη των υπολογιστών, στην ιατρική, στην ηλεκτρονική. Παραδείγματα
είναι η αναγνώριση ομιλίας, η αναγνώριση προσώπων, αναγνώριση χαρακτήρων κειμένου,
αναγνώριση και κατηγοριοποίηση κειμένου, αναγνώριση και κατηγοριοποίηση εικόνων όπως τα
δακτυλικά αποτυπώματα, οι πινακίδες κυκλοφορίας αυτοκινήτων κλπ.
Για παράδειγμα, στην ανάλυση εικόνας ή σήματος, αποσκοπεί στην εύρεση χρήσιμης
πληροφορίας από τα σήματα και την περιγραφή ή ταξινόμηση αυτής της πληροφορίας με
κατάλληλη επεξεργασία από τον Η/Υ. Στην ανάλυση εικόνας (ή σήματος) το αποτέλεσμα είναι
συνήθως αριθμητικό και σχετίζεται με την αναγνώριση συγκεκριμένου αντικειμένου ή
διαφορετικά με την ταξινόμηση ενός αντικειμένου σε μία από συγκεκριμένες κατηγορίες. Για
παράδειγμα, στα συστήματα αυτόματης διάγνωσης στην ιατρική και βιολογία, τα λεγόμενα και
CAD ή computer aided diagnosis, η αυτόματη διάγνωση με ένα σύστημα ανάλυσης ιατρικής
εικόνας γίνεται σε δύο στάδια: 1/Εύρεση χαρακτηριστικών που περιγράφουν χρήσιμες ιδιότητες
της εικόνας και 2/ταξινόμηση. Τα χαρακτηριστικά είναι ιδιότητες της υφής της εικόνας ή του
σχήματος και η ταξινόμηση αφορά την διαδικασία κατά την οποία, με βάση τις τιμές των
χαρακτηριστικών υφής ή σχήματος, η εικόνα χαρακτηρίζεται ως φυσιολογική ή ότι αντιστοιχεί
σε μία ασθένεια.

Δ. Κάβουρας, Ph.D. 3 Μηχανική Μάθηση 04_22: Εποπτευόμενη Μάθηση I


4.2. ΤΑΞΙΝΟΜΗΣΗ (Classification)

Ο ταξινομητής είναι ένας αλγόριθμος λήψης αποφάσεων, που έχει σχεδιασθεί να ταξινομεί ένα
διάνυσμα χαρακτηριστικών σε μία από Ci (i=1,2,3…) κατηγορίες.

4.2.1. Ταξινομητής ελάχιστης απόστασης


Ας υποθέσουμε ότι θέλουμε να σχεδιάσουμε ένα ταξινομητή που να ταξινομεί ένα σύνολο εικόνων σε
μία από δύο πιθανές κατηγορίες C1 και C2. Ας θεωρήσουμε ένα πραγματικό πρόβλημα, μία ιατρική
εφαρμογή: Έστω ότι χρειάζεται να σχεδιάσουμε ένα σύστημα που να μπορεί να ξεχωρίζει με
ικανοποιητική ακρίβεια δύο ασθένειες του ήπατος, την λιπώδη διήθηση από την κίρρωση. Προς τούτο,
χρειαζόμαστε ικανό αριθμό από ιατρικά επιβεβαιωμένες εικόνες ήπατος και από τις 2 ασθένειες

Υπερηχογραφική εικόνα από ήπαρ με κίρρωση Υπερηχογραφική εικόνα από ήπαρ με λιπώδη
διήθηση.

καθώς και ένα εργαλείο λογισμικού για να απεικονίζουμε τις εικόνες αλλά και να παίρνουμε δείγματα
από τις εικόνες, δηλαδή δείγματα από περιοχές ενδιαφέροντος ή ROIs (Regions Of Interest).

20x20 pixel ROI

Σχήμα: Επίδειξη λήψης εικονιδίου από περιοχή ενδιαφέροντος.

Δ. Κάβουρας, Ph.D. 4 Μηχανική Μάθηση 04_22: Εποπτευόμενη Μάθηση I


Έστω ένα διάνυσμα F δύο χαρακτηριστικών f 1 και f2, που μετρούνται από την εικόνα j
(έστω f1=μέση τιμή ROI και f2= τυπική απόκλιση ROI), η οποία ανήκει στην κατηγορία i. Για δύο
κατηγορίες εικόνων i:1,2. Αυτός ο ταξινομητής φαίνεται στο παρακάτω σχήμα 1:


bisector
5 
M1   
4.3

BM1  BM 2
b 
B=  1 
b
 2
1 
M2   
 4
X 

Σχήμα 1.1: παράδειγμα ενός ταξινομητή 2-κατηγοριών (ταξινομητής


ελάχιστης απόστασης).

Η σχεδίαση του ταξινομητή προϋποθέτει την ύπαρξη ενός συνόλου διανυσμάτων F i,j γνωστής
ταξινόμησης, που θα ονομάζουμε σχεδιαστικό ή εκπαιδευτικό σετ (training set). Έστω:

Κατηγορία 1: , ,

Κατηγορία 2: , ,
Αν τα διανύσματα σχεδιασθούν στο πεδίο χαρακτηριστικών f 1-f2, τότε όπως γίνεται αντιληπτό από το
σχήμα τα διανύσματα καθορίζουν δύο ξεχωριστούς χώρους, ένα για κάθε κατηγορία, με διανύσματα
μέσων τιμών

και

Δ. Κάβουρας, Ph.D. 5 Μηχανική Μάθηση 04_22: Εποπτευόμενη Μάθηση I


Είναι προφανές ότι οι δύο κατηγορίες μπορούν να διαχωριστούν με τη μεσοκάθετο της Μ 1Μ2

γραμμής. Κάθε νέο διάνυσμα ταξινομείται στην κατηγορία 1 ή 2 αν η θέση του στο f 1-f2 πεδίο
είναι αριστερά ή δεξιά της μεσοκαθέτου. Αν ευρίσκεται επί της μεσοκαθέτου τότε το Χ διάνυσμα
θεωρείται ότι δεν μπορεί να ταξινομηθεί.

Έστω σημείο επί της μεσοκαθέτου τότε ισχύει ΒΜ2=ΒΜ1 ή

(1−b 1 )2 +(4−b2 )2 =(5−b1 )2 +(4 . 3−b 2 )2


or

και

g( F )=8 b 1 +0 . 6 b2 −26 . 49

g(F) είναι η συνάρτηση διάκρισης του ταξινομητή (discriminant function).

Παράδειγμα 1: ταξινομητής ελάχιστης απόστασης, σχέση μεσοκαθέτου, πρότυπα 2


χαρακτηριστικών, 2 κατηγορίες

Έστω δύο διανύσματα και αγνώστου κατηγορίας, αλλά ανήκοντα σε μία από τις
δύο συγκεκριμένες κατηγορίες. Αντικαθιστώντας στην g(F) παίρνουμε:

g( F1 )=8∗5+0. 6∗1−26 . 49=14 . 11> 0

Εξετάζοντας τα αποτελέσματα διαπιστώνεται ότι όταν η g(F 1) είναι μεγαλύτερη του μηδενός τότε
ευρίσκεται αριστερά της μεσοκαθέτου και επομένως ταξινομείται στην κατηγορία 1 και αν ευρίσκεται
δεξιά της μεσοκαθέτου ανήκει στην κατηγορία 2.

Δ. Κάβουρας, Ph.D. 6 Μηχανική Μάθηση 04_22: Εποπτευόμενη Μάθηση I


4.2.2. Ταξινομητής ελάχιστης ευκλείδειας απόστασης για 2 ή περισσότερες κατηγορίες

Γενικεύοντας, μπορούμε να υπολογίσουμε την απόσταση ενός αγνώστου σημείου από κάθε
μία κατηγορία, με απλό υπολογισμό της ευκλειδείου απόστασης του Χ από τα μέσα διανύσματα των
κατηγοριών, Μi, όπου i=1,2,3,…, και να ταξινομήσουμε το Χ στην πλησιέστερη κατηγορία.

Γράφοντας αναλυτικά την σχέση της ευκλειδείου απόστασης, όπως προκύπτει και από το σχήμα 1.2,

Σχήμα 1.2: Βοηθητικό σχήμα για υπολογισμό απόστασης προτύπου Χ από μέσο διάνυσμα
κατηγορίας

d 2i =( μ1 −x 1 )2 +( μ2 −x 2 )2=
[
x 21 + x 22−2 μ 1 x1 + μ 2 x 2−12 ( μ21 + μ 22 ) ]
Η ανωτέρω σχέση μπορεί να απλοποιηθεί αν παρατηρήσουμε ότι
2
di είναι ελάχιστον αν είναι μέγιστο
([ ] [ ] )
1 2 2
g (X )=( μ i1 x1 + μ i2 x 2− 2 μi1 + μi2
Έτσι, i για i=1,2,3,…,Ν
Είναι η συνάρτηση κάθε κατηγορίας i. Για κάποιο Χ που πρέπει να ταξινομηθεί, υπολογίζουμε
τις g1 και g2 από την σχέση, τοποθετώντας στις θέσεις x1 x2 τις τιμές του δείγματος
(προτύπου), και ταξινομούμε το Χ στην κατηγορία με την μεγαλύτερη τιμή.

Δ. Κάβουρας, Ph.D. 7 Μηχανική Μάθηση 04_22: Εποπτευόμενη Μάθηση I


Δ. Κάβουρας, Ph.D. 8 Μηχανική Μάθηση 04_22: Εποπτευόμενη Μάθηση I
Παράδειγμα 2: ταξινομητής ελάχιστης ευκλείδειας απόστασης για 2 ή περισσότερες κατηγορίες

Δίνονται δύο κατηγορίες (κλάσεις) που αποτελούνται από τα παρακάτω διανύσματα χαρακτηριστικών:

Κλάση 1: F1,1 = [4 , 5], F1,2 = [5 , 5], F1,3 = [6 , 5]


Κλάση 2: F2,1 = [1 , 1], F2,2 = [1 , 3], F2,3 = [1 , 2]
Να σχεδιαστεί ο ταξινομητής Ελάχιστης Απόστασης με τη βοήθεια των παραπάνω προτύπων, να
ταξινομηθεί το πρότυπο F = [1 , 8], και να σχεδιαστεί ο χώρος ταξινόμησης.

Απάντηση:

1) Υπολογίζουμε τα μέσα διαστήματα Μ1=[5 , 5] και Μ2=[1,2]


2) Υπολογίζουμε τις συναρτήσεις g1, g2

=5+40-0.5*(50)=5+15=20.

=1+16-0.5*5=14.5
3) Το Χ=[1,8] ταξινομείται στην g με την μεγαλύτερη τιμή άρα ταξινομείται στην κατηγορία 1.
4) Ακολουθεί η γραφική παράσταση

Σχήμα 1.3: Ταξινομητής ελάχιστης απόστασης

Δ. Κάβουρας, Ph.D. 9 Μηχανική Μάθηση 04_22: Εποπτευόμενη Μάθηση I


Το ακόλουθο πρόγραμμα λύνει το παράδειγμα 2 σε python

import numpy as np
import matplotlib.pyplot as plt

# --- MDC classifier


def MDCdistance(xPatt, Class):
nFeats = np.size(Class, 1)
meanClass = np.zeros(nFeats, dtype='float')
# find means of features
for j in range(nFeats):
meanClass[j] = np.mean(Class[:, j])
sumA = 0
sumB = 0
for j in range(nFeats):
sumA = sumA + meanClass[j] * xPatt[j]
sumB = sumB + meanClass[j] ** 2
d = sumA - 0.5 * sumB
return (d)

# --------------------------------------------
def MDC_classifier(xPatt, class1, class2):
classified = 0
d1 = MDCdistance(xPatt, class1)
d2 = MDCdistance(xPatt, class2)
print('distance 1: d1= %6.1f\ndistance 2: d2= %6.1f \n' % (d1, d2))
if (d1 > d2):
classified = 1
else:
classified = 2
return (classified)
ΕΞΟΔΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ
distance 1: d1= 20.0
# -------------- MAIN PROGRAM ------------------------------
class1 = [[4, 5], [5, 5], [6, 5]] # Let a 2 feature 5 pattern class1 distance 2: d2= 14.5
class2 = [[1, 1], [1, 3], [1, 2]] # Let a 2 feature 4 pattern class2
class1 = np.array(class1, float) pattern X= [1, 8] is classified to class 1
class2 = np.array(class2, float) [1, 8]
xPatt = [1, 8] [5. 5.]

classified = MDC_classifier(xPatt, class1, class2)


print("pattern X= ", end='')
print(xPatt, end='')
print(" is classified to class %2d" % classified)
fNames = ["feat1", "feat2", "feat3"]

nFeats = np.size(class1, 1)

fz = 6
plt.figure(figsize=(fz, fz))
plt.plot(class1[:, 0], class1[:, 1], 'o', color='b')
plt.plot(class2[:, 0], class2[:, 1], 'x', color='r')
plt.plot(xPatt[0], xPatt[1], '*', color='k', markersize=12)

plt.grid()
plt.legend(('class1', 'class2', 'unknown pattern'), loc='best')
plt.xlabel(fNames[0])
plt.ylabel(fNames[1])

Δ. Κάβουρας, Ph.D. 10 Μηχανική Μάθηση 04_22: Εποπτευόμενη Μάθηση I


plt.title('Scatter diagram of : ' + fNames[0] + ' Vs ' + fNames[1])

# plot lines between xPatt and means of classes


meanClass1 = np.zeros(nFeats, dtype='float')
# find means of class1
for j in range(nFeats):
meanClass1[j] = np.mean(class1[:, j])

meanClass2 = np.zeros(nFeats, dtype='float')


# find means of class2
for j in range(nFeats):
meanClass2[j] = np.mean(class2[:, j])

plt.plot((xPatt[0], meanClass1[0]),
(xPatt[1], meanClass1[1]), '--', color='b')
plt.plot((xPatt[0], meanClass2[0]),
(xPatt[1], meanClass2[1]), '--', color='b')
plt.show()
print(xPatt)
print(meanClass1)

Στην συνέχεια θα δούμε πως μπορούμε να γράψουμε το ίδιο πρόγραμμα (πλην των γραφικών) αλλά
κάνοντας χρήση της βιβλιοθήκης sklearn
import numpy as np
import matplotlib.pyplot as plt
class1 = [[4, 5], [5, 5], [6, 5]] # Let a 2 feature 5 pattern class1
class2 = [[1, 1], [1, 3], [1, 2]] # Let a 2 feature 4 pattern class2
class1 = np.array(class1, float)
class2 = np.array(class2, float)
xPatt = [1, 8]

# 2.APPLY MD CLASSIFIER USING SKLEARN BUILT-IN FUNCTION


from sklearn.neighbors import NearestCentroid
MDCmodel = NearestCentroid()

X_train=np.concatenate((class1, class2),axis=0)
y_train=np.concatenate( (np.zeros(len(class1),int),
np.ones(len(class2),int)),axis=0)
MDCmodel.fit(X_train,y_train)
X_test=np.asarray(xPatt)
X_test=X_test.reshape(1,-1)
classified= MDCmodel.predict(X_test)

print("pattern X= ", end='');print(X_test, end='')


print(" is classified to class %2d" % (classified+1))

ΕΞΟΔΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ:
pattern X= [[1 8]] is classified to class 1

Δ. Κάβουρας, Ph.D. 11 Μηχανική Μάθηση 04_22: Εποπτευόμενη Μάθηση I


Επεκτείνοντας το ανωτέρω πρόγραμμα μπορούμε να το σχεδιάσουμε έτσι ώστε να διαβάζει πραγματικά
δεδομένα και να ταξινομεί ένα-ένα τα δεδομένα με τον MDC της sklearn
import numpy as np
# 3. ********* LOAD ACTUAL DATA ***************
import pandas as pd
def readXLSdata(fileName):
df = pd.read_excel(fileName)
fNames=df.columns
class1=df._get_numeric_data()
class1=np.asarray(class1)
return(class1,fNames)
def loadData_ColonRectalCa():
path="./Data/"
fileName=path+"HG_x20.xls" #"HG_x5.xls"
(class1,fNames)=readXLSdata(fileName)
fileName=path+"LG_x20.xls" #LG_x5.xls
(class2,fNames)=readXLSdata(fileName)
X=np.concatenate((class1, class2),axis=0)
nPat1=np.size(class1,0);nPat2=np.size(class2,0);
nPat1=np.size(class1,0);nPat2=np.size(class2,0);
y=np.concatenate( (np.zeros(nPat1,int),np.ones(nPat2,int)),axis=0)
xLabels=['High Grade CRC','Low Grade CRC']
return(X,y,fNames,xLabels)
#-------------------------------------------------------
#--------------------MAIN CALLING PROGRAM --------------
#-------------------------------------------------------
#1. Load data
(X,y,fNames,xLabels)=loadData_ColonRectalCa()

#2. Classify
from sklearn.neighbors import NearestCentroid
MDCmodel = NearestCentroid()
nFeats=np.size(X,1)
desiredFeatures=20 #nFeats
X_train=X[:,0:desiredFeatures]
y_train=y
y_test=[]
MDCmodel.fit(X_train,y_train)
for i in range(np.size(X,0)):
X_test=X[i,0:desiredFeatures]
# print(X_test)
X_test=np.asarray(X_test)
X_test=X_test.reshape(1,-1)
classified= MDCmodel.predict(X_test)
y_test.append(classified)
#3. Calculate accuracy
y_test=np.asarray(y_test);y_test=y_test.reshape(1,-1)
z=y_train-y_test
accuracy=np.sum(z==0)
percAccuracy=100*accuracy/len(X)
print("correctly classified: %4d out of %4d" % (accuracy,len(X)));
print("percent Accuracy: %4.2f%%"% percAccuracy)

Δ. Κάβουρας, Ph.D. 12 Μηχανική Μάθηση 04_22: Εποπτευόμενη Μάθηση I


Παράδειγμα 3: ταξινομητής ελάχιστης ευκλείδειας απόστασης, με πρότυπα 2-χαρακτηριστικών και
για 3 κατηγορίες

Δίνονται τρείς κατηγορίες (κλάσεις) που αποτελούνται από τα παρακάτω διανύσματα χαρακτηριστικών:

C1:

C2:

C3:
Να σχεδιαστεί ο ταξινομητής Ελάχιστης Απόστασης με τη βοήθεια των παραπάνω προτύπων και στη
συνέχεια να ταξινομηθεί το πρότυπο F = [5,9].

Απάντηση:
1)Υπολογίζουμε τα διανύσματα μέσων τιμών
Μ1=[-2, 3]Τ, Μ2=[6, 5.6] Τ, Μ3=[8, 0.4] Τ
( )
2 2
gi ( X )=( μ i1 x1 + μ i2 x 2− 12 [ μi1 ] + [ μi2 ]
2) Από την σχέση και τα διανύσματα μέσων
τιμών υπολογίζουμε τις g1, g2, g3

g1(X)=-2x1+3x2-6.5 για κατηγορία 1


g2(X)= 6x1+5.6x2-33.68 για κατηγορία 2
g3(X)= 8x1+0.4x2-32.08 για κατηγορία 3
Επομένως , το πρότυπο X θα ταξινομηθεί στην κατηγορία όπου η τιμή της συνάρτησης gi(X)
είναι μεγίστη.
Αντικαθιστώντας το πρότυπο F = [5,9] στις 3 παραπάνω εξισώσεις έχουμε

g1(X)=-2*5+3*9-6.5 =10.5 για κατηγορία 1


g2(X)= 6*5+5.6*9-33.68 =46.72 για κατηγορία 2
g3(X)= 8*5+0.4*9-32.08 =11.52 για κατηγορία 3
άρα ταξινομείται στην κλάση 2, επειδή αυτή έχει την μέγιστη τιμή .

Λύση παραδείγματος 3 σε python

import numpy as np
import matplotlib.pyplot as plt
import moduleUtils as U

# --- MDC classifier


def MDCdistance(xPatt, Class):
nFeats = np.size(Class, 1)
meanClass = np.zeros(nFeats, dtype='float')
# 1.find means of features
for j in range(nFeats):
meanClass[j] = np.mean(Class[:, j])
sumA = 0
sumB = 0
# 2.find distance from Class mean

Δ. Κάβουρας, Ph.D. 13 Μηχανική Μάθηση 04_22: Εποπτευόμενη Μάθηση I


for j in range(nFeats):
sumA = sumA + meanClass[j] * xPatt[j]
sumB = sumB + meanClass[j] ** 2
d = sumA - 0.5 * sumB
return (d)

def MDC_classifier(xPatt, superClass, classLabels):


classified = 0
nFeats = np.size(superClass, 1)
# 1.---find number of classes---
nClasses = 0
L = len(classLabels)
for i in range(L):
k = (int(classLabels[i]))
if (k > nClasses):
nClasses = k

# 2.---- find number of patterns per class---


nPatts = np.zeros((nClasses + 1), float)
for j in range(nClasses + 1):
nPatts[j] = 0
for i in range(L):
k = (int(classLabels[i]))
if (k == j):
nPatts[j] = nPatts[j] + 1

# 3.find distances of xPatt from each class


d = np.zeros(nClasses + 1, float)
P=0
for i in range(nClasses + 1):
K = np.int32(nPatts[i])
Class = np.zeros((K, nFeats), float)
Class = superClass[P:P + K, ]
P=P+K
d[i] = MDCdistance(xPatt, Class)

print("distances from each class", end='')


print(d)
# 4.find class with highest value
maxV = 0
for i in range(len(d)):
if (d[i] > maxV):
maxV = d[i]
indx = i
classified = indx + 1
return (classified)

# -------------- MAIN PROGRAM


------------------------------

U.cls()

class1 = [[0, 3], [-1, 3], [-2, 3], [-3, 3], [-4, 3]] # Let a 2

Δ. Κάβουρας, Ph.D. 14 Μηχανική Μάθηση 04_22: Εποπτευόμενη Μάθηση I


feature 5 pattern class1
class2 = [[5, 5], [6, 5], [6, 6], [6, 7], [7, 5]] # Let a 2
feature 5 pattern class2
class3 = [[6, -1], [7, 0], [8, 1], [9, 1], [10, 1]] # Let a 2
feature 5 pattern class3
fNames = ["feat1", "feat2"]
xPatt = [5, 9]
nPatts1 = np.size(class1, 0)
nPatts2 = np.size(class2, 0)
nPatts3 = np.size(class3, 0)
nFeats = np.size(class1, 1)
print(nPatts1, nPatts2, nPatts3)

class1 = np.asarray(class1, float)


class2 = np.asarray(class2, float)
class3 = np.asarray(class3, float)
superClass = np.concatenate((class1, class2, class3), 0)
N = nPatts1 + nPatts2 + nPatts3
x1 = ['0' for x in range(0, nPatts1)]
x2 = ['1' for x in range(0, nPatts2)]
x3 = ['2' for x in range(0, nPatts3)]
classLabels = np.array((x1 + x2 + x3))
distances from each class[10.5 46.72 11.52]
pattern is classified to class 2
fz = 6
plt.figure(figsize=(fz, fz))
plt.plot(class1[:, 0], class1[:, 1], 'o', color='b')
plt.plot(class2[:, 0], class2[:, 1], 'x', color='r')
plt.plot(class3[:, 0], class3[:, 1], '*', color='g')

plt.plot(xPatt[0], xPatt[1], '*', color='k', markersize=12)


plt.grid()
plt.legend(('class1', 'class2', 'class3', 'unknown
pattern'), loc='best')
plt.xlabel(fNames[0])
plt.ylabel(fNames[1])
plt.title('Scatter diagram of : ' + fNames[0] + ' Vs ' +
fNames[1])

# plot lines between xPatt and means of classes


# find means of class1
meanClass1 = np.zeros(nFeats, dtype='float')
for j in range(nFeats):
meanClass1[j] = np.mean(class1[:, j])

# find means of class2


meanClass2 = np.zeros(nFeats, dtype='float')
for j in range(nFeats):
meanClass2[j] = np.mean(class2[:, j])

# find means of class3


meanClass3 = np.zeros(nFeats, dtype='float')
for j in range(nFeats):
meanClass3[j] = np.mean(class3[:, j])

plt.plot((xPatt[0], meanClass1[0]),

Δ. Κάβουρας, Ph.D. 15 Μηχανική Μάθηση 04_22: Εποπτευόμενη Μάθηση I


(xPatt[1], meanClass1[1]), '--', color='k')
plt.plot((xPatt[0], meanClass2[0]),
(xPatt[1], meanClass2[1]), '--', color='k')
plt.plot((xPatt[0], meanClass3[0]),
(xPatt[1], meanClass3[1]), '--', color='k')
plt.show()
classified = MDC_classifier(xPatt, superClass,
classLabels)
print('pattern is classified to class %4d' % classified)

Ακολούθως, το ανωτέρω πρόγραμμα επεκτείνεται κάνοντας χρήση της βιβλιοθήκης sklearn και για
πολλαπλές κατηγορίες, χρησιμοποιώντας κατασκευασμένα δεδομένα.
import numpy as np
import matplotlib.pyplot as plt
import numpy as np

#-------------------------------------------------------------------
def formFakeData(nClasses,nFeats,dist):#====form fake data============

Ndata=[];mu_s=[];sigmas_s=[]
for i in range(nClasses):
Ndata=np.append(Ndata,150)
mu_s=np.append(mu_s,i*dist)
sigmas_s=np.append(sigmas_s,0.25)

Ndata=np.asarray(Ndata,int);
mu_s=np.asarray(mu_s,float);
sigmas_s=np.asarray(sigmas_s,float)

X=np.zeros((np.sum(Ndata),nFeats),float)
y=np.zeros(np.sum(Ndata),int);ic=0;

for iClasses in range(nClasses):


for n in range (Ndata[iClasses]):
X[ic]=np.random.normal(mu_s[iClasses],sigmas_s[iClasses],nFeats)
y[ic]=iClasses
ic=ic+1;
fNames=[]
fNames=np.asarray(fNames)
for i in range(nFeats):
fNames=np.append(fNames,'Feat_'+str(i))
print("Feature Names",end='');print(fNames)

return(X,y,fNames)

Δ. Κάβουρας, Ph.D. 16 Μηχανική Μάθηση 04_22: Εποπτευόμενη Μάθηση I


from numpy import where
#------------------------------------------------------------------
def plot2dClusterScatterDiagram(X,y,Title,fNames):
nClasses=max(y)+1
for iClass in range(nClasses):
x= where(y == iClass)
plt.scatter(X[x, 0], X[x, 1])
plt.grid();plt.title(Title);
plt.xlabel(fNames[0]);plt.ylabel(fNames[1])
z=[]
for i in range(nClasses):
z=np.append(z,"class"+str(i+1))
plt.legend(z,loc='best')

#----------------------------------------------------------------------
#read data
nClasses=4 #desired classes of fake data
nFeats=2 #desired features of fake data
dist=0.5 #between classes distance *******************
(X,y,fNames)=formFakeData(nClasses,nFeats,dist)
#4. Classify
from sklearn.neighbors import NearestCentroid
MDCmodel = NearestCentroid()
X_train=X
y_train=y
y_test=[]

MDCmodel.fit(X_train,y_train)

for i in range(np.size(X,0)):
X_test=X[i,:]
X_test=np.asarray(X_test)
X_test=X_test.reshape(1,-1)
classified= MDCmodel.predict(X_test)
y_test.append(classified)

#5. Calculate accuracy


y_test=np.asarray(y_test);y_test=y_test.reshape(1,-1);
y_test=y_test[0,:]
z=y_train-y_test
accuracy=np.sum(z==0)
percAccuracy=100*accuracy/len(X)
print("correctly classified: %4d out of %4d" % (accuracy,len(X)));
print("percent Accuracy: %4.2f%%"% percAccuracy)

#-------Plot clusters found by Clustering Algorithm-------------

if (nFeats==2):
fz=12;plt.figure(figsize=(fz,0.5*fz));
#-------------Plot original data scatter ----------------------
plt.subplot(1,2,1)
Title='scatter diagram'
plot2dClusterScatterDiagram(X,y_train,Title,fNames)

Δ. Κάβουρας, Ph.D. 17 Μηχανική Μάθηση 04_22: Εποπτευόμενη Μάθηση I


#-------------Plot scatter of classes -------------------

print(np.shape(y_train));print(np.shape(y_test))
plt.subplot(1,2,2)
Title="Classified data Scatters"
plot2dClusterScatterDiagram(X,y_test,Title,fNames)
plt.show()

correctly classified: 529 out of 600


percent Accuracy: 88.17%

Δ. Κάβουρας, Ph.D. 18 Μηχανική Μάθηση 04_22: Εποπτευόμενη Μάθηση I


Άσκηση 4

Χειρόγραφα:

1)Δίνονται δύο κατηγορίες (κλάσεις) που αποτελούνται από τα παρακάτω διανύσματα χαρακτηριστικών:

Κλάση 1: F1,1 = [5 , 7], F1,2 = [4 , 8], F1,3 = [6 , 7]


Κλάση 2: F2,1 = [2 , 5], F2,2 = [2 , 8], F2,3 = [2 , 6]
Να σχεδιαστεί ο ταξινομητής Ελάχιστης Απόστασης με τη βοήθεια των παραπάνω προτύπων, να
ταξινομηθεί το πρότυπο F = [3 , 8], και να σχεδιαστεί ο χώρος ταξινόμησης.

2)Δίνονται τρείς κατηγορίες (κλάσεις) που αποτελούνται από τα παρακάτω διανύσματα


χαρακτηριστικών:

Κλάση 1: F1,1 = [1,3], F1,2 = [-2,4], F1,3 = [-1,5]


Κλάση 2: F2,1 = [4 , 5], F2,2 = [4 , 8], F2,3 = [3 , 6]
Κλάση 3: F3,1 = [6 , 5], F2,2 = [7 , 8], F2,3 = [5 , 6]

Να σχεδιαστεί ο ταξινομητής Ελάχιστης Απόστασης με τη βοήθεια των παραπάνω δεδομένων, στη


συνέχεια να ταξινομηθεί το πρότυπο F = [4,9] και να σχεδιαστεί ο χώρος ταξινόμησης.

Κώδικας:

1)Να γραφεί κώδικας για να επιβεβαιωθούν τα αποτελέσματα των ερωτήσεων 1-2 ανωτέρω με
κατάλληλα προγράμματα σε python.
2)Έστω η ακόλουθη συνάρτηση δεδομένων. Ζητείται να δημιουργηθεί ένα ολοκληρωμένο πρόγραμμα σε
Python ώστε να ευρεθεί ο καλύτερος σχεδιασμός που να δίνει το υψηλότερο ποσοστό ακρίβειας
ταξινόμησης μεταξύ των 2 κατηγοριών
Πρέπει να εξετάσετε όλους τους δυνατούς συνδυασμούς χαρακτηριστικών ανά 2 και να απεικονίσετε το
διάγραμμα διασποράς (scatter diagram) του συνδυασμού χαρακτηριστικών που δίνει το υψηλότερο
ποσοστό ακρίβειας ταξινόμησης.
Χρησιμοποιήστε το ακόλουθο πρόγραμμα και συμπληρώστε τον απαραίτητο δικό σας κώδικα για τα
ανωτέρω.
import matplotlib.pyplot as plt
import numpy as np

def loadData():
featsNames=['mean','standard Deviation','skewness','kurtosis']
class1=[#Cervical cancer 5-years Non-survivors
[91.13, 22.355, 0.027635, 2.8102],
[90.575, 29.5, 0.58353, 2.5318],
[92.832, 28.751, 0.33067, 2.7629],
[88.181, 28.642, 0.27494, 2.4152],
[90.709, 30.939, 0.37855, 2.4851],
[104.05, 35.792, 0.52814, 2.7435],

Δ. Κάβουρας, Ph.D. 19 Μηχανική Μάθηση 04_22: Εποπτευόμενη Μάθηση I


[98.342, 36.193, 0.35172, 2.2441],
[99.269, 26.342, 0.1492, 2.5312],
[94.845, 31.323, 0.29206, 2.4237],
[161.65, 17.314, 0.54258, 2.4952],
[139.76, 19.887, 0.67346, 2.5673],
[146.79, 20.749, 0.59332, 2.5536],
[135.71, 21.629, 0.7011, 2.6016],
[132.78, 19.188, 0.68376, 2.6227],
[144.19, 19.955, 0.56923, 2.5648],
[137, 22.193, 0.62745, 2.5139],
[130.64, 20.973, 0.75887, 2.6656],
[138.88, 20.66, 0.63738, 2.7213],
[131.78, 22.323, 0.74514, 2.6985],
[132.77, 22.599, 0.7028, 2.6367],
[138.33, 21.06, 0.51725, 2.7121],
[142.46, 26.016, 0.57662, 2.4987],
[158.37, 22.355, 0.46325, 2.5201],
[132.62, 22.586, 0.72381, 2.7383],
[154.72, 21.404, 0.54958, 2.4043],
[140.22, 26.547, 0.54553, 2.4363],
[140.45, 25.769, 0.47033, 2.5039],
[138.71, 25.652, 0.58671, 2.5203],
[138.46, 25.098, 0.59268, 2.5743],
]
class2 =[#Cervical cancer 5-years survivors
[131.35, 38.58, 0.23894, 2.9015],
[164.11, 21.972, -0.0013328, 2.7228],
[150.05, 22.108, 0.085606, 2.8163],
[169.52, 22.394, 0.10823, 2.6467],
[159.44, 23.22, -0.0020959, 2.585],
[145.39, 16.517, 0.12471, 2.3972],
[108.82, 24.038, 0.2161, 2.3497],
[127.11, 22.186, 0.18473, 2.2985],
[130.45, 17.907, 0.42612, 2.5721],
[118.8 , 25.907 , 0.29538 , 2.6881],
[138.8 , 25.896 , 0.36752 , 2.5331],
[151.18, 18.881, 0.41188, 2.8039],
[156.28, 24.799, 0.13559, 2.4917],
[153.32, 29.878, 0.11923, 2.3113],
[140.85, 27.791, 0.27059, 2.3632],
[140.92, 29.667, 0.16173, 2.3855],
[137.01, 29.869, 0.18743, 2.397],
[147.71, 28.388, 0.054598, 2.4727],
[113.36, 29.952, 0.39364, 2.5637],
[123.92, 30.482, 0.23871, 2.4988],
[136.87, 23.505, 0.22786, 2.4613],
[136.36, 24.655, 0.19578, 2.4035],
[130.26, 27.7, 0.17439, 2.505],
[143.38, 26.278, 0.10052, 2.4845],
[138.7 , 26.622 , 0.31597, 2.3737],
[149.64, 24.757, 0.20055, 2.3103],

X=np.concatenate((class1, class2),axis=0)

Δ. Κάβουρας, Ph.D. 20 Μηχανική Μάθηση 04_22: Εποπτευόμενη Μάθηση I


nPat1=np.size(class1,0);nPat2=np.size(class2,0);
y=np.concatenate( (np.zeros(nPat1,int),np.ones(nPat2,int)),axis=0)
featsNames=np.asarray(featsNames)
return (X,y,featsNames)

from numpy import where


#------------------------------------------------------------------
def plot2dClusterScatterDiagram(X,y,Title,fNames):
nClasses=max(y)+1
for iClass in range(nClasses):
x= where(y == iClass)
plt.scatter(X[x, 0], X[x, 1])
plt.grid();plt.title(Title);
plt.xlabel(fNames[0]);plt.ylabel(fNames[1])
z=[]
for i in range(nClasses):
z=np.append(z,"class"+str(i+1))
plt.legend(z,loc='best')

#------------------------------------------------------------------
import warnings
warnings.simplefilter('ignore')#default
import moduleUtils as U
U.cls()

(X,y,fNames)=loadData()

from sklearn.neighbors import NearestCentroid


MDCmodel = NearestCentroid()

featCombs=[[0,1],[0,2],[0,3],[1,2],[1,3],[2,3]];
featCombs=np.asarray(featCombs)
nCombs=np.size(featCombs,0)
maxAcc=0
for feats in range(nCombs):
print(featCombs[feats])
# print(X[:,featCombs[i]])
X_train=X[:,featCombs[feats]]
y_train=y
y_test=[]
……………………………………………………….
…………………………………………………….

Δείγμα εξόδου του προγράμματος δίνεται ακολούθως:

Δ. Κάβουρας, Ph.D. 21 Μηχανική Μάθηση 04_22: Εποπτευόμενη Μάθηση I


[0 1]
correctly classified: 32 out of 55
percent Accuracy: 58.18%
['mean' 'standard Deviation']
[0 2]
correctly classified: 32 out of 55
percent Accuracy: 58.18%
[0 3]
correctly classified: 32 out of 55
percent Accuracy: 58.18%
[1 2]
correctly classified: 30 out of 55
percent Accuracy: 54.55%
[1 3]
correctly classified: 29 out of 55
percent Accuracy: 52.73%
[2 3]
correctly classified: 46 out of 55
percent Accuracy: 83.64%
['skewness' 'kurtosis']

Δ. Κάβουρας, Ph.D. 22 Μηχανική Μάθηση 04_22: Εποπτευόμενη Μάθηση I

You might also like