Professional Documents
Culture Documents
ΜΜ Διάλεξη 04 Python 2022
ΜΜ Διάλεξη 04 Python 2022
(Machine Learning)
Διάλεξη 4η
Δ. Κάβουρας
(2022)
4.1 Εισαγωγή 3
4.2. ΤΑΞΙΝΟΜΗΣΗ (Classification) 4
4.2.1. Ταξινομητής ελάχιστης απόστασης 4
Παράδειγμα 1: 6
4.2.2. Ταξινομητής ελάχιστης ευκλείδειας απόστασης για 2 ή περισσότερες κατηγορίες 7
Παράδειγμα 2: 8
Παράδειγμα 3: 12
Άσκηση 4 18
Ο ταξινομητής είναι ένας αλγόριθμος λήψης αποφάσεων, που έχει σχεδιασθεί να ταξινομεί ένα
διάνυσμα χαρακτηριστικών σε μία από Ci (i=1,2,3…) κατηγορίες.
Υπερηχογραφική εικόνα από ήπαρ με κίρρωση Υπερηχογραφική εικόνα από ήπαρ με λιπώδη
διήθηση.
καθώς και ένα εργαλείο λογισμικού για να απεικονίζουμε τις εικόνες αλλά και να παίρνουμε δείγματα
από τις εικόνες, δηλαδή δείγματα από περιοχές ενδιαφέροντος ή ROIs (Regions Of Interest).
bisector
5
M1
4.3
BM1 BM 2
b
B= 1
b
2
1
M2
4
X
Η σχεδίαση του ταξινομητή προϋποθέτει την ύπαρξη ενός συνόλου διανυσμάτων F i,j γνωστής
ταξινόμησης, που θα ονομάζουμε σχεδιαστικό ή εκπαιδευτικό σετ (training set). Έστω:
Κατηγορία 1: , ,
Κατηγορία 2: , ,
Αν τα διανύσματα σχεδιασθούν στο πεδίο χαρακτηριστικών f 1-f2, τότε όπως γίνεται αντιληπτό από το
σχήμα τα διανύσματα καθορίζουν δύο ξεχωριστούς χώρους, ένα για κάθε κατηγορία, με διανύσματα
μέσων τιμών
και
γραμμής. Κάθε νέο διάνυσμα ταξινομείται στην κατηγορία 1 ή 2 αν η θέση του στο f 1-f2 πεδίο
είναι αριστερά ή δεξιά της μεσοκαθέτου. Αν ευρίσκεται επί της μεσοκαθέτου τότε το Χ διάνυσμα
θεωρείται ότι δεν μπορεί να ταξινομηθεί.
και
g( F )=8 b 1 +0 . 6 b2 −26 . 49
Έστω δύο διανύσματα και αγνώστου κατηγορίας, αλλά ανήκοντα σε μία από τις
δύο συγκεκριμένες κατηγορίες. Αντικαθιστώντας στην g(F) παίρνουμε:
Εξετάζοντας τα αποτελέσματα διαπιστώνεται ότι όταν η g(F 1) είναι μεγαλύτερη του μηδενός τότε
ευρίσκεται αριστερά της μεσοκαθέτου και επομένως ταξινομείται στην κατηγορία 1 και αν ευρίσκεται
δεξιά της μεσοκαθέτου ανήκει στην κατηγορία 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 τις τιμές του δείγματος
(προτύπου), και ταξινομούμε το Χ στην κατηγορία με την μεγαλύτερη τιμή.
Δίνονται δύο κατηγορίες (κλάσεις) που αποτελούνται από τα παρακάτω διανύσματα χαρακτηριστικών:
Απάντηση:
=5+40-0.5*(50)=5+15=20.
=1+16-0.5*5=14.5
3) Το Χ=[1,8] ταξινομείται στην g με την μεγαλύτερη τιμή άρα ταξινομείται στην κατηγορία 1.
4) Ακολουθεί η γραφική παράσταση
import numpy as np
import matplotlib.pyplot as plt
# --------------------------------------------
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.]
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])
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]
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)
ΕΞΟΔΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ:
pattern X= [[1 8]] is classified to class 1
#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)
Δίνονται τρείς κατηγορίες (κλάσεις) που αποτελούνται από τα παρακάτω διανύσματα χαρακτηριστικών:
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
import numpy as np
import matplotlib.pyplot as plt
import moduleUtils as U
U.cls()
class1 = [[0, 3], [-1, 3], [-2, 3], [-3, 3], [-4, 3]] # Let a 2
plt.plot((xPatt[0], meanClass1[0]),
Ακολούθως, το ανωτέρω πρόγραμμα επεκτείνεται κάνοντας χρήση της βιβλιοθήκης 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;
return(X,y,fNames)
#----------------------------------------------------------------------
#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)
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)
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()
Χειρόγραφα:
1)Δίνονται δύο κατηγορίες (κλάσεις) που αποτελούνται από τα παρακάτω διανύσματα χαρακτηριστικών:
Κώδικας:
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],
X=np.concatenate((class1, class2),axis=0)
#------------------------------------------------------------------
import warnings
warnings.simplefilter('ignore')#default
import moduleUtils as U
U.cls()
(X,y,fNames)=loadData()
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=[]
……………………………………………………….
…………………………………………………….