수색…


비고

주제는 모든 기계 학습 알고리즘에 PHP-ML을 사용합니다. 라이브러리 설치는 다음을 사용하여 수행 할 수 있습니다.

composer require php-ai/php-ml

같은 github 저장소는 여기 에서 찾을 수 있습니다 .

또한 주어진 예제가 데모 목적으로 만 만들어진 매우 작은 데이터 세트라는 점도 주목할 가치가 있습니다. 실제 데이터 세트는 그보다 더 포괄적이어야합니다.

PHP-ML을 이용한 분류

기계 학습에서의 분류는 새로운 관찰이 속한 범주 집합을 식별하는 문제입니다. 분류는 Supervised Machine Learning 의 범주에 속합니다.

분류를 구현하는 모든 알고리즘은 분류로 알려져있다

PHP-ML에서 지원되는 분류 기준은

  • SVC (지원 벡터 분류)
  • k- 가장 가까운 이웃
  • 나이브 베이 즈

trainpredict 방법은 모든 분류 기준에서 동일합니다. 유일한 차이점은 사용 된 기본 알고리즘에 있습니다.

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_numknn 알고리즘에서 스캔 할 가장 가까운 이웃 수이고 두 번째 매개 변수는 기본적으로 첫 번째 경우 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 ClassifierBayes' 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은 다음 회귀 알고리즘을 지원합니다.

  • 지원 벡터 회귀
  • 최소 선형 회귀 분석

회귀 분석은 분류에 사용 된 것과 동일한 trainpredict 방법을 사용합니다.

지원 벡터 회귀

이것은 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 분 전에 서버를 시작하여 응용 프로그램이 오프라인이되는 것을 방지 할 수 있습니다.

클러스터링

클러스터링은 비슷한 개체를 그룹화하는 것입니다. 패턴 인식에 널리 사용됩니다. Clusteringunsupervised 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 을 전달하지 않습니다. 반면에이 작업을하려면 두 개의 매개 변수가 필요합니다.

  1. $ minSamples : 클러스터에 있어야하는 최소 객체 수
  2. $ 엡실론 : 같은 클러스터에서 두 샘플 사이의 최대 거리를 고려합니다.

같은 간단한 샘플은 다음과 같습니다.

// 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 recognitiondata mining 에 널리 사용됩니다. 콘텐츠 게시 응용 프로그램이 있다고 가정하십시오. 이제는 사용자를 유지하기 위해 자신이 좋아하는 콘텐츠를 살펴 봐야합니다. 단순함을 위해 특정 웹 페이지에 1 분 이상 머물러 있고 그 내용이 마음에 들지 않으면 맨 아래로 내려 앉는다고 가정합니다. 이제 각 콘텐츠에 고유 식별자가 있고 사용자도 고유 식별자를 갖게됩니다. 이를 기반으로 클러스터를 만들면 비슷한 콘텐츠 취향을 가진 사용자 세그먼트를 알 수 있습니다. 동일한 클러스터의 일부 사용자가 기사를 좋아한다면 다른 사용자도 응용 프로그램에 대한 권장 사항으로 표시 될 수 있다고 가정 할 수있는 추천 시스템에서 사용할 수 있습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow