サーチ…


備考

このトピックでは、すべての機械学習アルゴリズムにPHP-MLを使用しています。ライブラリのインストールは、以下を使用して行うことができます。

composer require php-ai/php-ml

そのためのgithubリポジトリはここにあります

また、与えられた例はデモンストレーションの目的のためにのみ、非常に小さなデータセットであることにも注意してください。実際のデータセットはそれよりも包括的でなければなりません。

PHP-MLによる分類

機械学習における分類は、新しい観察が属するカテゴリの集合を特定する問題である。分類はSupervised Machine Learning範疇に入る。

分類を実装するアルゴリズムはすべて、 分類子

PHP-MLでサポートされている分類子は、

  • SVC(サポートベクター分類)
  • k-Nearest Neighbors
  • ナイーブベイズ

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-Nearest Neighbors

このアルゴリズムのクラスファクタは2つのパラメータを取り、以下のように初期化できます。

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

$neighbor_numknnアルゴリズムでスキャンする最近傍の数であり、2番目のパラメータは距離メトリックであり、最初の場合は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 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']

実用的なケース

今まではすべてのケースで整数の配列しか使用していませんでしたが、実際のところはそうではありません。したがって、分類子の使用法に関する実践的な状況を記述しようとします。

自然界の花の特性を保存するアプリケーションがあるとします。わかりやすくするために、花びらの色と長さを考慮することができます。そこで、私たちのデータを訓練するために2つの特性が使用されます。 colorあなたがそれらの長さのためにそれぞれにint値を割り当てることができる単純なものである、あなたのような範囲を有することができる(0 mm,10 mm)=1 , (10 mm,20 mm)=2 。最初のデータで分類器をトレーニングします。あなたのユーザーのニーズの1つが、自分の裏庭で成長する花の種類を特定するようになりました。彼がしてcolorは、花のcolorを選択し、花弁の長さを追加することです。あなたはクラシファイアランニングで花の種類を検出できます(「上記の例のラベル」)

回帰

PHP-MLを使った分類では、新しい観測にラベルを割り当てました。回帰はほぼ同じですが、出力値はクラスラベルではなく連続値であるという違いがあります。予測と予測に広く使用されています。 PHP-MLは次の回帰アルゴリズムをサポートしています

  • サポートベクトル回帰
  • 最小二乗線形回帰

回帰には、分類に使用されているのと同じtrainpredict方法があります。

サポートベクトル回帰

これは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は分類ではなくクラスラベルではありません。これは、この2つの差別化要因の1つです。私たちのモデルをデータでトレーニングした後、実際の予測から始めることができます

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

予測はターゲット外の値を返すことに注意してください。

最小二乗線形回帰

このアルゴリズムは、解を近似least squares methodために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れていunsupervised machine learningもとで行われるため、トレーニングは必要ありません。 PHP-MLは以下のクラスタリングアルゴリズムをサポートしています

  • k平均
  • dbscan

k平均

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

出力には3つの配列が含まれていることに注意してください。なぜなら、それはKMeansコンストラクタのnの値だったからです。コンストラクタには、 initialization methodとなるオプションの第2パラメータが存在することもあります。例えば考慮する

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

INIT_RANDOMは、クラスタを決定しようとしている間に完全にランダムな重心を配置します。しかし、重心がデータから離れすぎるのを避けるために、データの空間境界に拘束されます。

デフォルトのコンストラクタのinitialization methodkmeans ++です。プロセスをスピードアップするためにセントロイドをスマートに選択します。

DBSCAN

KMeansとは対照的に、 DBSCANは密度ベースのクラスタリングアルゴリズムです。つまり、結果に必要なクラスタの数を決定するnを渡すことはありません。一方、これには2つのパラメータが必要です

  1. $ minSamples:クラスタ内に存在する必要があるオブジェクトの最小数
  2. $ epsilon: 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]]]

コードはかなり自明です。主な違いの1つは、KMeansではなく、出力配列内の要素の数を知る方法がないことです。

実用的なケース

現実のシナリオでのクラスタリングの使用を見てみましょう

クラスタリングは、 pattern recognitiondata mining広く使用されていpattern recognition 。コンテンツパブリッシングアプリケーションがあるとします。あなたのユーザーを保持するためには、好きなコンテンツを見てください。簡単にするために、特定のWebページに1分以上アクセスしていて、そのコンテンツが大好きな人は、そのコンテンツを好きだと思ってください。それぞれのコンテンツには固有の識別子が付いているので、ユーザーも同じようになります。これに基づいてクラスタを作成すると、ユーザーのどのセグメントが類似したコンテンツの好みを持っているかを知ることができます。これは、同じクラスタのユーザーの中には記事が好きな人もいれば他の人も好きで、あなたのアプリケーションの推奨事項として表示できるという推測システムで使用できます。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow