Szukaj…


Uwagi

Temat wykorzystuje PHP-ML dla wszystkich algorytmów uczenia maszynowego. Instalację biblioteki można wykonać za pomocą

composer require php-ai/php-ml

Repozytorium github dla tego samego można znaleźć tutaj .

Warto również zauważyć, że podane przykłady są bardzo małym zbiorem danych wyłącznie w celu demonstracji. Rzeczywisty zestaw danych powinien być bardziej wyczerpujący.

Klasyfikacja za pomocą PHP-ML

Klasyfikacja w uczeniu maszynowym to problem określający, do którego zestawu kategorii należy nowa obserwacja. Klasyfikacja należy do kategorii Supervised Machine Learning .

Każdy algorytm implementujący klasyfikację jest znany jako klasyfikator

Klasyfikatory obsługiwane w PHP-ML to

  • SVC (klasyfikacja wektorów wsparcia)
  • k-Najbliżsi sąsiedzi
  • Naiwny Bayes

Metoda train i predict jest taka sama dla wszystkich klasyfikatorów. Jedyną różnicą byłby zastosowany algorytm bazowy.

SVC (klasyfikacja wektorów wsparcia)

Zanim zaczniemy przewidywać nową obserwację, musimy wyszkolić naszego klasyfikatora. Rozważ następujący kod

// Import library
use Phpml\Classification\SVC;
use Phpml\SupportVectorMachine\Kernel;

// Data for training classifier
$samples = [[1, 3], [1, 4], [2, 4], [3, 1], [4, 1], [4, 2]];  // Training samples
$labels = ['a', 'a', 'a', 'b', 'b', 'b'];

// Initialize the classifier
$classifier = new SVC(Kernel::LINEAR, $cost = 1000);
// Train the classifier
$classifier->train($samples, $labels);

Kod jest dość prosty. Zastosowany powyżej $cost jest miarą tego, jak bardzo chcemy uniknąć błędnej klasyfikacji każdego przykładu szkolenia. Przy mniejszej wartości $cost możesz dostać błędnie sklasyfikowane przykłady. Domyślnie jest ustawiony na 1.0

Teraz, gdy mamy przeszkolonego klasyfikatora, możemy zacząć robić pewne rzeczywiste prognozy. Rozważ następujące kody, które mamy dla prognoz

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

Klasyfikator w powyższym przypadku może pobierać niesklasyfikowane próbki i przewiduje tam etykiety. metoda predict może pobrać pojedynczą próbkę, a także tablicę próbek.

k-Najbliżsi sąsiedzi

Classfier dla tego algorytmu przyjmuje dwa parametry i może być zainicjowany jak

$classifier = new KNearestNeighbors($neighbor_num=4);
$classifier = new KNearestNeighbors($neighbor_num=3, new Minkowski($lambda=4));

$neighbor_num numer_ $neighbor_num to liczba najbliższych sąsiadów do skanowania w algorytmie knn , natomiast drugim parametrem jest metryka odległości, która domyślnie w pierwszym przypadku byłaby Euclidean . Więcej na temat Minkowskiego można znaleźć tutaj .

Poniżej znajduje się krótki przykład użycia tego klasyfikatora

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

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

// Make predictions
$classifier->predict([3, 2]); // return 'b'
$classifier->predict([[3, 2], [1, 5]]); // return ['b', 'a']

NaiveBayes Classifier

NaiveBayes Classifier opiera się na Bayes' theorem i nie wymaga żadnych parametrów w konstruktorze.

Poniższy kod demonstruje prostą implementację predykcji

// Training data
$samples = [[5, 1, 1], [1, 5, 1], [1, 1, 5]];
$labels = ['a', 'b', 'c'];

// Initialize classifier
$classifier = new NaiveBayes();
// Train classifier
$classifier->train($samples, $labels);

