Поиск…


замечания

В этом разделе используется PHP-ML для всех алгоритмов машинного обучения. Установка библиотеки может быть выполнена с использованием

composer require php-ai/php-ml

Хранилище GitHub для того же самого можно найти здесь .

Также стоит отметить, что приведенные примеры очень малы для набора данных только для демонстрации. Фактический набор данных должен быть более полным, чем это.

Классификация с использованием PHP-ML

Классификация в машинном обучении - это проблема, которая определяет, к какому набору категорий относится новое наблюдение. Классификация относится к категории Supervised Machine Learning .

Любой алгоритм, реализующий классификацию, известен как классификатор

Классификаторы, поддерживаемые в PHP-ML, являются

  • SVC (поддержка векторной классификации)
  • k-Ближайшие соседи
  • Наивный Байес

Метод train и predict одинаковый для всех классификаторов. Единственное различие заключается в использовании базового алгоритма.

SVC (поддержка векторной классификации)

Прежде чем мы сможем начать с предсказания нового наблюдения, нам нужно обучить наш классификатор. Рассмотрим следующий код

// 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);

Код довольно прямолинейный. $cost использованная выше, является мерой того, насколько мы хотим избежать ошибочной классификации каждого примера обучения. Для меньшего значения $cost вы можете получить ошибочные примеры. По умолчанию установлено значение 1.0

Теперь, когда мы подготовили классификатор, мы можем начать делать некоторые фактические прогнозы. Рассмотрим следующие коды, которые мы имеем для предсказаний

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

Классификатор в приведенном выше случае может принимать неклассифицированные образцы и предсказывает там метки. метод predict может принимать один образец, а также массив выборок.

k-Ближайшие соседи

Класс для этого алгоритма принимает два параметра и может быть инициализирован как

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

$neighbor_num neighbin_num - это число ближайших соседей для сканирования в алгоритме knn , а второй параметр - метрика расстояния, которая по умолчанию в первом случае будет Euclidean . Подробнее о Минковском можно найти здесь .

Ниже приведен краткий пример того, как использовать этот классификатор

// 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

NaiveBayes Classifier основан на Bayes' theorem и не нуждается в каких-либо параметрах в конструкторе.

Следующий код демонстрирует простую реализацию прогнозирования

// 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']

Практический случай

До сих пор мы использовали только массивы целого во всем нашем случае, но это не так в реальной жизни. Поэтому позвольте мне попытаться описать практическую ситуацию, как использовать классификаторы.

Предположим, у вас есть приложение, в котором хранятся характеристики цветов в природе. Для простоты мы можем рассмотреть цвет и длину лепестков. Таким образом, для обучения наших данных будут использоваться две характеристики. color является более простым, где вы можете назначить значение int каждому из них и по длине, вы можете иметь такой диапазон, как (0 mm,10 mm)=1 , (10 mm,20 mm)=2 . С исходными данными поезда ваш классификатор. Теперь одному из ваших пользователей нужно определить цвет, который растет на заднем дворе. То, что он делает, - это выбрать color цветка и добавить длину лепестков. Вы запускаете классификатор для определения типа цветка («Ярлыки в примере выше»)

регрессия

В классификации с использованием PHP-ML мы назначили метки для нового наблюдения. Регрессия почти то же самое с разницей в том, что выходное значение не является меткой класса, а непрерывным значением. Он широко используется для прогнозирования и прогнозирования. PHP-ML поддерживает следующие алгоритмы регрессии

  • Поддержка векторной регрессии
  • Линейная регрессия LeastSquares

Регрессия имеет те же методы train и predict которые используются в классификации.

Поддержка векторной регрессии

Это версия регрессии для SVM (поддержка векторной машины). Первым шагом, как в классификации, является обучение нашей модели.

// 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);

В регрессии $targets не являются метками классов, а не классификацией. Это один из факторов дифференциации для двух. После обучения нашей модели с данными мы можем начать с фактических прогнозов

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

Обратите внимание, что предсказания возвращают значение вне цели.

Линейная регрессия LeastSquares

Этот алгоритм использует least squares method для приближения решения. Ниже приведен простой код обучения и прогнозирования

// 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 также предоставляет возможность Multiple Linear Regression . Пример кода для него может быть следующим:

$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 особенно полезна, когда несколько факторов или признаков определяют результат.

Практический случай

Теперь давайте рассмотрим применение регрессии в сценарии реальной жизни.

Предположим, вы запустили очень популярный веб-сайт, но трафик продолжает меняться. Вам нужно решение, которое будет прогнозировать количество серверов, которые необходимо развернуть в любой момент времени. Предположим, что ваш хостинг-провайдер дает вам api для выдачи серверов, и каждый сервер занимает 15 минут для загрузки. Основываясь на предыдущих данных трафика и регрессии, вы можете прогнозировать трафик, который ударил бы ваше приложение в любой момент времени. Используя эти знания, вы можете запустить сервер за 15 минут до всплеска, тем самым не позволяя вашему приложению отключиться.

Кластеризация

Кластеризация - это группировка похожих объектов. Он широко используется для распознавания образов. Clustering происходит под unsupervised machine learning , поэтому нет необходимости в обучении. PHP-ML поддерживает следующие алгоритмы кластеризации

  • K-средства
  • dbscan

K-средства

k-Средства отделяют данные от n групп с одинаковой дисперсией. Это означает, что нам нужно передать число n которое будет числом кластеров, которые нам нужны в нашем решении. Следующий код поможет повысить ясность

// 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]]]

Обратите внимание, что вывод содержит 3 массива, потому что это было значение n в конструкторе KMeans . Также может быть необязательный второй параметр в конструкторе, который будет initialization method . Например, рассмотрим

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

INIT_RANDOM помещает полностью случайный центроид, пытаясь определить кластеры. Но чтобы избежать центроида, находящегося слишком далеко от данных, он связан пространственными границами данных.

Метод initialization method конструктора по умолчанию - kmeans ++, который выбирает центроид умным способом ускорения процесса.

DBSCAN

В отличие от KMeans , DBSCAN - это алгоритм кластеризации на основе плотности, что означает, что мы не будем передавать n чтобы определить количество кластеров, которые мы хотим в нашем результате. С другой стороны, для этого требуется два параметра:

  1. $ minSamples: минимальное количество объектов, которые должны присутствовать в кластере
  2. $ epsilon: какое максимальное расстояние между двумя образцами для них можно рассматривать как в одном кластере.

Быстрая выборка для одного и того же выглядит следующим образом

// 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]]]

Код в значительной степени объясняет себя. Одно существенное отличие состоит в том, что нет способа узнать количество элементов в выходном массиве, а не KMeans.

Практический пример

Давайте теперь рассмотрим использование кластеризации в реальном сценарии

Кластеризация широко используется при pattern recognition и data mining . Учтите, что у вас есть приложение для публикации контента. Теперь, чтобы сохранить ваших пользователей, они должны смотреть на контент, который им нравится. Предположим для простоты, что если они находятся на определенной веб-странице в течение более минуты, и они сворачиваются на дно, тогда они любят этот контент. Теперь каждый ваш контент будет иметь уникальный идентификатор с ним, и так будет и пользователь. Создайте кластер на основе этого, и вы узнаете, какой сегмент пользователей имеет похожий контентный вкус. Это, в свою очередь, может быть использовано в системе рекомендаций, где вы можете предположить, что если некоторые пользователи одного и того же кластера любят статью, то это будут другие, и это может быть показано в качестве рекомендаций для вашего приложения.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow