#!/usr/bin/env python # coding: utf-8 # # Klasifikátory a analýza pohybu # Několik typů klasifikátorů: # # * Nejbližší soused (KNN) # * Bayessův klasifikátor # * Support Vector Machine (SVM) # # Dva základní typy učení: # # * S učitelem (Supervised learning) # * Bez učitele (Unsupervised learning) # # ## Klasifikátory v Pythonu # Dobrým pomocníkem je balík [scikits-learn (sklearn)](http://scikit-learn.org/dev/user_guide.html). # In[5]: get_ipython().run_line_magic('pylab', 'inline --no-import-all') from sklearn import datasets import numpy as np import sklearn.model_selection # ## Kosatec # Načtení trénovacích dat. Jde o kosatec (iris flower) a jeho tři poddruhy: Iris setosa, # Iris versicolor, Iris virginica. Měří se délka kalichu, šířka kalichu, délka okvětního lístku a šířka okvětního lístku. # # ![iris](http://scipy-lectures.github.io/_images/Virginia_Iris.png) # In[14]: iris = datasets.load_iris() # cílové třídy # rozměry dat print("data ", iris.data.shape) print(iris.data[-10:,:]) print("") print("target", iris.target.shape) print(np.unique(iris.target)) print(iris.target[-10:]) # ## Klasifikátor podle K-nejbližšího souseda # Nejbližší soused # ![NN](http://www.kky.zcu.cz/uploads/courses/zdo/lesson8/5.jpg) # # K - nejbližší soused # ![KNN](http://www.kky.zcu.cz/uploads/courses/zdo/lesson8/6.jpg) # # Počítání minimální vzdálenosti # ![minimální vzdálenost](http://www.kky.zcu.cz/uploads/courses/zdo/lesson8/7.jpg) # # In[3]: from sklearn import neighbors knn = neighbors.KNeighborsClassifier() knn.fit(iris.data, iris.target) #KNeighborsClassifier(...) predikce = knn.predict([[0.1, 0.2, 0.3, 0.4]]) print predikce #array([0]) # ![knn_classif](http://scipy-lectures.github.io/_images/iris_knn.png) # ## Trénovací a testovací sada # Při experimentování je důležité rozdělit data na trénovací a testovací sadu. # In[4]: perm = np.random.permutation(iris.target.size) iris.data = iris.data[perm] iris.target = iris.target[perm] train_data = iris.data[:100] train_target = iris.target[:100] test_data = iris.data[100:] test_target = iris.target[100:] knn.fit(train_data, train_target) knn.score(test_data, test_target) # ## Bayessův klasifikátor # $$P(x_i \mid y) = \frac{1}{\sqrt{2\pi\sigma^2_y}} \exp\left(-\frac{ (x_i - \mu_y)^2}{2\pi\sigma^2_y}\right)$$ # In[5]: import sklearn.naive_bayes gnb = sklearn.naive_bayes.GaussianNB() gnb.fit(train_data, train_target) y_pred = gnb.predict(test_data) print("Number of mislabeled points : %d" % (test_target != y_pred).sum()) # ## SVM klasifikátor # Rozděluje data nadrovinou # # ![svm](http://scipy-lectures.github.io/_images/svm_margin.png) # In[6]: from sklearn import svm svc = svm.SVC() svc.fit(train_data, train_target) y_pred = svc.predict(test_data) print("Number of mislabeled points : %d" % (test_target != y_pred).sum()) # ## Učení bez učitele # Cílem je rodělit obrazy bez další informace do skupin - shluků # # Vstup # ![bez ucitele vstup](http://www.kky.zcu.cz/uploads/courses/zdo/lesson8/2.jpg) # # výstup # ![kmeans výstup](http://www.kky.zcu.cz/uploads/courses/zdo/lesson8/3.jpg) # # Pro jednoduché případy lze použít algoritmus K-Means. Pro složitější natrénování Bayessova klasifikátoru je využíván EM-algoritmus. # # Příklad klasifikace # # Klasifikovat objekty v obraze # # ![kmeans výstup](https://raw.githubusercontent.com/mjirik/ZDO/master/objekty/05.jpg) # # ## Trénovací data # # https://raw.githubusercontent.com/mjirik/ZDO/master/objekty/ctverce_hvezdy_kolecka.jpg # # ## Testovací data # # https://raw.githubusercontent.com/mjirik/ZDO/master/objekty/01.jpg # # https://raw.githubusercontent.com/mjirik/ZDO/master/objekty/02.jpg # # ... # # https://raw.githubusercontent.com/mjirik/ZDO/master/objekty/16.jpg # # https://raw.githubusercontent.com/mjirik/ZDO/master/objekty/17.jpg # # In[4]: import scipy import urllib import cStringIO import skimage import skimage.color import skimage.filter import skimage.measure import skimage.io from sklearn import svm # URL = "http://uc452cam01-kky.fav.zcu.cz/snapshot.jpg" URL = "https://raw.githubusercontent.com/mjirik/ZDO/master/objekty/ctverce_hvezdy_kolecka.jpg" img = skimage.io.imread(URL, as_grey=True) plt.imshow(img) # doporučený klasifikátor ... # pozor na labeling a "+1 problém" # ### ukázka řešení # v notes # ## Titanic # ![iris](http://cdn.history.com/sites/2/2014/01/titanic-P.jpeg) # # ### VARIABLE DESCRIPTIONS # # [Description](http://campus.lakeforest.edu/frank/FILES/MLFfiles/Bio150/Titanic/TitanicMETA.pdf) # # * [Pclass] Passenger Class (1 = 1st; 2 = 2nd; 3 = 3rd) # * [survival] Survival (0 = No; 1 = Yes) # * name Name # * sex Sex # * age Age # * sibsp Number of Siblings/Spouses Aboard # * parch Number of Parents/Children Aboard # * ticket Ticket Number # * fare Passenger Fare (British pound) # * cabin Cabin # * embarked Port of Embarkation (C = Cherbourg; Q = Queenstown; S = Southampton) # * boat Lifeboat # * body Body Identification Number # * home.dest Home/Destination # # ### SPECIAL NOTES # # * Pclass is a proxy for socio-economic status (SES) # 1st ~ Upper; 2nd ~ Middle; 3rd ~ Lower # # * Age is in Years; Fractional if Age less than One (1) # If the Age is estimated, it is in the form xx.5 # # * Fare is in Pre-1970 British Pounds () # Conversion Factors: 1 = 12s = 240d and 1s = 20d # # [Kaggle - Titanic: Machine Learning from Disaster](https://www.kaggle.com/c/titanic) # In[ ]: # In[55]: import pandas as pd import seaborn as sns titanic = sns.load_dataset("titanic") titanic # ### Analýza obsahu # In[62]: titanic["psex"] = titanic["sex"] == "male" # In[83]: sns.factorplot(x="sex", kind="count", data=titanic) # In[80]: sns.factorplot(x="class", hue="sex", kind="count", data=titanic) # In[82]: g = sns.factorplot(x="class", y="survived", hue="sex", data=titanic, kind="bar")# ,size=6 , palette="muted") g.despine(left=True) g.set_ylabels("survival probability") # In[88]: fg = sns.FacetGrid(titanic, hue="sex", aspect=3) fg.map(sns.kdeplot, "age", shade=True) fg.add_legend() fg.set(xlim=(0, 80)); # In[87]: fg = sns.FacetGrid(titanic, hue="class", aspect=3, palette="BuPu_d") fg.map(sns.kdeplot, "age", shade=True) fg.set(xlim=(0, 80)); fg.add_legend() # ### Klasifikátor # In[44]: titanic_drp = titanic[["pclass", "age", "survived"]].dropna(how="any") X = titanic_drp[["pclass", "age"]] y = titanic_drp[["survived"]] X_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split(X, y, test_size=0.33, random_state=42) import sklearn.naive_bayes gnb = sklearn.naive_bayes.GaussianNB() gnb.fit(X_train, y_train) # #KNeighborsClassifier(...) y_pred = gnb.predict(X_test) y_pred # [Precision and recall](https://en.wikipedia.org/wiki/Precision_and_recall) # In[40]: print (sklearn.metrics.classification_report(y_test, y_pred)) # In[41]: print (sklearn.metrics.confusion_matrix(y_test, y_pred)) # ## včetně pohlaví # In[45]: titanic_drp = titanic[["pclass", "age", "psex", "survived"]].dropna(how="any") X = titanic_drp[["pclass", "age", "psex"]] y = titanic_drp[["survived"]] X_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split(X, y, test_size=0.33, random_state=42) import sklearn.naive_bayes gnb = sklearn.naive_bayes.GaussianNB() gnb.fit(X_train, y_train) # #KNeighborsClassifier(...) y_pred = gnb.predict(X_test) print (sklearn.metrics.classification_report(y_test, y_pred)) # # Analýza pohybu # ![im](http://www.kky.zcu.cz/uploads/courses/zdo/lesson8/12.jpg) # ![im](http://www.kky.zcu.cz/uploads/courses/zdo/lesson8/11.jpg) # # rozdílový obraz # # ![im](http://www.kky.zcu.cz/uploads/courses/zdo/lesson8/9.jpg) # # kumulativní obraz # # ![im](http://www.kky.zcu.cz/uploads/courses/zdo/lesson8/10.jpg) # # # Klíčové body # # ![im](http://www.kky.zcu.cz/uploads/courses/zdo/lesson8/8.jpg) # # # # ## Tracking # * detekce # * sledování # # http://openeuroscience.com/software/computer-vision-and-motion-tracking-software/