ホームページ  >  記事  >  バックエンド開発  >  PHP機械学習ライブラリphp-mlのサンプルチュートリアル

PHP機械学習ライブラリphp-mlのサンプルチュートリアル

零下一度
零下一度オリジナル
2018-05-15 15:45:096246ブラウズ

php-ml は、PHP で書かれた機械学習ライブラリです。 Python や C++ がより多くの機械学習ライブラリを提供していることはわかっていますが、実際には、それらのほとんどは少し複雑で、その構成により多くの初心者は絶望的に感じます。機械学習ライブラリ php-ml には、特に高度なアルゴリズムはありませんが、最も基本的な機械学習、分類、その他のアルゴリズムが備わっています。私たちの小規模な会社にとっては、簡単なデータ分析や予測などを行うのに十分です。私たちのプロジェクトでは、過剰な効率や精度ではなく、費用対効果を追求する必要があります。一部のアルゴリズムやライブラリは非常に強力に見えますが、すぐにオンライン化することを考えていて、技術スタッフに機械学習の経験がない場合、複雑なコードと構成が実際にプロジェクトの足を引っ張ることになります。そして、単純な機械学習アプリケーションを作成している場合、複雑なライブラリとアルゴリズムを学習するための学習コストは明らかに少し高くなります。さらに、プロジェクトで奇妙な問題が発生した場合、それらを解決できるでしょうか。ニーズが変わった場合はどうすればよいですか?作業中に突然プログラムがエラーを報告し、GoogleやBaiduで検索しても条件に合う質問が1つしか見つからなかった、という経験は誰でもあると思います。数年前、その後は返信ゼロ。 。 。したがって、最も単純で、最も効率的で、最も費用対効果の高い方法を選択する必要があります。 php-ml の速度は遅くなく (すぐに php7 に変更できます)、精度も良好です。結局のところ、アルゴリズムは同じであり、php は c ベースです。ブロガーが最も嫌がることは、Python、Java、PHP の間でパフォーマンスとアプリケーションの範囲を比較することです。どうしてもパフォーマンスを求める場合はC言語で開発してください。応用範囲を徹底的に追求したい場合は、C またはアセンブリを使用してください。 。 。

まず第一に、このライブラリを使用したい場合は、最初にダウンロードする必要があります。このライブラリファイルはgithub (https://github.com/php-ai/php-ml)からダウンロードできます。もちろん、composer を使用してライブラリをダウンロードし、自動的に設定することをお勧めします。

ダウンロード後、このライブラリのドキュメントを参照して、自分でファイルを作成して試してみることができます。どれもわかりやすいですね。次に、実際のデータでテストしてみましょう。 データセット 1 つはアヤメのおしべのデータセット、もう 1 つは記録が紛失したため、データの内容がわかりません。 。 。

アイリスのおしべデータには 3 つの異なるカテゴリがあります:

未知のデータセット。小数点はカンマとしてマークされているため、計算中に処理する必要があります:

us First未知のデータセットを処理します。まず、未知のデータセットのファイル名は data.txt です。そして、このデータセットは、最初に X-Y 折れ線グラフに描画することができます。したがって、最初に元のデータを折れ線グラフに描画します。 X 軸は比較的長いため、その大まかな形状を確認するだけで済みます。

描画には php の jpgraph ライブラリが使用されます。 コードは次のとおりです。

<?php
include_once &#39;./src/jpgraph.php&#39;;
include_once &#39;./src/jpgraph_line.php&#39;;

$g = new Graph(1920,1080);//jpgraph的绘制操作
$g->SetScale("textint");
$g->title->Set(&#39;data&#39;);

//文件的处理
$file = fopen(&#39;data.txt&#39;,&#39;r&#39;);
$labels = array();
while(!feof($file)){
 $data = explode(&#39; &#39;,fgets($file));  
 $data[1] = str_replace(&#39;,&#39;,&#39;.&#39;,$data[1]);//数据处理,将数据中的逗号修正为小数点
 $labels[(int)$data[0]] = (float)$data[1];//这里将数据以键值的方式存入数组,方便我们根据键来排序
} 

ksort($labels);//按键的大小排序

$x = array();//x轴的表示数据
$y = array();//y轴的表示数据
foreach($labels as $key=>$value){
 array_push($x,$key);
 array_push($y,$value);
}


$linePlot = new LinePlot($y);
$g->xaxis->SetTickLabels($x); 
$linePlot->SetLegend(&#39;data&#39;);
$g->Add($linePlot);
$g->Stroke();

この元の画像を使用します。比較のために、次に勉強します。学習にはphp-mlのLeastSquarsを使用します。比較グラフを作成できるように、テストの出力をファイルに保存する必要があります。学習コードは次のとおりです:

<?php
 require &#39;vendor/autoload.php&#39;;

 use Phpml\Regression\LeastSquares;
 use Phpml\ModelManager;

 $file = fopen(&#39;data.txt&#39;,&#39;r&#39;);
 $samples = array();
 $labels = array();
 $i = 0;
 while(!feof($file)){
  $data = explode(&#39; &#39;,fgets($file));
  $samples[$i][0] = (int)$data[0];
  $data[1] = str_replace(&#39;,&#39;,&#39;.&#39;,$data[1]);
  $labels[$i] = (float)$data[1];
  $i ++;
 } 
 fclose($file);

 $regression = new LeastSquares();
 $regression->train($samples,$labels);

 //这个a数组是根据我们对原数据处理后的x值给出的,做测试用。
 $a = [0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20,22,23,24,25,26,27,29,30,31,37,40,41,45,48,53,55,57,60,61,108,124];
 for($i = 0; $i < count($a); $i ++){
  file_put_contents("putput.txt",($regression->predict([$a[$i]]))."\n",FILE_APPEND); //以追加的方式存入文件  
 }

その後、ファイルに保存されているデータを読み出し、グラフを描画し、最終レンダリングを最初に貼り付けます:

コードは次のとおりです:


<?php
include_once &#39;./src/jpgraph.php&#39;;
include_once &#39;./src/jpgraph_line.php&#39;;

$g = new Graph(1920,1080);
$g->SetScale("textint");
$g->title->Set(&#39;data&#39;);

$file = fopen(&#39;putput.txt&#39;,&#39;r&#39;);
$y = array();
$i = 0;
while(!feof($file)){
 $y[$i] = (float)(fgets($file));
 $i ++;   
} 

$x = [0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20,22,23,24,25,26,27,29,30,31,37,40,41,45,48,53,55,57,60,61,108,124];

$linePlot = new LinePlot($y);
$g->xaxis->SetTickLabels($x); 
$linePlot->SetLegend(&#39;data&#39;);
$g->Add($linePlot);
$g->Stroke();

グラフがまだ一貫性がないことがわかります。特にギザギザのエッジを持つグラフィックスの部分では比較的大きくなっています。ただし、これは結局 40 セットのデータであり、全体的なグラフの傾向は一貫していることがわかります。一般的なライブラリがこのような学習を行う場合、データ量が少ない場合には精度が非常に低くなります。比較的高い精度を得るには大量のデータが必要となり、1万件以上のデータが必要となります。このデータ要件が満たされない場合、私たちが使用するライブラリは無駄になります。したがって、機械学習の実践における本当の困難は、精度の低さや構成の複雑さなどの技術的な問題ではなく、データ量の不足や品質の低さ(一連のデータに無駄なデータが多すぎること)にあります。機械学習を行う前には、データの前処理も必要です。

接下来,我们来对花蕊数据进行测试。一共三种分类,由于我们下载到的是csv数据,所以我们可以使用php-ml官方提供的操作csv文件的方法。而这里是一个分类问题,所以我们选择库提供的SVC算法来进行分类。我们把花蕊数据的文件名定为Iris.csv,代码如下:

<?php
require &#39;vendor/autoload.php&#39;;

use Phpml\Classification\SVC;
use Phpml\SupportVectorMachine\Kernel;
use Phpml\Dataset\CsvDataset;

$dataset = new CsvDataset(&#39;Iris.csv&#39; , 4, false);
$classifier = new SVC(Kernel::LINEAR,$cost = 1000);
$classifier->train($dataset->getSamples(),$dataset->getTargets());

echo $classifier->predict([$argv[1],$argv[2],$argv[3],$argv[4]]);//$argv是命令行参数,调试这种程序使用命令行较方便

是不是很简单?短短12行代码就搞定了。接下来,我们来测试一下。根据我们上面贴出的图,当我们输入5 3.3 1.4 0.2的时候,输出应该是Iris-setosa。我们看一下:

看,至少我们输入一个原来就有的数据,得到了正确的结果。但是,我们输入原数据集中没有的数据呢?我们来测试两组:

由我们之前贴出的两张图的数据看,我们输入的数据在数据集中并不存在,但分类按照我们初步的观察来看,是合理的。

所以,这个机器学习库对于大多数的人来说,都是够用的。而大多数鄙视这个库鄙视那个库,大谈性能的人,基本上也不是什么大牛。真正的大牛已经忙着捞钱去了,或者正在做学术研究等等。我们更多的应该是掌握算法,了解其中的道理和玄机,而不是夸夸其谈。当然,这个库并不建议用在大型项目上,只推荐小型项目或者个人项目等。

jpgraph只依赖GD库,所以下载引用之后就可以使用,大量的代码都放在了绘制图形和初期的数据处理上。由于库的出色封装,学习代码并不复杂。需要所有代码或者测试数据集的小伙伴可以留言或者私信等,我提供完整的代码,解压即用

以上がPHP機械学習ライブラリphp-mlのサンプルチュートリアルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。