수색…
비고
주제는 모든 기계 학습 알고리즘에 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- 가장 가까운 이웃
이 알고리즘의 classfier는 두 개의 매개 변수를 취하며 다음과 같이 초기화 될 수 있습니다.
$classifier = new KNearestNeighbors($neighbor_num=4);
$classifier = new KNearestNeighbors($neighbor_num=3, new Minkowski($lambda=4));
$neighbor_num 은 knn 알고리즘에서 스캔 할 가장 가까운 이웃 수이고 두 번째 매개 변수는 기본적으로 첫 번째 경우 Euclidean 거리 메트릭입니다. Minkowski에 대한 자세한 내용은 여기에서 확인할 수 있습니다.
다음은이 분류 기준을 사용하는 방법에 대한 간단한 예입니다.
// 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은 다음 회귀 알고리즘을 지원합니다.
- 지원 벡터 회귀
- 최소 선형 회귀 분석
회귀 분석은 분류에 사용 된 것과 동일한 train 및 predict 방법을 사용합니다.
지원 벡터 회귀
이것은 SVM (Support Vector Machine)에 대한 회귀 버전입니다. 분류와 같은 첫 번째 단계는 모델을 학습하는 것입니다.
// 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 은 분류와 반대로 등급 $targets 가 아닙니다. 이것은 둘의 차별화 요소 중 하나입니다. 우리 모델을 데이터로 훈련 한 후에 실제 예측으로 시작할 수 있습니다.
$regression->predict([64]) // return 4.03
예측은 대상 외부의 값을 반환합니다.
최소 선형 회귀 분석
이 알고리즘은 솔루션을 근사하기 위해 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은 다음 클러스터링 알고리즘을 지원합니다.
- 케이 - 수단
- dbscan
케이 - 수단
k-Means는 데이터를 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]]]
출력은 KMeans 생성자의 n 값이기 때문에 출력에는 3 개의 배열이 들어 있습니다. 생성자에는 initialization method 가 될 수있는 선택적인 두 번째 매개 변수가있을 수도 있습니다. 예를 들어
$kmeans = new KMeans(4, KMeans::INIT_RANDOM);
INIT_RANDOM 은 클러스터를 판별하는 동안 완전히 무작위 중심을 배치합니다. 하지만 중심으로부터 너무 멀리 떨어져있는 것을 피하기 위해 데이터의 공간 경계에 묶여 있습니다.
기본 생성자 initialization method 는 프로세스를 가속화하기 위해 센트 로이드를 현명한 방식으로 선택하는 kmeans ++ 입니다.
DBSCAN
KMeans 와는 반대로 DBSCAN 은 밀도 기반 클러스터링 알고리즘으로, 결과에서 원하는 클러스터 수를 결정하는 n 을 전달하지 않습니다. 반면에이 작업을하려면 두 개의 매개 변수가 필요합니다.
- $ minSamples : 클러스터에 있어야하는 최소 객체 수
- $ 엡실론 : 같은 클러스터에서 두 샘플 사이의 최대 거리를 고려합니다.
같은 간단한 샘플은 다음과 같습니다.
// 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에 널리 사용됩니다. 콘텐츠 게시 응용 프로그램이 있다고 가정하십시오. 이제는 사용자를 유지하기 위해 자신이 좋아하는 콘텐츠를 살펴 봐야합니다. 단순함을 위해 특정 웹 페이지에 1 분 이상 머물러 있고 그 내용이 마음에 들지 않으면 맨 아래로 내려 앉는다고 가정합니다. 이제 각 콘텐츠에 고유 식별자가 있고 사용자도 고유 식별자를 갖게됩니다. 이를 기반으로 클러스터를 만들면 비슷한 콘텐츠 취향을 가진 사용자 세그먼트를 알 수 있습니다. 동일한 클러스터의 일부 사용자가 기사를 좋아한다면 다른 사용자도 응용 프로그램에 대한 권장 사항으로 표시 될 수 있다고 가정 할 수있는 추천 시스템에서 사용할 수 있습니다.