// Make predictions
$classifier->predict([3, 1, 1]); // return 'a'
$classifier->predict([[3, 1, 1], [1, 4, 1]); // return ['a', 'b']

Praktyczny przypadek

Do tej pory używaliśmy tylko tablic liczb całkowitych we wszystkich naszych przypadkach, ale tak nie jest w prawdziwym życiu. Dlatego postaram się opisać praktyczną sytuację dotyczącą używania klasyfikatorów.

Załóżmy, że masz aplikację, która przechowuje cechy kwiatów w naturze. Dla uproszczenia możemy rozważyć kolor i długość płatków. Zatem do szkolenia naszych danych wykorzystano by dwie cechy. color jest prostszy, w którym można przypisać wartość int do każdego z nich, a dla długości możesz mieć zakres taki jak (0 mm,10 mm)=1 , (10 mm,20 mm)=2 . Z początkowymi danymi wytrenuj klasyfikator. Teraz jeden z Twoich użytkowników musi zidentyfikować rodzaj kwiatu rosnącego na jego podwórku. To, co robi, to wybrać color kwiatu i dodaje długość płatków. Twój działający klasyfikator może wykryć rodzaj kwiatu („Etykiety w powyższym przykładzie”)

Regresja

W klasyfikacji za pomocą PHP-ML przypisaliśmy etykiety do nowej obserwacji. Regresja jest prawie taka sama, z tą różnicą, że wartość wyjściowa nie jest etykietą klasy, ale wartością ciągłą. Jest szeroko stosowany do prognoz i prognoz. PHP-ML obsługuje następujące algorytmy regresji

  • Obsługa regresji wektorowej
  • Regresja liniowa LeastSquares

Regresja ma takie same metody train i predict , jakie zastosowano w klasyfikacji.

Obsługa regresji wektorowej

To jest wersja regresyjna dla SVM (Support Vector Machine). Pierwszym krokiem, podobnie jak w klasyfikacji, jest wyszkolenie naszego modelu.

// Import library
use Phpml\Regression\SVR;
use Phpml\SupportVectorMachine\Kernel;

// Training data
$samples = [[60], [61], [62], [63], [65]];
$targets = [3.1, 3.6, 3.8, 4, 4.1];

// Initialize regression engine
$regression = new SVR(Kernel::LINEAR);
// Train regression engine
$regression->train($samples, $targets);

W regresji $targets nie są etykietami klasowymi w przeciwieństwie do klasyfikacji. Jest to jeden z czynników różnicujących te dwa elementy. Po przeszkoleniu naszego modelu w danych możemy zacząć od rzeczywistych prognoz

$regression->predict([64])  // return 4.03

Zauważ, że prognozy zwracają wartość poza celem.

Regresja liniowa LeastSquares

Algorytm ten wykorzystuje least squares method do przybliżenia rozwiązania. Poniżej przedstawiono prosty kod szkolenia i prognozowania

// Training data
$samples = [[60], [61], [62], [63], [65]];
$targets = [3.1, 3.6, 3.8, 4, 4.1];

// Initialize regression engine
$regression = new LeastSquares();
// Train engine
$regression->train($samples, $targets);
// Predict using trained engine
$regression->predict([64]); // return 4.06

PHP-ML zapewnia również opcję Multiple Linear Regression . Przykładowy kod tego samego może wyglądać następująco

$samples = [[73676, 1996], [77006, 1998], [10565, 2000], [146088, 1995], [15000, 2001], [65940, 2000], [9300, 2000], [93739, 1996], [153260, 1994], [17764, 2002], [57000, 1998], [15000, 2000]];
$targets = [2000, 2750, 15500, 960, 4400, 8800, 7100, 2550, 1025, 5900, 4600, 4400];

$regression = new LeastSquares();
$regression->train($samples, $targets);
$regression->predict([60000, 1996]) // return 4094.82

Multiple Linear Regression jest szczególnie przydatna, gdy wiele czynników lub cech identyfikuje wynik.

Praktyczny przypadek

Teraz weźmy zastosowanie regresji w prawdziwym scenariuszu.

Załóżmy, że prowadzisz bardzo popularną stronę internetową, ale ruch ciągle się zmienia. Potrzebujesz rozwiązania, które przewidywałoby liczbę serwerów, które musisz wdrożyć w danym momencie. Załóżmy ze względu na to, że twój dostawca hostingu udostępnia interfejs API do odradzania serwerów, a uruchomienie każdego serwera zajmuje 15 minut. Na podstawie wcześniejszych danych o ruchu i regresji możesz przewidzieć ruch, który uderzyłby w Twoją aplikację w dowolnym momencie. Korzystając z tej wiedzy, możesz uruchomić serwer 15 minut przed wzrostem, zapobiegając w ten sposób przejściu aplikacji w tryb offline.

Grupowanie

Grupowanie polega na grupowaniu podobnych obiektów razem. Jest szeroko stosowany do rozpoznawania wzorców. Clustering odbywa się pod nadzorem unsupervised machine learning , dlatego nie jest potrzebne szkolenie. PHP-ML obsługuje następujące algorytmy grupowania

  • k-oznacza
  • dbscan

k-oznacza

k-Means dzieli dane na n grup o jednakowej wariancji. Oznacza to, że musimy podać liczbę n która byłaby liczbą klastrów potrzebnych w naszym rozwiązaniu. Poniższy kod pomoże zwiększyć przejrzystość

// Our data set
$samples = [[1, 1], [8, 7], [1, 2], [7, 8], [2, 1], [8, 9]];

// Initialize clustering with parameter `n`
$kmeans = new KMeans(3);
$kmeans->cluster($samples); // return [0=>[[7, 8]], 1=>[[8, 7]], 2=>[[1,1]]]

Należy zauważyć, że sygnał wyjściowy zawiera 3 macierzy, ponieważ ponieważ była wartość n w KMeans konstruktora. W konstruktorze może być również opcjonalny drugi parametr, który byłby initialization method . Na przykład rozważ

$kmeans = new KMeans(4, KMeans::INIT_RANDOM);

INIT_RANDOM umieszcza całkowicie losowy środek ciężkości podczas próby ustalenia klastrów. Ale aby uniknąć tego, że środek ciężkości znajduje się zbyt daleko od danych, jest on związany granicami przestrzeni danych.

Domyślną initialization method konstruktora jest kmeans ++, który w inteligentny sposób wybiera środek ciężkości, aby przyspieszyć proces.

DBSCAN

W przeciwieństwie do KMeans , DBSCAN jest algorytmem klastrowania opartym na gęstości, co oznacza, że nie przepuszczalibyśmy n który określałby liczbę klastrów, które chcemy w naszym wyniku. Z drugiej strony wymaga to dwóch parametrów do działania

  1. $ minSamples: minimalna liczba obiektów, które powinny znajdować się w klastrze
  2. $ epsilon: Jaka jest maksymalna odległość między dwiema próbkami, aby można je było traktować jak w tej samej grupie.

Szybka próbka tego samego jest następująca

// Our sample data set
$samples = [[1, 1], [8, 7], [1, 2], [7, 8], [2, 1], [8, 9]];

$dbscan = new DBSCAN($epsilon = 2, $minSamples = 3);
$dbscan->cluster($samples); // return [0=>[[1, 1]], 1=>[[8, 7]]]

Kod jest dość oczywisty. Jedną z głównych różnic jest to, że nie ma możliwości poznania liczby elementów w tablicy wyjściowej w przeciwieństwie do KMeans.

Praktyczny przypadek

Przyjrzyjmy się teraz zastosowaniu klastrowania w prawdziwym scenariuszu

Klastrowanie jest szeroko stosowane w pattern recognition i data mining . Rozważ, że masz aplikację do publikowania treści. Teraz, aby zatrzymać użytkowników, powinni spojrzeć na treści, które kochają. Załóżmy, dla uproszczenia, że jeśli są na określonej stronie internetowej przez ponad minutę i przewracają się do dołu, to uwielbiają tę treść. Teraz każda twoja treść będzie miała niepowtarzalny identyfikator, podobnie jak użytkownik. Utwórz klaster na tej podstawie, a dowiesz się, który segment użytkowników ma podobny gust treści. To z kolei można wykorzystać w systemie rekomendacji, w którym można założyć, że jeśli niektórzy użytkownicy tego samego klastra polubią ten artykuł, to inni również, a to może być pokazane jako rekomendacje w Twojej aplikacji.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow