首頁  >  文章  >  後端開發  >  PHP機器學習庫php-ml的實例教程

PHP機器學習庫php-ml的實例教程

零下一度
零下一度原創
2018-05-15 15:45:096323瀏覽

    php-ml是使用PHP編寫的機器學習函式庫。雖然我們知道,python或C++提供了更多機器學習的函式庫,但實際上,他們大多都略顯複雜,配置起來讓許多新手感到絕望。 php-ml這個機器學習庫雖然沒有特別高大上的演算法,但其具有最基本的機器學習、分類等演算法,我們的小公司做一些簡單的資料分析、預測等等都是夠用的。在我們的專案中,追求的應該是性價比,而不是過度的效率和精確度。有些演算法和函式庫看起來非常厲害,但如果我們考慮快速上線,而我們的技術人員沒有機器學習方面的經驗,那麼複雜的程式碼和配置反而會拖累我們的專案。而如果我們本身就是做一個簡單的機器學習應用,那麼研究複雜函式庫和演算法的學習成本很顯然高了點,而且,專案出了奇奇怪怪的問題,我們能解決嗎?需求改變了怎麼辦?相信大家都有過這種經驗:做著做著,程序忽然報錯,自己怎麼都搞不清楚原因,上谷歌或百度一搜,只搜出一條滿足條件的問題,在五年、十年前提問,然後零回覆。 。 。所以,選擇最簡單最有效率、性價比最高的做法是必須的。 php-ml的速度不算慢(趕快換php7吧),精確度也不錯,畢竟演算法都一樣,而且php是基於c的。部落客最看不慣的就是,拿python和Java,PHP之間比性能,比適用範圍。真要性能,請你拿C開發。真要追求適用範圍,也請用C,甚至彙編。 。 。

首先,我們要使用這個函式庫,需要先下載這個函式庫。在github可以下載到這個函式庫檔案(https://github.com/php-ai/php-ml)。當然,更推薦使用composer來下載該庫,自動配置。

當下載好了以後,我們可以看一看這個庫的文檔,文檔都是一些簡單的小示例,我們可以自己建一個文件嘗試一下。都淺顯易懂。接下來,我們來拿實際的數據測試一下。 資料集一個是Iris花蕊的資料集,另一個由於記錄遺失,所以不知道是有關什麼的資料了。 。 。

Iris花蕊部分數據,有三種不同的分類:

#不知名數據集,小數點被打成了逗號,所以計算時還需要處理一下:

#我們先處理不知名資料集。首先,我們的不知名資料集的檔案名稱為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組數據,我們可以看出,大概的圖形趨勢是吻合的。一般的函式庫在做這種學習時,資料量低的情況下,準確度都非常低。要達到比較高的精度,需要大量的數據,萬條以上的數據量是必要的。如果達不到這個資料要求,那我們使用任何函式庫都是徒勞無功的。所以,機器學習的實踐中,真正難的不在精度低、配置複雜等技術問題,而是資料量不夠,或是品質太低(一組資料中無用的資料太多)。在做機器學習之前,資料的預先處理也是必要的。

接下来,我们来对花蕊数据进行测试。一共三种分类,由于我们下载到的是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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn