Rozpoznávání obrázků s knihovnou scikit-learn

10. 10. 2024
Doba čtení: 48 minut

Sdílet

 Autor: Depositphotos
Ukážeme si jeden ze způsobů rozpoznání rastrových obrázků. Použijeme obrázky s rozlišením pouze 8×8 pixelů, které lze reprezentovat vektorem s 64 prvky. Takto krátké vektory můžeme využít pro trénink různých modelů.

Obsah

1. Rozpoznávání obrázků s knihovnou scikit-learn

2. Rozpoznání ručně napsaných číslic

3. Datová sada obsahující naskenované ručně napsané číslice

4. Metadata a očekávané výsledky z datové sady Digits

5. Přečtení a následné vyobrazení jednotlivých ručně nakreslených číslic

6. Rozpoznání číslic modelem provádějícím logistickou regresi

7. Výsledky rozpoznání číslic modelem logistické regrese

8. Využití modelu SVM (metoda podpůrných vektorů) pro klasifikaci obrázků

9. Výsledky rozpoznání číslic metodou podpůrných vektorů

10. Využití modelu pro hledání K nejbližších sousedů

11. Výsledky rozpoznání číslic modelem hledajícím K nejbližších sousedů

12. Rozpoznání rastrových obrázků neuronovou sítí

13. Výsledky rozpoznání číslic neuronovou sítí

14. Zobrazení původních obrázků i predikovaných výsledků ve vizuální podobě

15. Zobrazení těch číslic, u nichž se model spletl

16. Graf s číslicemi, které nebyly správně rozeznány

17. Zobrazení číslic, které nebyly korektně rozeznány neuronovou sítí

18. Číslice, které nebyly rozpoznány neuronovou sítí

19. Repositář s demonstračními příklady

20. Odkazy na Internetu

1. Rozpoznávání obrázků s knihovnou scikit-learn

V dnešním pokračování seriálu o knihovně scikit-learn si ukážeme jeden ze způsobů rozpoznání rastrových obrázků. Použijeme přitom obrázky s velmi malým rozlišením 8×8 pixelů, které lze reprezentovat vektorem s 64 prvky. A takto relativně malé vektory je možné použít pro trénink různých typů modelů – od modelu logistické regrese až po sofistikovanou neuronovou síť. Ovšem současně se nám také ukazují limity tohoto způsobu práce s modely, protože zpracování rastrových dat je dosti specifické – dochází totiž k posunům, popř. rotacím, což ve výsledku vede k tomu, že se modely (i když dobře natrénované) mohou při rozpoznávání obrázků mýlit.

2. Rozpoznání ručně napsaných číslic

Úkol, který budeme dnes řešit, je následující: máme k dispozici sadu obrázků s rozlišením 8×8 pixelů, na nichž jsou ručně napsané číslice, někdy čitelně, jindy dost nečitelně. Našim úkolem bude natrénovat vhodný model s vhodně nastavenými hyperparametry tak, aby dokázal rozpoznat číslici. Bude se tedy jednat o model provádějící klasifikaci, jehož výsledkem je symbol 0, 1, 2, … 9. Vstupní matice X bude obsahovat N vektorů s 64 prvky (což je „zploštělá“ matice 8×8 pixelů) a vstupní vektor y bude obsahovat hodnoty 0, 1, 2… odpovídající rastrovému obrázku číslice reprezentovaného oněmi 64prvkovými vektory.

Poznámka: model samozřejmě natrénujeme s využitím pouze části datové sady. Zbytek bude použit pro otestování modelu. Konkrétně použijeme 80% dat na trénink a zbývajících 20% na otestování.

V knihovně scikit-learn máme k dispozici datovou sadu s naskenovanými číslicemi, která vznikla z databáze MNIST. Dnes použijeme tuto sadu, příště však již budeme rozpoznávat odlišné objekty na obrázcích z databáze CIFAR.

3. Datová sada obsahující naskenované ručně napsané číslice

Víme již, že trénovací i testovací (či verifikační) sada s ručně nakreslenými a naskenovanými číslicemi je přímo součástí balíčku Scikit-learn. Načíst ji můžeme funkcí load_digits z podbalíčku sklearn.datasets, což je koncept, který již velmi dobře známe z dalších datových sad, tedy konkrétně z datové sady Iris a California Housings. Hodnotou, kterou po načtení získáme, je datová struktura s metadaty, vektory s obrázkem (viz další text), maticemi představujícími obrázky, i vektorem s očekávanými číslicemi. V dalším skriptu si ukážeme, jakým způsobem je možné některá vrácená metadata a data zpracovat:

#!/usr/bin/env python
 
# import funkce, která vrátí obrázky pro práci
from sklearn.datasets import load_digits
 
# načtení obrázků, s nimiž budeme dále pracovat
digits_data = load_digits()
 
# zjištění základních informací o obrázcích
print("Description:", digits_data.DESCR)
 
print("Data:", digits_data.data.shape)
print("Obrázky:", digits_data.images.shape)
 
# výpis informací o obrázcích
for i in range(0, 10):
    print(f"Image #{i}:")
    print("Data:\n", digits_data.data[i])
    print("Image:\n", digits_data.images[i])
    print("Target:\n", digits_data.target[i])
    print()
 
# finito

Nejprve si tímto skriptem necháme zobrazit popis dat a metadat – což jsou informace obsažené v atributu DESCR:

Description: .. _digits_dataset:
 
Optical recognition of handwritten digits dataset
--------------------------------------------------
 
**Data Set Characteristics:**
 
    :Number of Instances: 1797
    :Number of Attributes: 64
    :Attribute Information: 8x8 image of integer pixels in the range 0..16.
    :Missing Attribute Values: None
    :Creator: E. Alpaydin (alpaydin '@' boun.edu.tr)
    :Date: July; 1998
 
This is a copy of the test set of the UCI ML hand-written digits datasets
https://archive.ics.uci.edu/ml/datasets/Optical+Recognition+of+Handwritten+Digits
 
The data set contains images of hand-written digits: 10 classes where
each class refers to a digit.
 
Preprocessing programs made available by NIST were used to extract
normalized bitmaps of handwritten digits from a preprinted form. From a
total of 43 people, 30 contributed to the training set and different 13
to the test set. 32x32 bitmaps are divided into nonoverlapping blocks of
4x4 and the number of on pixels are counted in each block. This generates
an input matrix of 8x8 where each element is an integer in the range
0..16. This reduces dimensionality and gives invariance to small
distortions.
 
For info on NIST preprocessing routines, see M. D. Garris, J. L. Blue, G.
T. Candela, D. L. Dimmick, J. Geist, P. J. Grother, S. A. Janet, and C.
L. Wilson, NIST Form-Based Handprint Recognition System, NISTIR 5469,
1994.
 
|details-start|
**References**
|details-split|
 
- C. Kaynak (1995) Methods of Combining Multiple Classifiers and Their
  Applications to Handwritten Digit Recognition, MSc Thesis, Institute of
  Graduate Studies in Science and Engineering, Bogazici University.
- E. Alpaydin, C. Kaynak (1998) Cascading Classifiers, Kybernetika.
- Ken Tang and Ponnuthurai N. Suganthan and Xi Yao and A. Kai Qin.
  Linear dimensionalityreduction using relevance weighted LDA. School of
  Electrical and Electronic Engineering Nanyang Technological University.
  2005.
- Claudio Gentile. A New Approximate Maximal Margin Classification
  Algorithm. NIPS. 2000.
 
|details-end|

V rámci dalšího kroku jsou zobrazeny rozměry (resp. přesněji řečeno tvary) n-rozměrných polí uložených v atributech nazvaných data a images:

Data: (1797, 64)
Obrázky: (1797, 8, 8)

Ze zobrazených zpráv vidíme, že se vlastně (jedna z možných interpretací) jedná o 1797 64prvkových vektorů, resp. o 1797 dvourozměrných matic 8×8 prvků, což je ve skutečnosti jen odlišný pohled na ony 64prvkové vektory (modely budeme učit na jednorozměrných vektorech, pro zobrazení obrázků naopak použijeme dvourozměrné matice).

Dále si skriptem necháme zobrazit prvních 10 vektorů i prvních 10 dvourozměrných matic:

Image #0:
Data:
 [ 0.  0.  5. 13.  9.  1.  0.  0.  0.  0. 13. 15. 10. 15.  5.  0.  0.  3.
 15.  2.  0. 11.  8.  0.  0.  4. 12.  0.  0.  8.  8.  0.  0.  5.  8.  0.
  0.  9.  8.  0.  0.  4. 11.  0.  1. 12.  7.  0.  0.  2. 14.  5. 10. 12.
  0.  0.  0.  0.  6. 13. 10.  0.  0.  0.]
Image:
 [[ 0.  0.  5. 13.  9.  1.  0.  0.]
 [ 0.  0. 13. 15. 10. 15.  5.  0.]
 [ 0.  3. 15.  2.  0. 11.  8.  0.]
 [ 0.  4. 12.  0.  0.  8.  8.  0.]
 [ 0.  5.  8.  0.  0.  9.  8.  0.]
 [ 0.  4. 11.  0.  1. 12.  7.  0.]
 [ 0.  2. 14.  5. 10. 12.  0.  0.]
 [ 0.  0.  6. 13. 10.  0.  0.  0.]]
Target:
 0
 
Image #1:
Data:
 [ 0.  0.  0. 12. 13.  5.  0.  0.  0.  0.  0. 11. 16.  9.  0.  0.  0.  0.
  3. 15. 16.  6.  0.  0.  0.  7. 15. 16. 16.  2.  0.  0.  0.  0.  1. 16.
 16.  3.  0.  0.  0.  0.  1. 16. 16.  6.  0.  0.  0.  0.  1. 16. 16.  6.
  0.  0.  0.  0.  0. 11. 16. 10.  0.  0.]
Image:
 [[ 0.  0.  0. 12. 13.  5.  0.  0.]
 [ 0.  0.  0. 11. 16.  9.  0.  0.]
 [ 0.  0.  3. 15. 16.  6.  0.  0.]
 [ 0.  7. 15. 16. 16.  2.  0.  0.]
 [ 0.  0.  1. 16. 16.  3.  0.  0.]
 [ 0.  0.  1. 16. 16.  6.  0.  0.]
 [ 0.  0.  1. 16. 16.  6.  0.  0.]
 [ 0.  0.  0. 11. 16. 10.  0.  0.]]
Target:
 1
 
Image #2:
Data:
 [ 0.  0.  0.  4. 15. 12.  0.  0.  0.  0.  3. 16. 15. 14.  0.  0.  0.  0.
  8. 13.  8. 16.  0.  0.  0.  0.  1.  6. 15. 11.  0.  0.  0.  1.  8. 13.
 15.  1.  0.  0.  0.  9. 16. 16.  5.  0.  0.  0.  0.  3. 13. 16. 16. 11.
  5.  0.  0.  0.  0.  3. 11. 16.  9.  0.]
