menu
more_vert
PHP机器学习库php-ml的简单测试和使用

作者:dayu

650) this.width=650;" src="http://images2015.cnblogs.com/blog/993812/201707/993812-20170713195227353-2129653020.png" />技术分享

不知名数据集,小数点被打成了逗号,所以计算时还需要处理一下:

技术分享 技术分享

我们先处理不知名数据集。首先,我们的不知名数据集的文件名为data.txt。而这个数据集刚好可以先绘制成x-y折线图。所以,我们先将原数据绘制成一个折线图。由于x轴比较长,所以我们只需要看清楚它大致的形状即可:

技术分享

绘制采用了php的jpgraph库,代码如下:

技术分享

1<?php2include_once‘./src/jpgraph.php‘;3include_once‘./src/jpgraph_line.php‘;45$g=newGraph(1920,1080);//jpgraph的绘制操作6$g->SetScale("textint");7$g->title->Set(‘data‘);89//文件的处理10$file=fopen(‘data.txt‘,‘r‘);11$labels=array();12while(!feof($file)){13$data=explode(‘‘,fgets($file));
14$data[1]=str_replace(‘,‘,‘.‘,$data[1]);//数据处理,将数据中的逗号修正为小数点15$labels[(int)$data[0]]=(float)$data[1];//这里将数据以键值的方式存入数组,方便我们根据键来排序16}
1718ksort($labels);//按键的大小排序1920$x=array();//x轴的表示数据21$y=array();//y轴的表示数据22foreach($labelsas$key=>$value){23array_push($x,$key);24array_push($y,$value);25}262728$linePlot=newLinePlot($y);29$g->xaxis->SetTickLabels($x);
30$linePlot->SetLegend(‘data‘);31$g->Add($linePlot);32$g->Stroke();

技术分享

在有了这个原图做对比,我们接下来进行学习。我们采用php-ml中的LeastSquars来进行学习。我们测试的输出需要存入文件,方便我们可以画一个对比图。学习代码如下:

技术分享

1<?php2require‘vendor/autoload.php‘;34usePhpml\Regression\LeastSquares;5usePhpml\ModelManager;67$file=fopen(‘data.txt‘,‘r‘);8$samples=array();9$labels=array();10$i=0;11while(!feof($file)){12$data=explode(‘‘,fgets($file));13$samples[$i][0]=(int)$data[0];14$data[1]=str_replace(‘,‘,‘.‘,$data[1]);15$labels[$i]=(float)$data[1];16$i++;17}
18fclose($file);1920$regression=newLeastSquares();21$regression->train($samples,$labels);2223//这个a数组是根据我们对原数据处理后的x值给出的,做测试用。24$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];25for($i=0;$i<count($a);$i++){26file_put_contents("putput.txt",($regression->predict([$a[$i]]))."\n",FILE_APPEND);//以追加的方式存入文件27}

技术分享

之后,我们将存入文件的数据读出来,绘制一个图形,先贴最后的效果图:

技术分享代码如下:

技术分享

1<?php2include_once‘./src/jpgraph.php‘;3include_once‘./src/jpgraph_line.php‘;45$g=newGraph(1920,1080);6$g->SetScale("textint");7$g->title->Set(‘data‘);89$file=fopen(‘putput.txt‘,‘r‘);10$y=array();11$i=0;12while(!feof($file)){13$y[$i]=(float)(fgets($file));14$i++;
15}
1617$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];1819$linePlot=newLinePlot($y);20$g->xaxis->SetTickLabels($x);
21$linePlot->SetLegend(‘data‘);22$g->Add($linePlot);23$g->Stroke();

技术分享

可以发现,图形出入还是比较大的,尤其是在图形锯齿比较多的部分。不过,这毕竟是40组数据,我们可以看出,大概的图形趋势是吻合的。一般的库在做这种学习时,数据量低的情况下,准确度都非常低。要达到比较高的精度,需要大量的数据,万条以上的数据量是必要的。如果达不到这个数据要求,那我们使用任何库都是徒劳的。所以,机器学习的实践中,真正难的不在精度低、配置复杂等技术问题,而是数据量不够,或者质量太低(一组数据中无用的数据太多)。在做机器学习之前,对数据的预先处理也是必要的。

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

技术分享

1<?php2require‘vendor/autoload.php‘;34usePhpml\Classification\SVC;5usePhpml\SupportVectorMachine\Kernel;6usePhpml\Dataset\CsvDataset;78$dataset=newCsvDataset(‘Iris.csv‘,4,false);9$classifier=newSVC(Kernel::LINEAR,$cost=1000);10$classifier->train($dataset->getSamples(),$dataset->getTargets());1112echo$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的简单测试和使用

原文地址:http://12902932.blog.51cto.com/12892932/1949421