Professional Documents
Culture Documents
ΜΜ Διάλεξη 01 Python V2022 23
ΜΜ Διάλεξη 01 Python V2022 23
Διάλεξη 1η (Στατιστική)
Δ. Κάβουρας
(2022)
Εισαγωγικό Σημείωμα
Η Μηχανική Μάθηση (ΜΜ) είναι ένα διεθνώς αναγνωρισμένο επιστημονικό πεδίο, με
πολλές εφαρμογές, που έχει σαν αντικείμενο την ανάλυση, αναγνώριση, και κατηγοριοποίηση ή
ταξινόμηση κάποιας πληροφορίας (π.χ. σήμα, εικόνα, κείμενο κ.ά.) σε κάποια συγκεκριμένη
κατηγορία. Η ΜΜ έχει βρει πολλές εφαρμογές σε διάφορα επιστημονικά πεδία όπως στην
επιστήμη των υπολογιστών, στην ιατρική, στην βιολογία, στην ηλεκτρονική. Παραδείγματα
είναι η αναγνώριση ομιλίας, η αναγνώριση προσώπων, αναγνώριση χαρακτήρων κειμένου,
αναγνώριση και κατηγοριοποίηση κειμένου, αναγνώριση και κατηγοριοποίηση εικόνων όπως τα
δακτυλικά αποτυπώματα, οι πινακίδες κυκλοφορίας αυτοκινήτων κλπ.
Για την κατανόηση της ΜΜ θα γίνει πρώτα μία εισαγωγή στην Στατιστική Ανάλυση
δεδομένων, ώστε να εξηγηθούν μία σειρά από μέθοδοι που χρησιμοποιούνται από την ΜΜ. Θα
ακολουθήσουν κεφάλαια σε MM:
Εποπτευόμενη ΜΜ (Supervised Machine Learning),
Mη-Εποπτευόμενη ΜΜ (Unsupervised Machine Learning),
Ενισχυτική ΜΜ ( Reinforcement learning),
Βαθιά ΜΜ (Deep Learning)
Διάλεξη 1 2
Εισαγωγικό Σημείωμα 2
1.1. Εισαγωγή 13
1.2. Βασικές έννοιες στατιστικής 13
1.2.1 Η κανονική κατανομή 13
1.2.2. Η μέση τιμή (mean value) 14
1.2.3. Διακύμανση (variance) και τυπική απόκλιση (standard deviation) 15
1.2.4. Η διάμεσος (median) 16
1.2.5. Η επικρατούσα τιμή (mode) 16
1.2.6. Skewness 17
1.2.7. Kurtosis 17
Παράδειγμα 18
Ασκήσεις για το σπίτι 20
Μόλις εγκατασταθεί το Anaconda, αναζητήστε στο start windows τον Anaconda Navigator και κάνετε
κλικ το Anaconda Navigator
για να επιλέξετε για εγκατάσταση του Spyder για IDE και Editor, όπου θα αναπτύξουμε όλα τα
προγράμματα του μαθήματος. Το Spyder είναι σαν το IDE του Matlab, όπου έχουμε τον editor, το
command window κλπ
Επίσης, στην ακόλουθη διεύθυνση μπορείτε να κατεβάσετε το βιβλίο του Joel Grus, στην αγγλική
έκδοση, έως ότου λάβετε το βιβλίο μεταφρασμένο από τον Εύδοξο.
https://drive.google.com/drive/folders/1DVS4mWSDPU_9VoFD7yBOnaLIhGEuyXED?usp=sharing
2 If
# 2.============= use of if-elif-else========
def cls(): Output:
print(chr(27) + "[2J")
cls() BMI calculation
print("2.========== use of if-elif-else========\n"); BMI = 22.2 (Normal weight)
print('BMI calculation')
w = 80
h = 1.9
bmi = w / (h ** 2)
print('BMI = %.1f (' % bmi, end="")
if (bmi < 18.5):
print('Underweight', end="")
elif (bmi >= 18.5 and bmi < 25):
print('Normal weight', end="")
elif (bmi >= 25 and bmi < 30):
print('Overweight', end="")
else:
print('Obesity', end="")
print(')', end="")
3 for
def cls():
print(chr(27) + "[2J") Output:
# 3.============= for ========
cls() sin(0.00) = 0.000
import math sin(1.00) = 0.500
for x in range(0, 7):#every 1 step sin(2.00) = 0.866
act = x * math.pi / 6 sin(3.00) = 1.000
4 while
def cls():
print(chr(27) + "[2J") Output:
# 4.============= while ========
cls() ----while:
print("\n----while:\n") 5
n=5 4
while n > 0: 3
print('%3d' % n) 2
n=n-1 1
N=5
s=0 exam score? 2
for i in range(0, N): exam score? 4
x = int(input('exam score? ')) exam score? 5
while (x < 0 or x > 10): exam score? 6
print('ERROR: SCORES ALLOWED BETWEEN 0 AND 10.') exam score? 7
x = int(input('exam score?')) s= 24.00, mean score: 4.80
s=s+x
print('s= %5.2f, mean score: %.2f\n' % (s, s / N))
5 functions
# 5.============= use of functions========
def addition(a,b): Output:
y=a+b
return(y) 5.=========== use of functions ====
#-------------------------------
def subtraction(a,b): addition, y: 6
y1=subtraction(a, b)
print('subtraction, y:%f\n' % y1)
y=addition(a,b)+10
print('2nd addition, y:%2d\n' % y)
for i in range(N):
print('%3d ' % (x2[i]),end='')
print(': array x2')
x3=addition2(x1,x2,N)
for i in range(N):
print('%3.0f ' % (x3[i]),end='')
print(': array x3')
7. read/write files
#7.================read - write data files========
def cls(): Output:
print(chr(27) + "[2J")
#------------ main program------------------ 7.read - write data files=========
import numpy as np
cls() read from file: [ 2.1 4.3 6.5 18.7]
print('7.read - write data files=========\n')
N=4
x1=[2.1,4.3,6.5,18.7]
filename='file_a.txt'
np.savetxt(filename, x1,fmt='%4.1f')
xx=np.loadtxt(filename)
print("read from file:",xx)
fz=10;plt.figure(figsize=(fz,fz))
plt.subplot(3,1,1);plt.plot(x1[0:300],'r');plt.grid();plt.title(
'(a)First Signal');
plt.subplot(3,1,2);plt.plot(x2[0:300],'b');plt.grid();plt.title(
'(b)Second Signal');
plt.subplot(3,1,3);plt.plot(z[0:300],'g');plt.grid();plt.title('
(c)sum of Signals');
Η στατιστική γνώση προέρχεται κύρια από την πληροφορία που λαμβάνουμε από την επεξεργασία
ενός μικρού πλήθους αντιπροσωπευτικών μετρήσεων και κάνοντας γενίκευση επί του αποτελέσματος
που αφορά όλα τα δεδομένα. Είναι προφανές ότι όσο μικρότερο είναι το δείγμα των δεδομένων τόσο
μεγαλύτερο αναμένεται να είναι και το λάθος που υπεισέρχεται στο αποτέλεσμα. Για παράδειγμα, το
μέσο ύψος των παιδιών ηλικίας 5 ετών θα είναι πιο αντιπροσωπευτικό όσο περισσότερα παιδιά ληφθούν
υπόψη στην εκτίμηση του μέσου όρου.
Η στατιστική ανάλυση δεδομένων εξαρτάται από τον τρόπο με τον οποίο τα δεδομένα είναι
διατεταγμένα ή "κατανεμημένα" γύρω από την μέση τιμή. Από τις διαφορετικές κατανομές στη φύση η
κανονική κατανομή είναι η συχνότερη. Η γραφική παράσταση της κατανομής έχει σχήμα "καμπάνας",
στον οριζόντιο άξονα καταγράφονται οι τιμές της ποσότητας (π.χ. ύψος ή βάρος παιδιών, οι κατά κυβικό
αίματος τιμές των λευκών αιμοσφαιρίων κ.α.) και στον κάθετο άξονα η συχνότητα των μετρήσεων. Αυτή
η καμπύλη κατανομής ονομάζεται και ιστόγραμμα. Η καμπύλη είναι συμμετρική γύρω από τη μέγιστη
τιμή - η οποία επίσης είναι και η μέση τιμή όλων των μετρήσεων. Όσο απομακρυνόμαστε από το κέντρο
της καμπύλης τόσο μικρότερος είναι ο αριθμός των μετρήσεων.
Η μέση τιμή (mean value) είναι ο αριθμητικός μέσος όρος όλων των τιμών των δεδομένων και όσο
μεγαλύτερος είναι ο αριθμός των στοιχείων του δείγματος δεδομένων τόσο καλύτερα θεωρείται ότι
αντιπροσωπεύει την πραγματική μέση τιμή όλων των δεδομένων. Υπολογίζεται αθροίζοντας όλες τις
τιμές των στοιχείων των δεδομένων και διαιρώντας με τον συνολικό αριθμό των δεδομένων όπως στη
σχέση 2.1:
Παράδειγμα σε Python
Σε ξεχωριστό αρχείο στον ίδιο φάκελο με το κυρίως πρόγραμμα του project βάζουμε το ακόλουθο module
moduleUtils
import time
def cls():
print(chr(27) + "[2J")
def pause():
input("PRESS ENTER TO CONTINUE.")
# ------------------------------------------------------------
import numpy as np
import moduleUtils as U
#------------------------------------------------------------
#------------------------MAIN PROGRAM------------
#------------------------------------------------------------
U.cls()
PRESS ENTER TO CONTINUE.
t1=U.tic() mean value= 12.38
dat = [7,17,17,18,15,16,14,16,12,11,9,9,9,13,7,8] time taken: 3.585343e+00
meanValue=np.mean(dat)
U.pause()
print("mean value= %4.2f" % meanValue)
U.toc(t1,'time taken')
Η διακύμανση και η τυπική απόκλιση περιγράφουν τον βαθμό διασποράς των δεδομένων και είναι
χρήσιμες στατιστικές παράμετροι που μαζί με την μέση τιμή περιγράφουν συνοπτικά τα δεδομένα.
Διακύμανση: (1.2)
δηλαδή είναι η τετραγωνική ρίζα της διακύμανσης. Η τυπική απόκλιση είναι περισσότερο χρήσιμη και
δείχνει πόσο καλά η μέση τιμή του δείγματος δεδομένων αντιπροσωπεύει τα δεδομένα. Συνήθως η
έκφραση:
μ ± 2σ (1.4)
Παράδειγμα σε Python
import numpy as np
import moduleUtils as U
#--------- Main Program -------------------------------
U.cls()
dat = [7,17,17,18,15,16,14,16,12,11,9,9,9,13,7,8]
standardDeviation=np.std(dat,ddof=1)#ddof=1 --> divide by N-1 standard deviation= 3.86
print("standard deviation= %4.2f" % standardDeviation)
dat = [7,17,17,18,15,16,14,16,12,11,9,9,9,13,7,8]
sortedData=np.sort(dat,kind='quicksort')
medianValue=np.median(dat)#
print('sorted data:',end='');print(sortedData)
print("median= %4.2f" % medianValue)
Παράδειγμα σε Python
1.2.6. Skewness
Η Skewness υπολογίζει την ασυμμετρία της κατανομής των δεδομένων
(1.5)
Υπολογισμός Skewness σε Python
dat = [7,17,17,18,15,16,14,16,12,11,9,9,9,13,7,8]
Skew=stats.skew(dat)
print("skewness= %4.8f" % Skew)
1.2.7. Kurtosis
(1.6)
Kurtosis υπολογίζει την οξύτητα της κατανομής των δεδομένων.
dat = [7,17,17,18,15,16,14,16,12,11,9,9,9,13,7,8]
Kurt=stats.kurtosis(dat, fisher=False)
print("kurtosis= %4.8f" % Kurt)
(1) δίνονται 2 κατηγορίες δεδομένων, με μετρήσεις από ιστοπαθολογικές εικόνες χαμηλού βαθμού
κακοήθειας της θυρεοειδούς (12 εικόνες με 4 μετρήσεις παραμέτρων από κάθε εικόνα) και
υψηλού βαθμού κακοήθειας θυρεοειδούς (8 εικόνες με 4 μετρήσεις ίδιων παραμέτρων από κάθε
εικόνα)
(2) Σχεδιάζονται διαγράμματα Boxplots για την σύγκριση διασποράς τιμών κάθε παραμέτρου και
στις 2 κατηγορίες
(3) Σχεδιάζονται διαγράμματα διασποράς (scatter-diagrams) από συνδυασμούς παραμέτρων ανά δύο
για την εκτίμηση της μεταξύ των 2 κατηγοριών απόστασης.
Ακολουθεί το πρόγραμμα σε Python
import numpy as np
import moduleUtils as U x:
[array([101.4059, 96.417234, 101.77324, 105.82766, 96.609977, 95.732426,
from scipy import stats 106.46485, 100.84354, 94.75737, 101.40363, 95.011338, 107.06349],
import matplotlib.pyplot as plt dtype=object)
array([133.73923, 159.41723, 153.46939, 137.89569, 148.67574, 135.03175,
#----------------------------------------------- 118.24717, 149.0], dtype=object)]
-------------
#------------------------MAIN
PROGRAM------------
#-----------------------------------------------
-------------
#--------- Main Program -------------------------------
def loadData():
featsNames = ['mean', 'standard Deviation', 'skewness', 'kurtosis']
class1 = [ # microscopy images of thyroid HighGrade Ca
[1.0140590e+002, 2.4890069e+001, -2.3645176e+000, 1.1033644e+001],
[9.6417234e+001, 1.1293169e+001, 6.3933109e-001, 3.5952700e+000],
[1.0177324e+002, 1.3331575e+001, 3.4772438e-002, 2.4784380e+000],
[1.0582766e+002, 3.2911649e+001, -2.5222501e+000, 8.5839875e+000],
[9.6609977e+001, 2.6311018e+001, -2.5111029e+000, 1.0150649e+001], x:
[array([24.890069, 11.293169, 13.331575, 32.911649, 26.311018, 34.333446,
[9.5732426e+001, 3.4333446e+001, -2.1224260e+000, 6.4232475e+000], 26.878146, 25.160086, 15.050259, 32.966146, 36.435665, 22.804613],
[1.0646485e+002, 2.6878146e+001, -3.1294014e+000, 1.2943794e+001], dtype=object)
array([27.821304, 13.909101, 15.239869, 19.026012, 17.888584, 30.651488,
[1.0084354e+002, 2.5160086e+001, -2.4882562e+000, 1.0920485e+001], 17.126186, 12.495804], dtype=object)]
[9.4757370e+001, 1.5050259e+001, -1.9093679e+000, 1.5656505e+001],
[1.0140363e+002, 3.2966146e+001, -2.3164752e+000, 7.6172933e+000],
[9.5011338e+001, 3.6435665e+001, -1.8316196e+000, 5.4124896e+000],
[1.0706349e+002, 2.2804613e+001, -3.4189256e+000, 1.6718555e+001]
]
class2 = [ # microscopy images of thyroid LowGrade Ca
[1.3373923e+002, 2.7821304e+001, -1.5974506e+000, 9.6610652e+000],
[1.5941723e+002, 1.3909101e+001, -3.5988430e-001, 2.8787984e+000],
[1.5346939e+002, 1.5239869e+001, -5.0287213e-001, 2.7473837e+000],
[1.3789569e+002, 1.9026012e+001, -1.4600956e+000, 1.4682993e+001],
U.cls()
(class1, class2, fNames) = loadData()
N1patts = np.size(class1, 0) x:
N2patts = np.size(class2, 0) [array([-2.3645176, 0.63933109, 0.034772438, -2.5222501, -2.5111029,
nFeats = np.size(class1, 1) -2.122426, -3.1294014, -2.4882562, -1.9093679, -2.3164752,
-1.8316196, -3.4189256], dtype=object)
print(N1patts, ' ', N2patts, ' ', nFeats) array([-1.5974506, -0.3598843, -0.50287213, -1.4600956, 0.25696968,
-3.1318618, -0.062786366, 0.063691434], dtype=object)]
print('-----------------class1---------------')
class1 = np.asarray(class1,dtype=object)
class2 = np.asarray(class2,dtype=object)
# BOX-PLOTS
# https://matplotlib.org/3.1.3/api/_as_gen/matplotlib.pyplot.boxplot.html
for j in range(nFeats):
x = [class1[:, j], class2[:, j]]
x=np.asarray(x,dtype=object)
print("x: ");print(x)
plt.figure()
plt.boxplot(x, labels=('Low Grade', 'High Grade'))
plt.title(fNames[j])
plt.grid() x:
plt.show() [array([11.033644, 3.59527, 2.478438, 8.5839875, 10.150649, 6.4232475,
12.943794, 10.920485, 15.656505, 7.6172933, 5.4124896, 16.718555],
for j in range(nFeats - 1): dtype=object)
plt.figure() array([9.6610652, 2.8787984, 2.7473837, 14.682993, 2.6647207, 14.742417,
8.7437947, 2.9861096], dtype=object)]
dat1 = class1[:, j]
dat2 = class1[:, j + 1]
plt.plot(dat1, dat2, 'o', color='b')
dat1 = class2[:, j]
dat2 = class2[:, j + 1]
plt.plot(dat1, dat2, 'x', color='r')
plt.grid()
plt.legend(('Low Grade', 'High Grade'), loc='best')
plt.xlabel(fNames[j])
plt.ylabel(fNames[j + 1])
plt.title('Scatter diagram of : ' + fNames[j] + ' Vs ' + fNames[j + 1])
plt.show()
Κώδικας:
Έστω οι τιμές 4 παραμέτρων 2 κατηγοριών ιστοπαθολογικής εξέτασης για καρκίνο μήτρας (επιβιώσαντες
/ μη επιβιώσαντες 5ετίας). Ζητείται να ευρεθεί αν υπάρχουν παράμετροι ή συνδυασμός παραμέτρων ανά
δύο που να διαχωρίζουν καλύτερα τις 2 αυτές κατηγορίες, με οπτική εκτίμηση του αποτελέσματος.
def loadData1():
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],
[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],
return (class1,class2,featsNames)