Image:
 [[ 0.  0.  0.  4. 15. 12.  0.  0.]
 [ 0.  0.  3. 16. 15. 14.  0.  0.]
 [ 0.  0.  8. 13.  8. 16.  0.  0.]
 [ 0.  0.  1.  6. 15. 11.  0.  0.]
 [ 0.  1.  8. 13. 15.  1.  0.  0.]
 [ 0.  9. 16. 16.  5.  0.  0.  0.]
 [ 0.  3. 13. 16. 16. 11.  5.  0.]
 [ 0.  0.  0.  3. 11. 16.  9.  0.]]
Target:
 2
...
...
...
Image #8:
Data:
 [ 0.  0.  9. 14.  8.  1.  0.  0.  0.  0. 12. 14. 14. 12.  0.  0.  0.  0.
  9. 10.  0. 15.  4.  0.  0.  0.  3. 16. 12. 14.  2.  0.  0.  0.  4. 16.
 16.  2.  0.  0.  0.  3. 16.  8. 10. 13.  2.  0.  0.  1. 15.  1.  3. 16.
  8.  0.  0.  0. 11. 16. 15. 11.  1.  0.]
Image:
 [[ 0.  0.  9. 14.  8.  1.  0.  0.]
 [ 0.  0. 12. 14. 14. 12.  0.  0.]
 [ 0.  0.  9. 10.  0. 15.  4.  0.]
 [ 0.  0.  3. 16. 12. 14.  2.  0.]
 [ 0.  0.  4. 16. 16.  2.  0.  0.]
 [ 0.  3. 16.  8. 10. 13.  2.  0.]
 [ 0.  1. 15.  1.  3. 16.  8.  0.]
 [ 0.  0. 11. 16. 15. 11.  1.  0.]]
Target:
 8
 
Image #9:
Data:
 [ 0.  0. 11. 12.  0.  0.  0.  0.  0.  2. 16. 16. 16. 13.  0.  0.  0.  3.
 16. 12. 10. 14.  0.  0.  0.  1. 16.  1. 12. 15.  0.  0.  0.  0. 13. 16.
  9. 15.  2.  0.  0.  0.  0.  3.  0.  9. 11.  0.  0.  0.  0.  0.  9. 15.
  4.  0.  0.  0.  9. 12. 13.  3.  0.  0.]
Image:
 [[ 0.  0. 11. 12.  0.  0.  0.  0.]
 [ 0.  2. 16. 16. 16. 13.  0.  0.]
 [ 0.  3. 16. 12. 10. 14.  0.  0.]
 [ 0.  1. 16.  1. 12. 15.  0.  0.]
 [ 0.  0. 13. 16.  9. 15.  2.  0.]
 [ 0.  0.  0.  3.  0.  9. 11.  0.]
 [ 0.  0.  0.  0.  9. 15.  4.  0.]
 [ 0.  0.  9. 12. 13.  3.  0.  0.]]
Target:
 9
Poznámka: zajisté jste si povšimli, že prvky vektorů i matic jsou skutečně shodné, pouze se odlišuje tvar n-rozměrných polí. Není to pochopitelně náhoda, protože k datům můžeme přistupovat jako k rastrovým obrázkům o rozměrech 8×8 pixelů (vhodné pro vizualizaci) nebo jako k 64prvkovým vektorům (někdy vhodné pro strojové učení a tvorbu modelu).

Ve výpisu skriptu se objevuje i atribut nazvaný target. Je to výsledná hodnota, na kterou by měl být natrénován model. Opět se nejedná o žádnou novinku, protože i tento koncept velmi dobře známe z datových sad IrisCalifornia Housings.

4. Metadata a očekávané výsledky z datové sady Digits

V datové množině získané zavoláním funkce load_digits() nalezneme i další potenciálně užitečné informace. Jedná se především o názvy sloupců v případě, že budeme pole uložené v atributu data chápat jako tabulku (v tomto konkrétním případě o tabulku s 1797 řádky a 64 sloupci). Tyto sloupce se v oblasti zpracování dat taktéž nazývají atributy, což může být nepatrně matoucí.

Názvy sloupců takového pole jsou uloženy v atributu feature_names. A konečně v atributu target_names nalezneme jména tříd, které dohromady představují obor hodnot pro hodnoty target (tedy pro hodnoty, na které budeme model trénovat a s jejichž pomocí budeme ověřovat přesnost jeho předpovědí). Jak tyto informace vypadají konkrétně, nám prozradí další skript:

#!/usr/bin/env python
 
# import funkce, která vrátí obrázky pro práci
from sklearn.datasets import load_digits
 
# načtení obrázků, s nimiž budeme dále pracovat
digits_data = load_digits()
 
# zjištění základních informací o obrázcích
print("Description:", digits_data.DESCR)
 
print("Data:", digits_data.data.shape)
print("Obrázky:", digits_data.images.shape)
 
print("Feature names")
for feature_name in digits_data.feature_names:
    print(feature_name)
 
print()
 
print("Target names")
for target_name in digits_data.target_names:
    print(target_name)
 
# finito

Po spuštění tohoto skriptu se nejprve opět vypíšou informace o dvou n-rozměrných polích s trénovacími a verifikačními daty (což již známe):

Data: (1797, 64)
Obrázky: (1797, 8, 8)

Dále se vypíšou názvy všech 64 sloupců pole data. Zde se prozrazuje to, co již vlastně víme z předchozí kapitoly – že v tomto poli jsou uloženy vektory s 64 hodnotami pixelů, které tvoří logický obrázek s rozlišením 8×8 pixelů:

Feature names
pixel_0_0
pixel_0_1
pixel_0_2
pixel_0_3
pixel_0_4
pixel_0_5
pixel_0_6
pixel_0_7
pixel_1_0
pixel_1_1
pixel_1_2
pixel_1_3
...
...
...
pixel_6_5
pixel_6_6
pixel_6_7
pixel_7_0
pixel_7_1
pixel_7_2
pixel_7_3
pixel_7_4
pixel_7_5
pixel_7_6
pixel_7_7

Obsah pole target_names obsahuje u této datové množiny hodnoty „0“ až „9“, ovšem u jiných množin se může jednat o zcela odlišné informace (například „zapni kotel“/„vyplni kotel“, „před autem je chodec“ atd.):

