PHP-ML – prac ciąg dalszy

php-mlKolejne dwa tygodnie konkursu „Daj się poznać” za nami. Sprawdźmy co udało się dokonać w kwestii rozwoju biblioteki PHP-ML.

Jak pisałem wcześniej (Postępy w pracy nad PHP-ML) miałem drobne problemy z motywacją i rozpoczęciem prac na biblioteką do ML. Aby rozwiązać ten problem, wspomogłem się dość prostą aplikacją o nazwie Forest. Odliczała ona określoną ilość czasu i jeżeli przez ten okres nie korzystamy z telefonu (czyli teoretycznie robimy coś tam sobie założonego i pożytecznego) to punktował sukces.

Muszę stwierdzić, że był to idealny strzał. Codziennie staram się poświęcić około 30 minut i jak do tej pory to działa. Czasami nawet nie potrzebuję uruchamiać do tego Foresta. Oczywiście, są dni kiedy w 30 minut nie uda mi się stworzyć logicznego i działającego fragmentu kodu, to jednak widać ewidentny postęp prac i przyrost comitów (zielono !!!):

screenshot-github.com 2016-04-24 21-20-28

 

PHP-ML

Na dzień dzisiejszy udało mi się zaimplementować dwa (bardzo uproszczone) algorytmy klasyfikacji: K Nearest Neighbors oraz Naive Bayes. Sposób użycia wygląda następująco:

use Phpml\Classifier\KNearestNeighbors;

$samples = [[1, 3], [1, 4], [2, 4], [3, 1], [4, 1], [4, 2]];
$labels = ['a', 'a', 'a', 'b', 'b', 'b'];

$classifier = new KNearestNeighbors();
$classifier->train($samples, $labels);

$classifier->predict([3, 2]); 
// return 'b'

Deklarujmy próbki wejściowe $samples i ich etykiety $labels, a następnie poprzez metodę predict() przewidujemy etykietę dla próbki, która nie występowała w zbiorze uczącym.

Zaimplementowałem również parę narzędzi: do pomiaru sprawności algorytmów klasyfikujących

use Phpml\Metric\Accuracy;

Accuracy::score($actualLabels, $predictedLabels);

Oraz do tzw. walidacji krzyżowej (o której będzie osobny wpis):

use Phpml\CrossValidation\RandomSplit;
use Phpml\Dataset\ArrayDataset;

$dataset = new ArrayDataset(
    $samples = [[1], [2], [3], [4]],
    $labels = ['a', 'a', 'b', 'b']
);

$randomSplit = new RandomSplit($dataset, $testSize = 0.5);

$randomSplit->getTestSamples();
$randomSplit->getTrainSamples();

$randomSplit2->getTestLabels();
$randomSplit1->getTrainLabels();

Dodatkowo bibliotek posiada kila przykładowych zbiorów danych, które można w łatwy i szybki sposób użyć do przetestowania algorytmów:

use Phpml\Dataset\Demo\Iris;

$irisDataset = new Iris();

$irisDataset->getSamples();
$irisDataset->getLabels();

Na ten moment natrafiłem na problem z implementacją SVM (Support Vector Machine). Jest to trudniejsze niż myślałem i wymaga głębszego poznania algorytmu a więc i więcej czasu, ale na pewno to rozgryzę.

 

Blogowanie

W między czasie udało mi się też utworzyć parę wpisów (powinny być 4, więc muszę zacząć nadrabiać)

Publikacja własnej biblioteki PHP z użyciem GitHub i Composer

Red Green Refactor – testy jednostkowe

Ciągła integracja i Travis CI

 

Całość (blogowanie i kodowanie) pochłania sporo czasu, ale jestem pewien, że zdobyte w ten sposób doświadczenie, wróci się z nawiązką. Jeżeli macie jakieś pytania lub uwagi to zapraszam do komentowania.

Zdjęcie z wpisu: Flickr.



Więcej w Programowanie
Ciągła integracja i Travis CI

W tym wpisie odpowiemy na pytania: co to jest ciągła integracja oraz jak wykonywać ją sprawnie z pomocą usługi Travis...

Zamknij