Target names
0
1
2
3
4
5
6
7
8
9
Poznámka: tato metadata tedy nejsou tak popisná, jako tomu bylo u předchozích dvou datových sad. Je to ostatně logické, protože u Iris měl každý atribut odlišný význam (jiné rozměry) a u California Housings se jednalo o osm prakticky zcela odlišných atributů s jinými jednotkami, rozsahy hodnot atd.:
Iris Data set:
----------------------------------------------------------------------------------------------------
Feature names:
['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
----------------------------------------------------------------------------------------------------
Target names:
['setosa' 'versicolor' 'virginica']
----------------------------------------------------------------------------------------------------
California Housings:
----------------------------------------------------------------------------------------------------
Feature names:
['MedInc', 'HouseAge', 'AveRooms', 'AveBedrms', 'Population', 'AveOccup', 'Latitude', 'Longitude']
----------------------------------------------------------------------------------------------------
Target names:
['MedHouseVal']
----------------------------------------------------------------------------------------------------

5. Přečtení a následné vyobrazení jednotlivých ručně nakreslených číslic

V datové množině, kterou dokážeme přečíst funkcí load_digits, nalezneme (jak již víme) i atribut nazvaný images. Jedná se o n-rozměrné pole, konkrétně o trojrozměrné pole s velikostí 1797×8×8. Toto pole obsahuje 1797 matic velikosti 8×8 reprezentujících malé rastrové obrázky 8×8 pixelů, jejichž hodnoty jsou normalizovány do rozsahu 0..16 (to je důležité pro trénink modelu). Takové obrázky lze snadno zobrazit:

#!/usr/bin/env python
 
# budeme provádět vykreslování de facto standardní knihovnou Matplotlib
import matplotlib.pyplot as plt
 
# import funkce, která vrátí obrázky pro práci
from sklearn.datasets import load_digits
 
# načtení obrázků, s nimiž budeme dále pracovat
digits_data = load_digits()
 
# zjištění základních informací o obrázcích
print(digits_data.data.shape)
 
# vykreslení a uložení prvních deseti obrázků
for i in range(0, 10):
    plt.matshow(digits_data.images[i])
    # převod na stupně šedi
    plt.gray()
 
    plt.savefig(f"Grayscale image #{i}.png")
 
    # vykreslení na obrazovku
    plt.show()
 
# finito

Výsledkem by mělo být následujících deset grafů s vizualizací ručně psaných číslic 0 až 9 (nepoužíváme zde přitom žádnou interpolaci ani žádné další „vylepšení“ výsledků, které by mohl mozek špatně interpretovat):

Obrázek 1: Vizualizace pole s číslicí 0 ve stupních šedi.

Obrázek 2: Vizualizace pole s číslicí 1 ve stupních šedi.

Obrázek 3: Vizualizace pole s číslicí 2 ve stupních šedi.

Obrázek 4: Vizualizace pole s číslicí 3 ve stupních šedi.

Obrázek 5: Vizualizace pole s číslicí 4 ve stupních šedi.

Obrázek 6: Vizualizace pole s číslicí 5 ve stupních šedi.

Obrázek 7: Vizualizace pole s číslicí 6 ve stupních šedi.

Obrázek 8: Vizualizace pole s číslicí 7 ve stupních šedi.

Obrázek 9: Vizualizace pole s číslicí 8 ve stupních šedi.

Obrázek 10: Vizualizace pole s číslicí 9 ve stupních šedi.

6. Rozpoznání číslic modelem provádějícím logistickou regresi

Pokusme se natrénovat model založený na logistické regresi (tedy jeden z nejjednodušších dostupných modelů) tak, aby rozpoznával jednotlivé číslice zapsané v rastru 8×8 pixelů. Model natrénujeme zcela standardním způsobem, tedy naprosto stejně, jako bychom to udělali s datovou sadou Iris. Jediným rozdílem je, že každý vstup nebude mít jen čtyři hodnoty (rozměry), ale 64 hodnot (pixely) a výsledek nemá obsahovat jen hodnotu 0, 1 nebo 2 (druh květiny) ale celočíselnou hodnotu z rozsahu 0 až 9:

# Rozpoznání obrazu s využitím knihovny scikit-learn
 
import matplotlib.pyplot as plt
import numpy as np
 
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import ConfusionMatrixDisplay
from sklearn.model_selection import cross_val_score
 
# Databáze ručně zapsaných číslic
from sklearn.datasets import load_digits
 
# načtení obrázků, s nimiž budeme dále pracovat
digits = load_digits()
 
# zjištění základních informací o obrázcích
print("Description:", digits.DESCR)
 
print("Data:", digits.data.shape)
print("Obrázky:", digits.images.shape)
 
# X je matice (feature matrix)
X = digits.data
 
# y je vektor (response vector)
y = digits.target
 
# rozdělení dat
trainX, testX, trainY, testY = train_test_split(X, y, test_size = 0.2)
 
print()
print("TrainX:", trainX.shape)
print("TrainY:", trainY.shape)
print("TestX:", testX.shape)
print("TestY:", testY.shape)
 
# provést klasifikaci
# konstrukce klasifikatoru
# (s hyperparametrem)
classifier = LogisticRegression(max_iter=1000)
 
# vypocet skore
scores = cross_val_score(classifier, X, y, cv=10, scoring="accuracy")
 
avg_score = scores.mean()
 
# vypsani prumerneho skore
print()
print("Accuracy:", avg_score)
print()
 
# trening noveho modelu
classifier = LogisticRegression(max_iter=1000)
classifier.fit(trainX, trainY)
 
class_names = digits.target_names
 
# absolutni hodnoty
disp = ConfusionMatrixDisplay.from_estimator(
    classifier,
    testX,
    testY,
    display_labels=class_names,
    cmap=plt.cm.Blues,
    normalize=None,
)
 
# zobrazeni matice
print(disp.confusion_matrix)
 
# ulozeni vysledku
plt.savefig("154_1.png")
 
# vizualizace matice
plt.show()
 
# relativni hodnoty
disp = ConfusionMatrixDisplay.from_estimator(
    classifier,
    testX,
    testY,
    display_labels=class_names,
    cmap=plt.cm.Blues,
    normalize="true",
)
 
# zobrazeni matice
print(disp.confusion_matrix)
 
# ulozeni vysledku
plt.savefig("154_2.png")
 
# vizualizace matice
plt.show()

7. Výsledky rozpoznání číslic modelem logistické regrese

Jaké budou výsledky tohoto modelu a jakou bude mít úspěšnost? Tyto údaje získáme ze skriptu z předchozí kapitoly velmi snadno. Nejdříve se zobrazí základní parametry datové sady a následně pak tvary trénovací i testovací datové sady po jejím rozdělení v poměru 1:5:

Data: (1797, 64)
Obrázky: (1797, 8, 8)
 
TrainX: (1437, 64)
TrainY: (1437,)
TestX: (360, 64)
TestY: (360,)

Následně se zobrazí úspěšnost předpovědí natrénovaného modelu. Ta je relativně vysoká (cca 93%), i když jsme použili ten prakticky nejjednodušší dostupný model:

Accuracy: 0.9270856610800745

Přesnější informace nám ovšem dodají až matice záměn (confusion matrix) zobrazené jak s absolutními, tak i relativními hodnotami:

[[35  0  0  0  0  0  0  0  0  0]
 [ 0 34  0  1  1  0  0  0  0  0]
 [ 0  2 24  0  0  0  0  0  0  0]
 [ 0  0  0 33  0  1  0  0  0  0]
 [ 0  0  0  0 33  0  0  0  0  0]
 [ 0  0  0  0  0 41  0  0  0  1]
 [ 0  0  0  0  0  0 37  0  0  0]
 [ 0  0  0  0  0  0  0 40  0  0]
 [ 0  0  0  0  0  0  0  0 37  0]
 [ 0  0  0  0  0  2  0  0  1 37]]
 
[[1.         0.         0.         0.         0.         0.  0.         0.         0.         0.        ]
 [0.         0.94444444 0.         0.02777778 0.02777778 0.  0.         0.         0.         0.        ]
 [0.         0.07692308 0.92307692 0.         0.         0.  0.         0.         0.         0.        ]
 [0.         0.         0.         0.97058824 0.         0.02941176 0.         0.         0.         0.        ]
 [0.         0.         0.         0.         1.         0.  0.         0.         0.         0.        ]
 [0.         0.         0.         0.         0.         0.97619048 0.         0.         0.         0.02380952]
 [0.         0.         0.         0.         0.         0.  1.         0.         0.         0.        ]
 [0.         0.         0.         0.         0.         0.  0.         1.         0.         0.        ]
 [0.         0.         0.         0.         0.         0.  0.         0.         1.         0.        ]
 [0.         0.         0.         0.         0.         0.05 0.         0.         0.025      0.925     ]]

Vizuální podoba matic záměn:

Obrázek 11: Matice záměn s absolutními odchylkami.

Obrázek 12: Matice záměn s relativními odchylkami.

Poznámka: model měl tedy největší potíže s rozpoznáním číslic 2, 3 a 9.

8. Využití modelu SVM (metoda podpůrných vektorů) pro klasifikaci obrázků

Pro rozpoznání obrazů můžeme pochopitelně využít i sofistikovanější modely. Jedním z takových modelů je i model založený na metodě podpůrných vektorů neboli Support Vector Machine (SVM). Interně tato metoda provádí transformaci vstupů do odlišného prostoru, ve kterém se následně jednotlivé hodnoty rozdělují tak, aby to odpovídalo požadované klasifikaci (tři druhy kosatců, deset číslic atd.). Přepis původního skriptu tak, aby se využil model založený na SVM, je relativně snadnou úlohou, i když interní výpočty jsou v tomto případě již poměrně komplikované. Výsledek přitom vypadá následovně:

# Rozpoznání obrazu s využitím knihovny scikit-learn
 
import matplotlib.pyplot as plt
import numpy as np
 
from sklearn import svm
from sklearn.model_selection import train_test_split
from sklearn.metrics import ConfusionMatrixDisplay
from sklearn.model_selection import cross_val_score
 
# Databáze ručně zapsaných číslic
from sklearn.datasets import load_digits
 
# načtení obrázků, s nimiž budeme dále pracovat
digits = load_digits()
 
# zjištění základních informací o obrázcích
print("Description:", digits.DESCR)
 
print("Data:", digits.data.shape)
print("Obrázky:", digits.images.shape)
 
# X je matice (feature matrix)
X = digits.data
 
# y je vektor (response vector)
y = digits.target
 
# rozdělení dat
trainX, testX, trainY, testY = train_test_split(X, y, test_size = 0.2)
 
print()
print("TrainX:", trainX.shape)
print("TrainY:", trainY.shape)
print("TestX:", testX.shape)
print("TestY:", testY.shape)
 
# provést klasifikaci
# konstrukce klasifikatoru
# (s hyperparametrem)
classifier = svm.SVC(gamma=0.001)
 
# vypocet skore
scores = cross_val_score(classifier, X, y, cv=10, scoring="accuracy")
 
avg_score = scores.mean()
 
# vypsani prumerneho skore
print()
print("Accuracy:", avg_score)
print()
 
# trening modelu
classifier.fit(trainX, trainY)
 
class_names = digits.target_names
 
# absolutni hodnoty
disp = ConfusionMatrixDisplay.from_estimator(
    classifier,
    testX,
    testY,
    display_labels=class_names,
    cmap=plt.cm.Blues,
    normalize=None,
)
 
# zobrazeni matice
print(disp.confusion_matrix)
 
# ulozeni vysledku
plt.savefig("155_1.png")
 
# vizualizace matice
plt.show()
 
# relativni hodnoty
disp = ConfusionMatrixDisplay.from_estimator(
    classifier,
    testX,
    testY,
    display_labels=class_names,
    cmap=plt.cm.Blues,
    normalize="true",
)
 
# zobrazeni matice
print(disp.confusion_matrix)
 
# ulozeni vysledku

9. Výsledky rozpoznání číslic metodou podpůrných vektorů

Opět se podívejme na výsledky, které získáme po spuštění skriptu z předchozí kapitoly. Nyní bude úspěšnost předpovědí modelu mnohem větší – namísto necelých 93% jsme dosáhli téměř 98%:

Data: (1797, 64)
Obrázky: (1797, 8, 8)
 
TrainX: (1437, 64)
TrainY: (1437,)
TestX: (360, 64)
TestY: (360,)
 
Accuracy: 0.9782929857231533

Skript taktéž vypočítá a zobrazí matice záměn, které nyní vypadají následovně:

[[42  0  0  0  0  0  0  0  0  0]
 [ 0 29  0  0  0  0  0  0  0  0]
 [ 0  0 39  0  0  0  0  0  0  0]
 [ 0  0  0 33  0  0  0  1  0  0]
 [ 0  0  0  0 48  0  0  0  0  0]
 [ 0  0  0  0  0 41  0  0  0  1]
 [ 0  0  0  0  0  0 32  0  0  0]
 [ 0  0  0  0  0  0  0 35  0  0]
 [ 0  0  0  0  0  0  0  0 19  0]
 [ 0  0  0  0  0  0  0  1  1 38]]
 
[[1.         0.         0.         0.         0.         0.  0.         0.         0.         0.        ]
 [0.         1.         0.         0.         0.         0.  0.         0.         0.         0.        ]
 [0.         0.         1.         0.         0.         0.  0.         0.         0.         0.        ]
 [0.         0.         0.         0.97058824 0.         0.  0.         0.02941176 0.         0.        ]
 [0.         0.         0.         0.         1.         0.  0.         0.         0.         0.        ]
 [0.         0.         0.         0.         0.         0.97619048 0.         0.         0.         0.02380952]
 [0.         0.         0.         0.         0.         0.  1.         0.         0.         0.        ]
 [0.         0.         0.         0.         0.         0.  0.         1.         0.         0.        ]
 [0.         0.         0.         0.         0.         0.  0.         0.         1.         0.        ]
 [0.         0.         0.         0.         0.         0.  0.         0.025      0.025      0.95      ]]

Vizuální podoba matic záměn:

Obrázek 13: Matice záměn s absolutními odchylkami.

Obrázek 14: Matice záměn s relativními odchylkami.

10. Využití modelu pro hledání K nejbližších sousedů

Podobným způsobem můžeme nahradit předchozí model za model, který se snaží o hledání K nejbližších sousedů v natrénované sadě n-rozměrných bodů. Tento model je v knihovně scikit-learn implementován třídou KNeighborsClassifier. Pokusme se tedy tento model použít pro rozpoznání číslic v 64prvkových vektorech:

# Rozpoznání obrazu s využitím knihovny scikit-learn
 
import matplotlib.pyplot as plt
import numpy as np
 
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import ConfusionMatrixDisplay
from sklearn.model_selection import cross_val_score
 
# Databáze ručně zapsaných číslic
from sklearn.datasets import load_digits
 
# načtení obrázků, s nimiž budeme dále pracovat
digits = load_digits()
 
# zjištění základních informací o obrázcích
print("Description:", digits.DESCR)
 
print("Data:", digits.data.shape)
print("Obrázky:", digits.images.shape)
 
# X je matice (feature matrix)
X = digits.data
 
# y je vektor (response vector)
y = digits.target
 
# rozdělení dat
trainX, testX, trainY, testY = train_test_split(X, y, test_size = 0.2)
 
print()
print("TrainX:", trainX.shape)
print("TrainY:", trainY.shape)
print("TestX:", testX.shape)
print("TestY:", testY.shape)
 
# provést klasifikaci
# konstrukce klasifikatoru
# (s hyperparametrem)
classifier = KNeighborsClassifier(n_neighbors=5)
 
# vypocet skore
scores = cross_val_score(classifier, X, y, cv=10, scoring="accuracy")
 
avg_score = scores.mean()
 
# vypsani prumerneho skore
print()
print("Accuracy:", avg_score)
print()
 
# trening modelu
classifier.fit(trainX, trainY)
 
class_names = digits.target_names
 
# absolutni hodnoty
disp = ConfusionMatrixDisplay.from_estimator(
    classifier,
    testX,
    testY,
    display_labels=class_names,
    cmap=plt.cm.Blues,
    normalize=None,
)
 
# zobrazeni matice
print(disp.confusion_matrix)
 
# ulozeni vysledku
plt.savefig("156_1.png")
 
# vizualizace matice
plt.show()
 
# relativni hodnoty
disp = ConfusionMatrixDisplay.from_estimator(
    classifier,
    testX,
    testY,
    display_labels=class_names,
    cmap=plt.cm.Blues,
    normalize="true",
)
 
# zobrazeni matice
print(disp.confusion_matrix)
 
# ulozeni vysledku

11. Výsledky rozpoznání číslic modelem hledajícím K nejbližších sousedů

Přesnost předpovědí modelu KNeighborsClassifier je poměrně vysoká – přes 97%, což znamená, že jen tři procenta číslic se nerozeznají. Ostatně se podívejme, jak výsledky vypadají:

Data: (1797, 64)
Obrázky: (1797, 8, 8)
 
TrainX: (1437, 64)
TrainY: (1437,)
TestX: (360, 64)
TestY: (360,)
 
Accuracy: 0.9716294227188081

Matice záměn opět obsahuje největší hodnoty na hlavní diagonále, což je ostatně jen dobře (ideální by bylo získat čistě diagonální matici):

[[41  0  0  0  0  0  0  0  0  0]
 [ 0 36  0  0  0  0  0  0  0  0]
 [ 0  0 38  0  0  0  0  0  0  0]
 [ 0  0  0 35  0  0  0  0  0  0]
 [ 0  0  0  0 35  0  0  0  0  0]
 [ 0  0  0  0  0 30  1  0  0  1]
 [ 0  0  0  0  0  0 41  0  0  0]
 [ 0  0  0  0  0  0  0 31  0  0]
 [ 0  1  0  1  0  0  0  1 36  0]
 [ 0  0  0  0  1  0  0  0  0 31]]
[[1.         0.         0.         0.         0.         0.  0.         0.         0.         0.        ]
 [0.         1.         0.         0.         0.         0.  0.         0.         0.         0.        ]
 [0.         0.         1.         0.         0.         0.  0.         0.         0.         0.        ]
 [0.         0.         0.         1.         0.         0.  0.         0.         0.         0.        ]
 [0.         0.         0.         0.         1.         0.  0.         0.         0.         0.        ]
 [0.         0.         0.         0.         0.         0.9375 0.03125    0.         0.         0.03125   ]
 [0.         0.         0.         0.         0.         0.  1.         0.         0.         0.        ]
 [0.         0.         0.         0.         0.         0.  0.         1.         0.         0.        ]
 [0.         0.02564103 0.         0.02564103 0.         0.  0.         0.02564103 0.92307692 0.        ]
 [0.         0.         0.         0.         0.03125    0.  0.         0.         0.         0.96875   ]]

Vizuální podoba matic záměn:

Obrázek 15: Matice záměn s absolutními odchylkami.

Obrázek 16: Matice záměn s relativními odchylkami.

12. Rozpoznání rastrových obrázků neuronovou sítí

Samozřejmě nám nic nebrání namísto „obyčejných modelů“ použít pro rozpoznání číslic neuronovou síť. Vzhledem k tomu, že provádíme klasifikaci (výstupem má být jedna celočíselná hodnota 0 až 9), použijeme pro realizaci neuronové sítě třídu MLPClassifier, s níž jsme se již seznámili předminule i minule. Upravme si tedy demonstrační příklad tak, aby se použil model založený na neuronové síti s výchozí konfigurací (100 neuronů v jediné skryté vrstvě):

# Rozpoznání obrazu s využitím knihovny scikit-learn
 
import matplotlib.pyplot as plt
import numpy as np
 
# model zalozeny na neuronove siti
from sklearn.neural_network import MLPClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import ConfusionMatrixDisplay
from sklearn.model_selection import cross_val_score
 
# Databáze ručně zapsaných číslic
from sklearn.datasets import load_digits
 
# načtení obrázků, s nimiž budeme dále pracovat
digits = load_digits()
 
# zjištění základních informací o obrázcích
print("Description:", digits.DESCR)
 
print("Data:", digits.data.shape)
print("Obrázky:", digits.images.shape)
 
# X je matice (feature matrix)
X = digits.data
 
# y je vektor (response vector)
y = digits.target
 
# rozdělení dat
trainX, testX, trainY, testY = train_test_split(X, y, test_size = 0.2)
 
print()
print("TrainX:", trainX.shape)
print("TrainY:", trainY.shape)
print("TestX:", testX.shape)
print("TestY:", testY.shape)
 
# provést klasifikaci
# konstrukce klasifikatoru
# (s hyperparametrem)
classifier = MLPClassifier(max_iter=5000)
 
# vypocet skore
scores = cross_val_score(classifier, X, y, cv=10, scoring="accuracy")
 
avg_score = scores.mean()
 
# vypsani prumerneho skore
print()
print("Accuracy:", avg_score)
print()
 
# trening modelu
classifier.fit(trainX, trainY)
 
class_names = digits.target_names
 
# absolutni hodnoty
disp = ConfusionMatrixDisplay.from_estimator(
    classifier,
    testX,
    testY,
    display_labels=class_names,
    cmap=plt.cm.Blues,
    normalize=None,
)
 
# zobrazeni matice
print(disp.confusion_matrix)
 
# ulozeni vysledku
plt.savefig("157_1.png")
 
# vizualizace matice
plt.show()
 
# relativni hodnoty
disp = ConfusionMatrixDisplay.from_estimator(
    classifier,
    testX,
    testY,
    display_labels=class_names,
    cmap=plt.cm.Blues,
    normalize="true",
)
 
# zobrazeni matice
print(disp.confusion_matrix)
 
# ulozeni vysledku
plt.savefig("157_2.png")

13. Výsledky rozpoznání číslic neuronovou sítí

Zajímavé je, že model založený na neuronové síti má přesnost rozpoznání pouze 95%, zatímco předchozí (interně jednodušší) model má přesnost vyšší o celá dvě procenta:

Accuracy: 0.9493482309124767

Opět se tedy ukazuje, že neuronové sítě pochopitelně mají své využití (a navíc si je ještě dokážeme doladit), ovšem v mnoha případech je jednodušší sáhnout po interně jednodušším modelu.

Struktura neuronové sítě: 3 vrstvy, ve vstupní vrstvě 64 neuronů, ve skryté vrstvě 100 neuronů a konečně ve výstupní vrstvě je deset neuronů:

Features: 64
Layers:   3
Outputs:  10
Weights:
         0 (64, 100)
         1 (100, 10)
Biases:
         0 (100,)
         1 (10,)

Vypočítat a zobrazit si můžeme i matici záměn – jak s absolutními hodnotami, tak i s hodnotami relativními:

[[31  0  0  0  0  0  1  0  0  0]
 [ 0 37  0  0  0  0  0  0  0  0]
 [ 0  0 35  0  0  0  0  0  0  0]
 [ 0  0  0 36  0  0  0  0  0  0]
 [ 0  0  0  0 32  0  0  0  1  0]
 [ 0  0  0  0  0 33  1  0  0  2]
 [ 0  0  0  0  0  0 35  0  0  0]
 [ 0  0  0  0  0  0  0 35  0  0]
 [ 0  2  0  0  0  0  0  0 33  0]
 [ 0  0  0  0  0  1  0  0  1 44]]
 
[[0.96875    0.         0.         0.         0.         0.  0.03125    0.         0.         0.        ]
 [0.         1.         0.         0.         0.         0.  0.         0.         0.         0.        ]
 [0.         0.         1.         0.         0.         0.  0.         0.         0.         0.        ]
 [0.         0.         0.         1.         0.         0.  0.         0.         0.         0.        ]
 [0.         0.         0.         0.         0.96969697 0.  0.         0.         0.03030303 0.        ]
 [0.         0.         0.         0.         0.         0.91666667 0.02777778 0.         0.         0.05555556]
 [0.         0.         0.         0.         0.         0.  1.         0.         0.         0.        ]
 [0.         0.         0.         0.         0.         0.  0.         1.         0.         0.        ]
 [0.         0.05714286 0.         0.         0.         0.  0.         0.         0.94285714 0.        ]
 [0.         0.         0.         0.         0.         0.02173913 0.         0.         0.02173913 0.95652174]]

Vizuální podoba matic záměn:

Obrázek 17: Matice záměn s absolutními odchylkami.

Obrázek 18: Matice záměn s relativními odchylkami.

14. Zobrazení původních obrázků i predikovaných výsledků ve vizuální podobě

Kromě matic záměn si můžeme vizualizovat i jednotlivé číslice v rastrové podobě (vstup) a odpovídající predikované výsledky. Jeden z možných způsobů, jak tento úkol řešit, je ukázán v dalším demonstračním příkladu, v němž je do jednoho grafu vykreslena mřížka s 25 obrázky, které jsou popsány výsledkem predikce – tj. jakou číslici na obrázku „vidí“ model. Některé odhady jsou přesné, jiné nikoli:

# Rozpoznání obrazu s využitím knihovny scikit-learn
 
import matplotlib.pyplot as plt
import numpy as np
 
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
 
# Databáze ručně zapsaných číslic
from sklearn.datasets import load_digits
 
# načtení obrázků, s nimiž budeme dále pracovat
digits = load_digits()
 
# zjištění základních informací o obrázcích
print("Description:", digits.DESCR)
 
print("Data:", digits.data.shape)
print("Obrázky:", digits.images.shape)
 
# X je matice (feature matrix)
X = digits.data
 
# y je vektor (response vector)
y = digits.target
 
for_training = len(y) * 8 // 10
print("Vzorků pro trénink:", for_training)
 
# rozdělení dat
trainX = X[:for_training]
testX = X[for_training:]
trainY = y[:for_training]
testY = y[for_training:]
 
# provést klasifikaci
# konstrukce klasifikatoru
# (s hyperparametrem)
classifier = LogisticRegression(max_iter=1000)
 
# vypocet skore
scores = cross_val_score(classifier, X, y, cv=10, scoring="accuracy")
avg_score = scores.mean()
print("Accuracy:", avg_score)
 
# trening modelu
classifier.fit(trainX, trainY)
 
predicted_labels = classifier.predict(testX)
images = digits.images[for_training:]
 
fig = plt.figure(figsize=(6.4, 8.0))
 
# zobrazit patnáct výsledků
for i in range(25):
    predicted_digit = classifier.predict([testX[i]])[0]
    correct_digit = testY[i]
    print(predicted_digit, correct_digit)
    image = images[i]
    plt.subplot(5, 5, i+1)
    plt.axis("off")
    # zobrazení obrázku
    plt.imshow(image, cmap=plt.cm.gray_r, interpolation="nearest")
    # a přidání predikce - o jakou číslici se jedná
    plt.title("Predict: %i" % predicted_digit)
 
# nakonec vše uložíme a zobrazíme
plt.savefig("158.png")
plt.show()

A takto bude vypadat graf s oněmi 25 číslicemi:

Obrázek 19: 25 ručně psaných číslic a příslušné odhady modelu.

15. Zobrazení těch číslic, u nichž se model spletl

Mnohem zajímavější však bude zjistit, které konkrétní číslice model naopak nerozeznal. To můžeme realizovat nepatrnou úpravou předchozího skriptu, a to tak, že vybereme jen ty rastrové obrázky, u nichž se model spletl. Takové obrázky si necháme zobrazit a současně si vypíšeme i predikovanou a korektní číslici, která se na obrázku nachází (protože mnohdy to nerozezná ani člověk):

wrong = 0
i = 0
while wrong < 25:
    predicted_digit = classifier.predict([testX[i]])[0]
    correct_digit = testY[i]
    if predicted_digit != correct_digit:
        print(predicted_digit, correct_digit)
        image = images[i]
        wrong += 1
        plt.subplot(5, 5, wrong)
        plt.axis("off")
        # zobrazení obrázku
        plt.imshow(image, cmap=plt.cm.gray_r, interpolation="nearest")
        # a přidání predikce - o jakou číslici se jedná
        plt.title(f"{predicted_digit} <> {correct_digit}")
    i += 1

Celý skript po výše uvedené úpravě bude vypadat následovně:

# Rozpoznání obrazu s využitím knihovny scikit-learn
 
import matplotlib.pyplot as plt
import numpy as np
 
from sklearn import svm
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
 
# Databáze ručně zapsaných číslic
from sklearn.datasets import load_digits
 
# načtení obrázků, s nimiž budeme dále pracovat
digits = load_digits()
 
# zjištění základních informací o obrázcích
print("Description:", digits.DESCR)
 
print("Data:", digits.data.shape)
print("Obrázky:", digits.images.shape)
 
# X je matice (feature matrix)
X = digits.data
 
# y je vektor (response vector)
y = digits.target
 
for_training = len(y) * 6 // 10
print("Vzorků pro trénink:", for_training)
 
# rozdělení dat
trainX = X[:for_training]
testX = X[for_training:]
trainY = y[:for_training]
testY = y[for_training:]
 
# provést klasifikaci
# konstrukce klasifikatoru
# (s hyperparametrem)
#classifier = LogisticRegression(max_iter=1000)
classifier = svm.SVC(gamma=0.001)
 
# vypocet skore
scores = cross_val_score(classifier, X, y, cv=10, scoring="accuracy")
avg_score = scores.mean()
print("Accuracy:", avg_score)
 
# trening modelu
classifier.fit(trainX, trainY)
 
predicted_labels = classifier.predict(testX)
images = digits.images[for_training:]
 
fig = plt.figure(figsize=(6.4, 8.0))
 
# zobrazit patnáct výsledků
wrong = 0
i = 0
while wrong < 25:
    predicted_digit = classifier.predict([testX[i]])[0]
    correct_digit = testY[i]
    if predicted_digit != correct_digit:
        print(predicted_digit, correct_digit)
        image = images[i]
        wrong += 1
        plt.subplot(5, 5, wrong)
        plt.axis("off")
        # zobrazení obrázku
        plt.imshow(image, cmap=plt.cm.gray_r, interpolation="nearest")
        # a přidání predikce - o jakou číslici se jedná
        plt.title(f"{predicted_digit} <> {correct_digit}")
    i += 1
 
# nakonec vše uložíme a zobrazíme
plt.savefig("159.png")
plt.show()

16. Graf s číslicemi, které nebyly správně rozeznány

Z výsledného grafu, v němž jsou zobrazeny číslice, které model rozeznal nesprávně, můžeme vidět určité vzory, tj. „typy“ zkreslení, s nimiž si model neví rady a které špatně odhadne (a navíc prakticky vždy špatně vrátí stejnou číslici):

Obrázek 20: Graf s číslicemi, které nebyly modelem správně rozeznány.

17. Zobrazení číslic, které nebyly korektně rozeznány neuronovou sítí

Naprosto stejným způsobem si můžeme nechat zobrazit číslice, které nebyly korektně rozpoznány neuronovou sítí, tj. tím nejsložitějším modelem, který až doposud máme k dispozici. Skript tedy upravíme jen nepatrně, konkrétně tak, aby se použil model realizovaný třídou MLPClassifier, který ovšem nemá tak dobrou predikční schopnost, jako například SVM nebo KNeighborsClassifier, tedy alespoň v případě, že výslednou neuronovou síť nebudeme dále „ladit“:

# Rozpoznání obrazu s využitím knihovny scikit-learn
 
import matplotlib.pyplot as plt
import numpy as np
 
from sklearn.neural_network import MLPClassifier
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
 
# Databáze ručně zapsaných číslic
from sklearn.datasets import load_digits
 
# načtení obrázků, s nimiž budeme dále pracovat
digits = load_digits()
 
# zjištění základních informací o obrázcích
print("Description:", digits.DESCR)
 
print("Data:", digits.data.shape)
print("Obrázky:", digits.images.shape)
 
# X je matice (feature matrix)
X = digits.data
 
# y je vektor (response vector)
y = digits.target
 
for_training = len(y) * 6 // 10
print("Vzorků pro trénink:", for_training)
 
# rozdělení dat
trainX = X[:for_training]
testX = X[for_training:]
trainY = y[:for_training]
testY = y[for_training:]
 
# provést klasifikaci
# konstrukce klasifikatoru
# (s hyperparametrem)
#classifier = LogisticRegression(max_iter=1000)
classifier = MLPClassifier(max_iter=5000)
 
# vypocet skore
scores = cross_val_score(classifier, X, y, cv=10, scoring="accuracy")
avg_score = scores.mean()
print("Accuracy:", avg_score)
 
# trening modelu
classifier.fit(trainX, trainY)
 
predicted_labels = classifier.predict(testX)
images = digits.images[for_training:]
 
fig = plt.figure(figsize=(6.4, 8.0))
 
# zobrazit 25 výsledků
wrong = 0
i = 0
while wrong < 25:
    predicted_digit = classifier.predict([testX[i]])[0]
    correct_digit = testY[i]
    if predicted_digit != correct_digit:
        print(predicted_digit, correct_digit)
        image = images[i]
        wrong += 1
        plt.subplot(5, 5, wrong)
        plt.axis("off")
        # zobrazení obrázku
        plt.imshow(image, cmap=plt.cm.gray_r, interpolation="nearest")
        # a přidání predikce - o jakou číslici se jedná
        plt.title(f"{predicted_digit} <> {correct_digit}")
    i += 1
 
# nakonec vše uložíme a zobrazíme
plt.savefig("160.png")
plt.show()

18. Číslice, které nebyly rozpoznány neuronovou sítí

Při porovnání obrázků číslo 20 a 21 je zřejmé, že neuronová síť nedokáže rozeznat odlišné vzory v porovnání s jednoduššími modely. To je zajímavé zjištění. Příště si ukážeme, jak kvalitu neuronové sítě ovlivňuje volba aktivační funkce, což je většinou globální nastavení pro celou neuronovou síť (i když někdy může být vhodnější zvolit si vlastní aktivační funkci pro každou vrstvu zvlášť).

Obrázek 21: Graf s číslicemi, které nebyly neuronovou sítí správně rozeznány.

bitcoin_skoleni

19. Repositář s demonstračními příklady

Všechny demonstrační příklady využívající knihovnu Scikit-learn lze nalézt v repositáři https://github.com/tisnik/most-popular-python-libs. Následují odkazy na jednotlivé příklady i na (Jupyter) diáře s postupem výpočtů a analýz:

# Příklad Stručný popis Adresa příkladu
1 01_show_matrix.py kooperace mezi knihovnami Matplotlib a NumPy: vizualizace obsahu 2D matice https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/01_show_ma­trix.py
2 02_get_digits.py datová množina obsahující naskenované ručně napsané číslice https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/02_get_di­gits.py
3 03_get_features.py další atributy datové množiny, které použijeme při trénování https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/03_get_fe­atures.py
4 04_get_images.py přečtení a následné vykreslení jednotlivých ručně nakreslených číslic https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/04_get_i­mages.py
5 05_show_grayscale_matrix.py odstranění umělé aplikované barvové palety (obrázky ve stupních šedi) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/05_show_gra­yscale_matrix.py
6 06_grayscale_images.py vykreslení ručně nakreslených číslic ve formě obrázků ve stupních šedi https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/06_gra­yscale_images.py
7 07_multiplot.py rozdělení plochy grafu do oblastí; vykreslení více obrázků do jediného grafu https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/07_mul­tiplot.py
8 08_model_preperation1.py obrázky s jejich ohodnocením https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/08_mo­del_preperation1.py
9 09_training_set.py příprava dat pro trénink https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/09_tra­ining_set.py
10 10_classification.py klasifikace obrázků https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/10_clas­sification.py
11 11_results.py vykreslení obrázků společně s jejich klasifikací https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/11_results.py
12 12_change_training_set.py změna poměru rozdělení dat na tréninkovou a testovací množinu https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/12_chan­ge_training_set.py
       
13 13_blobs.py použití funkce make_blobs pro vygenerování sady bodů v rovině sdružených do oblastí https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/13_blobs.py
14 14_swap_coords.py úprava předchozího příkladu: prohození souřadnic na osách https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/14_swap_co­ords.py
15 15_blobs_scatter_plot.py základní podoba bodového diagramu (scatter plot) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/15_blob­s_scatter_plot.py
16 16_blobs_scatter_plot.py úprava bodového diagramu při zobrazení většího množství bodů https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/16_blob­s_scatter_plot.py
17 17_colorized_blobs.py obarvení bodů podle oblastí https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/17_co­lorized_blobs.py
18 18_k-means.py základní použití algoritmu K-means pro clustering https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/18_k-means.py
19 19_combination.py zobrazení centroidů společně s původními body https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/19_com­bination.py
20 20_combinations.py vizualizace clusteringu původní množiny bodů https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/20_com­binations.py
21 21_other_settings.py vizualizace clusteringu původní množiny bodů pro odlišnou množinu https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/21_ot­her_settings.py
22 22_random_points.py clustering pro náhodná data https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/22_ran­dom_points.py
       
23 23_circles.py pseudonáhodné rozmístění bodů do kružnic, menší náhodnost výsledku https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/23_circles.py
24 24_more_noise_circles.py pseudonáhodné rozmístění bodů do kružnic, větší náhodnost výsledku https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/24_mo­re_noise_circles.py
25 25_moons.py pseudonáhodné rozmístění bodů do tvaru dvou půlměsíců, menší náhodnost https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/25_moons.py
26 26_more_noisy_moons.py pseudonáhodné rozmístění bodů do tvaru dvou půlměsíců, větší náhodnost https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/26_mo­re_noisy_moons.py
27 27_circles_kmeans.py výsledek clusteringu provedeného algoritmem K-means na „kružnice“ https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/27_cir­cles_kmeans.py
28 28_moons_kmeans.py výsledek clusteringu provedeného algoritmem K-means na „půlměsíce“ https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/28_mo­ons_kmeans.py
29 29_blobs_spectral_clustering.py spectral clustering pro body rozmístěné pomocí make_blobs https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/29_blob­s_spectral_clustering.py
30 30_circles_spectral_clustering.py spectral clustering pro body rozmístěné do kružnic https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/30_cir­cles_spectral_clustering.py
31 31_moons_spectral_clustering.py spectral clustering pro body rozmístěné do půlměsíců https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/31_mo­ons_spectral_clustering.py
32 32_moons_spectral_clustering_limits.py vyhledání limitů algoritmu spectral clustering https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/32_mo­ons_spectral_clustering_li­mits.py
       
33 33_particles_load.py načtení souřadnic částic uložených v souboru formátu CSV https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/33_par­ticles_load.py
       
34 34_lorenz_attractor.py zobrazení Lorenzova atraktoru formou bodů propojených úsečkami https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/34_lo­renz_attractor.py
35 35_lorenz_attractor_points.py Lorenzův atraktor vykreslený formou jednotlivých bodů s definovaným stylem zobrazení a velikostí stopy https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/35_lo­renz_attractor_points.py
36 36_blobs_3d.py vygenerování a zobrazení sady bodů v 3D prostoru https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/36_blob­s_3d.py
37 37_spread_blobs_3d.py vygenerování a zobrazení sady bodů v 3D prostoru, odlišné parametry při generování https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/37_spre­ad_blobs_3d.py
38 38_views.py různé pohledy na 3D graf https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/38_views.py
39 39_colorized_3d_blobs.py obarvení bodů v prostoru na základě vstupních dat https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/39_co­lorized_3d_blobs.py
40 40_kmeans_3d_blobs.py shluková analýza v 3D prostoru https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/40_kme­ans_3d_blobs.py
41 41_kmeans_spread_3d_blobs.py shluková analýza v 3D prostoru pro odlišnou množinu bodů https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/41_kme­ans_spread_3d_blobs.py
42 42_kmeans_random_3d.py shluková analýza pro body rozmístěné zcela náhodně v omezeném prostoru https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/42_kme­ans_random_3d.py
       
43 43_speed_measurements.py benchmark pro postupně rostoucí počet bodů tvořících shluky https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/43_spe­ed_measurements.py
44 44_speed_measurements.py benchmark pro postupně rostoucí počet bodů rozmístěných náhodně https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/44_spe­ed_measurements.py
45 45_speed_measurements.py benchmark pro stále stejný počet bodů, u jejichž rozmístění v prostoru se používá stále větší směrodatná odchylka https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/45_spe­ed_measurements.py
       
46 46_iris_dataset.py načtení datové kolekce https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/46_i­ris_dataset.py
47 47_iris_description.py metadata o datové kolekci https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/47_i­ris_description.py
48 48_iris_data.py tvar dat – počet záznamů a počet proměnných https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/48_i­ris_data.py
49 49_iris_targets.py jména atributů, vztah mezi numerickou hodnotou atributu a jeho jménem https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/49_i­ris_targets.py
       
50 50_iris_scatter_plot1.py korelační diagram pro dvojici vybraných proměnných https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/50_i­ris_scatter_plot1.py
51 51_iris_scatter_plot2.py příprava pro tvorbu složitějších grafů https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/51_i­ris_scatter_plot2.py
52 52_iris_mutliplot.py mřížka obsahující více korelačních diagramů https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/52_i­ris_mutliplot.py
       
53 53_iris_histograms.py zobrazení základního histogramu pro data v sadě Iris https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/53_i­ris_histograms.py
54 54_iris_histograms.py úprava histogramu https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/54_i­ris_histograms.py
       
55 55_pca.py analýza hlavních komponent (PCA), výsledek zobrazený v 2D grafu https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/55_pca.py
56 56_pca_3d.py analýza hlavních komponent (PCA), výsledek zobrazený v 3D grafu https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/56_pca_3d.py
57 57_kmeans.py základní shluková analýza https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/57_kmeans.py
58 58_multiple_kmeans.py větší množství výsledků shlukové analýzy pro různé atributy https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/58_mul­tiple_kmeans.py
59 59_kmeans_errors.py korektní a nekorektní výsledky základní shlukové analýzy https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/59_kme­ans_errors.py
       
60 60_basic_classifier.py aplikace jednoduchého modelu https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/60_ba­sic_classifier.py
61 61_changed_model_parameters.py změna parametrů modelu pro zjištění druhů rostil https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/61_chan­ged_model_parameters.py
62 62_different_model.py použití odlišného modelu pro zjištění druhů rostlin https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/62_dif­ferent_model.py
       
63 63_verify_on_whole_data1.py otestování naučeného modelu s využitím tréninkových dat https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/63_ve­rify_on_whole_data1.py
64 64_verify_on_whole_data2.py využití funkce metrics.accuracy_score pro zjištění kvality modelu https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/64_ve­rify_on_whole_data2.py
65 65_basic_comparison.py porovnání vlastností různých modelů (prozatím nekorektní řešení) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/65_ba­sic_comparison.py
66 66_training_testing_split1.py rozdělení datové sady na trénovací data a testovací data (základní varianta) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/66_tra­ining_testing_split1.py
67 67_training_testing_split2.py rozdělení datové sady na trénovací data a testovací data (náhodné rozdělení sady) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/67_tra­ining_testing_split2.py
68 68_training_testing_split3.py rozdělení datové sady na trénovací data a testovací data (využití vestavěné funkce) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/68_tra­ining_testing_split3.py
69 69_better_comparison.py vylepšené porovnání vlastností různých modelů https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/69_bet­ter_comparison.py
70 70_multiple_runs.py vliv generátoru náhodných čísel na změřené výsledky https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/70_mul­tiple_runs.py
71 71_stable_multiple_runs.py generátor náhodných čísel a použití hodnoty random_state https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/71_sta­ble_multiple_runs.py
       
72 72_housings_dataset.py načtení datové sady California housings https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/72_hou­sings_dataset.py
73 73_housings_dataset_description.py metainformace o datové sadě California housings https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/73_hou­sings_dataset_description­.py
74 74_housings_data.py n-rozměrné pole s atributy jednotlivých domů/bloků https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/74_hou­sings_data.py
75 75_housings_targets.py jména atributů, ceny domů atd. https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/75_hou­sings_targets.py
76 76_housings_scatter_plot.py korelační diagram pro dvojici vybraných proměnných https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/76_hou­sings_scatter_plot.py
77 77_housings_mutliplot.py korelační diagram pro všechny kombinace dvojic proměnných https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/77_hou­sings_mutliplot.py
78 78_scatter.py dvourozměrné hodnoty reprezentované jako dvojice atributů https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/78_scatter.py
79 79_linear_regression_gen_data.py model LinearRegression nad uměle vytvořenými daty https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/79_li­near_regression_gen_data.py
80 80_linear_regression_predictions.py predikce modelu provádějícího lineární regresi https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/80_li­near_regression_prediction­s.py
81 81_linear_regression_random_data.py chování modelu pro zcela náhodná data https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/81_li­near_regression_random_da­ta.py
82 82_linear_regression_housings.py model LinearRegression pro datovou sadu California housings https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/82_li­near_regression_housings.py
83 83_polynomial_regression_gen_data.py polynomiální regrese (základní příklad) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/83_po­lynomial_regression_gen_da­ta.py
84 84_polynomial_regression_housings.py polynomiální regrese a datová sada California housings, první příklad https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/84_po­lynomial_regression_housin­gs.py
85 85_polynomial_regression_housings2.py polynomiální regrese a datová sada California housings, druhý příklad https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/85_po­lynomial_regression_housin­gs2.py
86 86_polynomial_regression_housings3.py polynomiální regrese a datová sada California housings, třetí příklad https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/86_po­lynomial_regression_housin­gs3.py
87 87_linear_regression_errors.py výpočet chyby a skóre modelu lineární regrese https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/87_li­near_regression_errors.py
88 88_linear_regression_non_linear_data.py lineární regrese nad nelineárními daty https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/88_li­near_regression_non_linear_da­ta.py
89 89_polynomial_regression_error.py https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/89_po­lynomial_regression_error­.py
       
90 90_housings_prediction1.py regresní analýza nad daty California housings https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/90_hou­sings_prediction1.py
91 91_housings_prediction2.py korektní natrénování modelu pro regresi https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/91_hou­sings_prediction2.py
92 92_housings_prediction3.py omezení množství atributů (proměnných), na kterých je model natrénován https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/92_hou­sings_prediction3.py
93 93_housings_prediction_errors1.py chybně natrénovaný model při náhodné volbě dat https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/93_hou­sings_prediction_errors1.py
94 94_housings_prediction_errors2.py omezení atributů + chybně natrénovaný model https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/94_hou­sings_prediction_errors2.py
95 95_housings_histograms.py histogramy pro jednotlivé atributy (proměnné) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/95_hou­sings_histograms.py
96 96_housings_statistic.py statistické údaje pro jednotlivé atributy (proměnné) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/96_hou­sings_statistic.py
97 97_housings_statistic_normalized.py statistické údaje získané po normalizaci https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/97_hou­sings_statistic_normalized­.py
       
98 98_k_fold_help.py zobrazení nápovědy ke třídě s realizací k-foldingu https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/98_k_fol­d_help.py
99 99_k_fold_old.py původní (nepodporovaná) varianta provedení k-foldingu https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/99_k_fol­d_old.py
100 100_k_fold1.py interní chování algoritmu k-foldingu (základní parametry) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/100_k_fol­d1.py
101 101_k_fold2.py interní chování algoritmu k-foldingu (odlišné parametry) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/101_k_fol­d2.py
102 102_k_fold_selection.py k-folding a výběr dat pro otestování modelů https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/102_k_fol­d_selection.py
103 103_average_score.py realizace výpočtu průměrného skóre pro otestování modelů https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/103_a­verage_score.py
104 104_hyperparams_score.py změna hyperparametrů s výpočtem průměrného skóre (tabulka) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/104_hy­perparams_score.py
105 105_hyperparams_score_plot.py změna hyperparametrů s výpočtem průměrného skóre (graf) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/105_hy­perparams_score_plot.py
106 106_model_selection.py výběr nejlepšího modelu s využitím k-foldingu https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/106_mo­del_selection.py
107 107_features_selection_basic.py výběr atributů (proměnných) pro trénink modelu (základní varianta) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/107_fe­atures_selection_basic.py
108 108_features_selection_iris.py výběr atributů (proměnných) pro trénink modelu (datová sada Iris) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/108_fe­atures_selection_iris.py
109 109_features_selection_houses.py výběr atributů (proměnných) pro trénink modelu (datová sada California Housings) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/109_fe­atures_selection_houses.py
110 110_best_features_selection_houses.py získání nejlepší sady atributů (proměnných) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/110_bes­t_features_selection_houses­.py
111 111_features_selection_graphical.py výběr atributů (proměnných) pro trénink modelu (datová sada Iris), grafický výstup https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/111_fe­atures_selection_graphical­.py
       
112 112_simplest_linear_regression.py lineární regrese bodů ležících v rovině https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/112_sim­plest_linear_regression.py
113 113_linear_regression_no_intercept.py lineární regrese při vynucení w0=0 pro obecná data https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/113_li­near_regression_no_intercep­t.py
114 114_linear_regression_from0_0.py lineární regrese při vynucení w0=0 v případě, že vstupní body obsahují počátek souřadného systému https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/114_li­near_regression_from0_0.py
115 115_linear_regression_multiple_y.py model předpovídající pro každou vstupní hodnotu dvě výstupní hodnoty (odpovědi) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/115_li­near_regression_multiple_y­.py
116 116_grid_operations.py konstrukce matice obsahující souřadnice bodů v mřížce https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/116_grid_o­perations.py
117 117_linear_regression_multiple_x.py proložení bodů v prostoru rovinou https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/117_li­near_regression_multiple_x­.py
118 118_linear_regression_multiple_x.py proložení bodů s náhodnou výškou rovinou https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/118_li­near_regression_multiple_x­.py
119 119_linear_regression_mul­tiple_x_and_y.py proložení dvou sad bodů dvojicí rovin https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/119_li­near_regression_multiple_x_an­d_y.py
120 120_linear_regression_mul­tiple_x_and_y.py proložení dvou sad bodů dvojicí rovin https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/120_li­near_regression_multiple_x_an­d_y.py
121 121_linear_regression_poly.py základní polynomická regrese https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/121_li­near_regression_poly.py
122 122_linear_regression_poly_mul­tiple_x.py polynomická regrese a body v prostoru, první příklad https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/122_li­near_regression_poly_multi­ple_x.py
123 123_linear_regression_poly_mul­tiple_x.py polynomická regrese a body v prostoru, druhý příklad https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/123_li­near_regression_poly_multi­ple_x.py
       
124 124_iris_set_statistic.py získání statistických informací o datové sadě Iris https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/124_i­ris_set_statistic.py
125 125_california_housings_statistic.py získání statistických informací o datové sadě California Housings https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/125_ca­lifornia_housings_statistic­.py
126 126_variance_threshold1.py výběr atributů pro trénink modelu pomocí VarianceThreshold https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/126_va­riance_threshold1.py
127 127_variance_threshold2.py výběr atributů pro trénink modelu pomocí VarianceThreshold https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/127_va­riance_threshold2.py
128 128_variance_threshold3.py výběr atributů pro trénink modelu pomocí VarianceThreshold https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/128_va­riance_threshold3.py
129 129_select_best_iris.py výběr nejvhodnějších atributů pro datovou sadu Iris https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/129_se­lect_best_iris.py
130 130_select_best_housings.py výběr nejvhodnějších atributů pro datovou sadu California Housings https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/130_se­lect_best_housings.py
131 131_select_k_best_housings.py výběr K nejvhodnějších atributů pro datovou sadu California Housings https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/131_se­lect_k_best_housings.py
132 132_select_from_model.py výběr atributů na základě k tomu určeného modelu https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/132_se­lect_from_model.py
133 133_cross_validation1.py křížová validace po výběru (filtraci) modelů (datová sada Iris) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/133_cros­s_validation1.py
134 134_cross_validation2.py křížová validace po výběru (filtraci) modelů (datová sada California Housings) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/134_cros­s_validation2.py
135 135_cross_validation3.py křížová validace po výběru (filtraci) modelů https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/135_cros­s_validation3.py
       
136 136_mlp_classifier01.py použití neuronové sítě pro klasifikaci https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/136_mlp_clas­sifier01.py
137 137_mlp_classifier02.py výpočet úspěšnosti modelu založeného na neuronové síti https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/137_mlp_clas­sifier02.py
138 138_mlp_classifier03.py konfigurace vrstev neuronové sítě https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/138_mlp_clas­sifier03.py
139 139_mlp_classifier04.py proměnný počet neuronů ve vrstvách neuronové sítě https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/139_mlp_clas­sifier04.py
140 140_mlp_classifier05.py proměnný počet neuronů ve více vrstvách neuronové sítě https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/140_mlp_clas­sifier05.py
       
141 141_mlp_regression1.py použití neuronové sítě pro regresi https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/141_mlp_re­gression1.py
142 142_mlp_regression2.py modifikace parametrů neuronové sítě https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/142_mlp_re­gression2.py
143 143_mlp_regression2.py další modifikace parametrů neuronové sítě https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/143_mlp_re­gression2.py
144 144_mlp_regression3.py postupná změna počtu neuronů v jedné skryté vrstvě https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/144_mlp_re­gression3.py
145 145_mlp_regression4.py postupná změna počtu neuronů ve třech skrytých vrstvách https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/145_mlp_re­gression4.py
146 146_mlp_regression5.py postupná změna počtu neuronů v pěti skrytých vrstvách https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/146_mlp_re­gression5.py
147 147_mlp_regression6.py postupná změna počtu skrytých vrstev při zachování počtu neuronů v každé vrstvě https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/147_mlp_re­gression6.py
       
148 148_confusion_matrix1.py zjištění kvality modelu s využitím matice záměn (confusion matrix) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/148_con­fusion_matrix1.py
149 149_confusion_matrix2.py zjištění kvality modelu hledajícího K nejbližších sousedů https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/149_con­fusion_matrix2.py
150 150_confusion_matrix3.py zjištění kvality modelu tvořeného neuronovou sítí https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/150_con­fusion_matrix3.py
       
151 151_multiplication_table.py využití neuronové sítě pro odhad výsledků součinu https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/151_mul­tiplication_table.py
152 152_multiplication_table.py odhad/vygenerování celé matice malé násobilky neuronovou sítí https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/152_mul­tiplication_table.py
153 153_multiplication_table.py rozšíření výpočtu součinu na rozsah 20×20 (při zachování původní sítě) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/153_mul­tiplication_table.py
       
154 154_images1.py rozpoznání číslic modelem provádějícím logistickou regresi https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/154_i­mages1.py
155 155_images2.py rozpoznání číslic: využití modelu SVM (metoda podpůrných vektorů) pro klasifikaci obrázků https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/155_i­mages2.py
156 156_images3.py rozpoznání číslic: využití modelu pro hledání K nejbližších sousedů https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/156_i­mages3.py
157 157_images4.py rozpoznání rastrových obrázků neuronovou sítí https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/157_i­mages4.py
158 158_all_predictions.py zobrazení původních obrázků i predikovaných výsledků ve vizuální podobě https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/158_a­ll_predictions.py
159 159_wrong_predictions.py zobrazení 25 nekorektních odhadů modelu https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/159_wron­g_predictions.py
160 160_nn_wrong_predictions.py zobrazení 25 nekorektních odhadů neuronové sítě https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/160_nn_wron­g_predictions.py

V repositáři nalezneme taktéž projektový soubor a Jupyter Notebook s vysvětlením, jak lze modely využít pro rozpoznávání obsahu rastrových obrázků:

# Příklad Stručný popis Adresa příkladu
1 pyproject.toml projektový soubor (pro PDM) se všemi závislostmi https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/py­project.toml
       
2 pdm.lock lock soubor s konkrétními verzemi všech přímých i tranzitivních závislostí https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/pdm.lock
       
3 Rozpoznání_obrazu_scikit-learn.ipynb Jupyter notebook s celým postupem https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/Roz­poznání_obrazu_scikit-learn.ipynb
       
4 particle_life.py emergence: příklad vzniku struktury https://github.com/tisnik/most-popular-python-libs/blob/master/particles/par­ticle_life.py

20. Odkazy na Internetu

  1. Shluková analýza (clustering) a knihovna Scikit-learn
    https://www.root.cz/clanky/shlukova-analyza-clustering-a-knihovna-scikit-learn/
  2. Shluková analýza (clustering) a knihovna Scikit-learn (2)
    https://www.root.cz/clanky/shlukova-analyza-clustering-a-knihovna-scikit-learn-2/
  3. Shluková analýza (clustering) a knihovna Scikit-learn (z plochy do 3D prostoru)
    https://www.root.cz/clanky/shlukova-analyza-clustering-a-knihovna-scikit-learn-z-plochy-do-3d-prostoru/
  4. Rozpoznávání obrázků knihovnou Scikit-learn: první kroky
    https://www.root.cz/clanky/roz­poznavani-obrazku-knihovnou-scikit-learn-prvni-kroky/
  5. scikit-learn: Machine Learning in Python
    https://scikit-learn.org/stable/index.html
  6. Sklearn-pandas
    https://github.com/scikit-learn-contrib/sklearn-pandas
  7. sklearn-xarray
    https://github.com/phausamann/sklearn-xarray/
  8. Clustering
    https://scikit-learn.org/stable/modules/clus­tering.html
  9. Cluster analysis (Wikipedia)
    https://en.wikipedia.org/wi­ki/Cluster_analysis
  10. Shluková analýza (Wikipedia)
    https://cs.wikipedia.org/wi­ki/Shlukov%C3%A1_anal%C3%BDza
  11. K-means
    https://cs.wikipedia.org/wiki/K-means
  12. k-means clustering
    https://en.wikipedia.org/wiki/K-means_clustering
  13. Spectral clustering
    https://en.wikipedia.org/wi­ki/Spectral_clustering
  14. Emergence
    https://cs.wikipedia.org/wi­ki/Emergence
  15. Particle Life: Vivid structures from rudimentary rules
    https://particle-life.com/
  16. Hertzsprungův–Russellův diagram
    https://cs.wikipedia.org/wi­ki/Hertzsprung%C5%AFv%E2%80%93Rus­sell%C5%AFv_diagram
  17. Using Machine Learning in an HR Diagram
    https://cocalc.com/share/pu­blic_paths/08b6e03583cbdef3cdb98­13a54ec68ff773c747f
  18. Gaia H-R diagrams: Querying Gaia data for one million nearby stars
    https://vlas.dev/post/gaia-dr2-hrd/
  19. The Hertzsprung–Russell diagram
    https://scipython.com/book2/chapter-9-data-analysis-with-pandas/problems/p92/the-hertzsprung-russell-diagram/
  20. Animated Hertzsprung-Russell Diagram with 119,614 datapoints
    https://github.com/zonination/h-r-diagram
  21. Neuraxle Pipelines
    https://github.com/Neuraxio/Neuraxle
  22. scikit-learn: Getting Started
    https://scikit-learn.org/stable/getting_started.html
  23. Support Vector Machines
    https://scikit-learn.org/stable/modules/svm.html
  24. Use Deep Learning to Detect Programming Languages
    http://searene.me/2017/11/26/use-neural-networks-to-detect-programming-languages/
  25. Natural-language processing
    https://en.wikipedia.org/wiki/Natural-language_processing
  26. THE MNIST DATABASE of handwritten digits
    http://yann.lecun.com/exdb/mnist/
  27. MNIST database (Wikipedia)
    https://en.wikipedia.org/wi­ki/MNIST_database
  28. MNIST For ML Beginners
    https://www.tensorflow.or­g/get_started/mnist/begin­ners
  29. Stránka projektu Torch
    http://torch.ch/
  30. Torch: Serialization
    https://github.com/torch/tor­ch7/blob/master/doc/seria­lization.md
  31. Torch: modul image
    https://github.com/torch/i­mage/blob/master/README.md
  32. Data pro neuronové sítě
    http://archive.ics.uci.edu/ml/in­dex.php
  33. Torch na GitHubu (několik repositářů)
    https://github.com/torch
  34. Torch (machine learning), Wikipedia
    https://en.wikipedia.org/wi­ki/Torch_%28machine_learnin­g%29
  35. Torch Package Reference Manual
    https://github.com/torch/tor­ch7/blob/master/README.md
  36. Torch Cheatsheet
    https://github.com/torch/tor­ch7/wiki/Cheatsheet
  37. Neural network containres (Torch)
    https://github.com/torch/nn/blob/mas­ter/doc/containers.md
  38. Simple layers
    https://github.com/torch/nn/blob/mas­ter/doc/simple.md#nn.Line­ar
  39. Transfer Function Layers
    https://github.com/torch/nn/blob/mas­ter/doc/transfer.md#nn.tran­sfer.dok
  40. Feedforward neural network
    https://en.wikipedia.org/wi­ki/Feedforward_neural_net­work
  41. Biologické algoritmy (4) – Neuronové sítě
    https://www.root.cz/clanky/biologicke-algoritmy-4-neuronove-site/
  42. Biologické algoritmy (5) – Neuronové sítě
    https://www.root.cz/clanky/biologicke-algoritmy-5-neuronove-site/
  43. Umělá neuronová síť (Wikipedia)
    https://cs.wikipedia.org/wi­ki/Um%C4%9Bl%C3%A1_neuronov%C3%A1_s%C3%AD%C5%A5
  44. PyTorch
    http://pytorch.org/
  45. JupyterLite na PyPi
    https://pypi.org/project/jupyterlite/
  46. JupyterLite na GitHubu
    https://github.com/jupyter­lite/jupyterlite
  47. Dokumentace k projektu JupyterLite
    https://github.com/jupyter­lite/jupyterlite
  48. Matplotlib Home Page
    http://matplotlib.org/
  49. Matplotlib (Wikipedia)
    https://en.wikipedia.org/wi­ki/Matplotlib
  50. Popis barvových map modulu matplotlib.cm
    https://gist.github.com/en­dolith/2719900#id7
  51. Ukázky (palety) barvových map modulu matplotlib.cm
    http://matplotlib.org/exam­ples/color/colormaps_refe­rence.html
  52. Galerie grafů vytvořených v Matplotlibu
    https://matplotlib.org/3.2.1/gallery/
  53. 3D rendering
    https://en.wikipedia.org/wi­ki/3D_rendering
  54. 3D computer graphics
    https://en.wikipedia.org/wi­ki/3D_computer_graphics
  55. Primary 3D view planes
    https://matplotlib.org/sta­ble/gallery/mplot3d/view_pla­nes_3d.html
  56. Getting started in scikit-learn with the famous iris dataset
    https://www.youtube.com/wat­ch?v=hd1W4CyPX58
  57. Training a machine learning model with scikit-learn
    https://www.youtube.com/wat­ch?v=RlQuVL6-qe8
  58. Iris (plant)
    https://en.wikipedia.org/wi­ki/Iris_(plant)
  59. Kosatec
    https://cs.wikipedia.org/wiki/Kosatec
  60. Iris setosa
    https://en.wikipedia.org/wi­ki/Iris_setosa
  61. Iris versicolor
    https://en.wikipedia.org/wi­ki/Iris_versicolor
  62. Iris virginica
    https://en.wikipedia.org/wi­ki/Iris_virginica
  63. Druh
    https://cs.wikipedia.org/wiki/Druh
  64. Iris subg. Limniris
    https://en.wikipedia.org/wi­ki/Iris_subg._Limniris
  65. Iris Dataset Classification with Python: A Tutorial
    https://www.pycodemates.com/2022/05/i­ris-dataset-classification-with-python.html
  66. Iris flower data set
    https://en.wikipedia.org/wi­ki/Iris_flower_data_set
  67. List of datasets for machine-learning research
    https://en.wikipedia.org/wi­ki/List_of_datasets_for_machi­ne-learning_research
  68. Analýza hlavních komponent
    https://cs.wikipedia.org/wi­ki/Anal%C3%BDza_hlavn%C3%AD­ch_komponent
  69. Principal component analysis
    https://en.wikipedia.org/wi­ki/Principal_component_ana­lysis
  70. Scikit-learn Crash Course – Machine Learning Library for Python
    https://www.youtube.com/wat­ch?v=0B5eIE_1vpU
  71. calm-notebooks
    https://github.com/koaning/calm-notebooks
  72. Should you teach Python or R for data science?
    https://www.dataschool.io/python-or-r-for-data-science/
  73. nbviewer: A simple way to share Jupyter Notebooks
    https://nbviewer.org/
  74. AI vs Machine Learning (Youtube)
    https://www.youtube.com/wat­ch?v=4RixMPF4×is
  75. Machine Learning | What Is Machine Learning? | Introduction To Machine Learning | 2024 | Simplilearn (Youtube)
    https://www.youtube.com/wat­ch?v=ukzFI9rgwfU
  76. A Gentle Introduction to Machine Learning (Youtube)
    https://www.youtube.com/wat­ch?v=Gv9_4yMHFhI
  77. Machine Learning vs Deep Learning
    https://www.youtube.com/wat­ch?v=q6kJ71tEYqM
  78. Umělá inteligence (slajdy)
    https://slideplayer.cz/sli­de/12119218/
  79. Úvod do umělé inteligence
    https://slideplayer.cz/slide/2505525/
  80. Umělá inteligence I / Artificial Intelligence I
    https://ktiml.mff.cuni.cz/~bartak/ui/
  81. Matplotlib vs. seaborn vs. Plotly vs. MATLAB vs. ggplot2 vs. pandas
    https://ritza.co/articles/matplotlib-vs-seaborn-vs-plotly-vs-MATLAB-vs-ggplot2-vs-pandas/
  82. Matplotlib, Seaborn or Plotnine?
    https://www.reddit.com/r/da­tascience/comments/jvrqxt/mat­plotlib_seaborn_or_plotni­ne/
  83. @Rabeez: Rabeez/plotting_comparison.ipynb
    https://gist.github.com/Ra­beez/ffc0b59d4a41e20fa8d94­4c44a96adbc
  84. Matplotlib, Seaborn, Plotly and Plotnine Comparison
    https://python.plainenglish­.io/matplotlib-seaborn-plotly-and-plotnine-comparison-baf2db5a9c40
  85. Data Visualization 101: How to Choose a Python Plotting Library
    https://towardsdatascience.com/data-visualization-101-how-to-choose-a-python-plotting-library-853460a08a8a
  86. Data science in Python: pandas, seaborn, scikit-learn
    https://www.youtube.com/wat­ch?v=3ZWuPVWq7p4
  87. 7.2. Real world datasets
    https://scikit-learn.org/stable/datasets/re­al_world.html#california-housing-dataset
  88. 7.2.7. California Housing dataset
    https://scikit-learn.org/stable/datasets/re­al_world.html#california-housing-dataset
  89. Comprehensive Guide to Classification Models in Scikit-Learn
    https://www.geeksforgeeks­.org/comprehensive-guide-to-classification-models-in-scikit-learn/
  90. Tidy Data Visualization: ggplot2 vs seaborn
    https://blog.tidy-intelligence.com/posts/ggplot2-vs-seaborn/
  91. seaborn: statistical data visualization
    https://seaborn.pydata.org/
  92. Linear regression (Wikipedia)
    https://en.wikipedia.org/wi­ki/Linear_regression
  93. Lineární regrese (Wikipedia)
    https://cs.wikipedia.org/wi­ki/Line%C3%A1rn%C3%AD_regre­se
  94. Iris Flower Classification with MLP Classifier
    https://www.metriccoders.com/post/iris-flower-classification-with-mlp-classifier

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.