php-ml是一个使用PHP编写的机器学习库。虽然咱们知道,python或者是C++提供了更多机器学习的库,但实际上,他们大多都略显复杂,配置起来让不少新手感到绝望。php-ml这个机器学习库虽然没有特别高大上的算法,但其具备最基本的机器学习、分类等算法,咱们的小公司作一些简单的数据分析、预测等等都是够用的。咱们的项目中,追求的应该是性价比,而不是过度的效率和精度。一些算法和库看上去很是厉害,但若是咱们考虑快速上线,而咱们的技术人员没有机器学习方面的经验,那么复杂的代码和配置反而会拖累咱们的项目。而若是咱们自己就是作一个简单的机器学习应用,那么研究复杂库和算法的学习成本很显然高了点,并且,项目出了奇奇怪怪的问题,咱们能解决吗?需求改变了怎么办?相信你们都有过这种经历:作着作着,程序突然报错,本身怎么都搞不清楚缘由,上谷歌或百度一搜,只搜出一条知足条件的问题,在五年、十年前提问,而后零回复。。。因此,选择最简单最高效、性价比最高的作法是必须的。php-ml的速度不算慢(赶忙换php7吧),并且精度也不错,毕竟算法都同样,并且php是基于c的。博主最看不惯的就是,拿python和Java,PHP之间比性能,比适用范围。真要性能,请你拿C开发。真要追求适用范围,也请用C,甚至汇编。。。php
首先,咱们要使用这个库,须要先下载这个库。在github能够下载到这个库文件(https://github.com/php-ai/php-ml)。固然,更推荐使用composer来下载该库,自动配置。python
当下载好了之后,咱们能够看一看这个库的文档,文档都是一些简单的小示例,咱们能够本身建一个文件尝试一下。都浅显易懂。接下来,咱们来拿实际的数据测试一下。数据集一个是Iris花蕊的数据集,另外一个因为记录丢失,因此不知道是有关什么的数据了。。。git
Iris花蕊部分数据,有三种不一样的分类:github
不知名数据集,小数点被打成了逗号,因此计算时还须要处理一下:算法
咱们先处理不知名数据集。首先,咱们的不知名数据集的文件名为data.txt。而这个数据集恰好能够先绘制成x-y折线图。因此,咱们先将原数据绘制成一个折线图。因为x轴比较长,因此咱们只须要看清楚它大体的形状便可:数组
绘制采用了php的jpgraph库,代码以下:php7
1 <?php 2 include_once './src/jpgraph.php'; 3 include_once './src/jpgraph_line.php'; 4 5 $g = new Graph(1920,1080);//jpgraph的绘制操做 6 $g->SetScale("textint"); 7 $g->title->Set('data'); 8 9 //文件的处理 10 $file = fopen('data.txt','r'); 11 $labels = array(); 12 while(!feof($file)){ 13 $data = explode(' ',fgets($file)); 14 $data[1] = str_replace(',','.',$data[1]);//数据处理,将数据中的逗号修正为小数点 15 $labels[(int)$data[0]] = (float)$data[1];//这里将数据以键值的方式存入数组,方便咱们根据键来排序 16 } 17 18 ksort($labels);//按键的大小排序 19 20 $x = array();//x轴的表示数据 21 $y = array();//y轴的表示数据 22 foreach($labels as $key=>$value){ 23 array_push($x,$key); 24 array_push($y,$value); 25 } 26 27 28 $linePlot = new LinePlot($y); 29 $g->xaxis->SetTickLabels($x); 30 $linePlot->SetLegend('data'); 31 $g->Add($linePlot); 32 $g->Stroke();
在有了这个原图作对比,咱们接下来进行学习。咱们采用php-ml中的LeastSquars来进行学习。咱们测试的输出须要存入文件,方便咱们能够画一个对比图。学习代码以下:composer
1 <?php 2 require 'vendor/autoload.php'; 3 4 use Phpml\Regression\LeastSquares; 5 use Phpml\ModelManager; 6 7 $file = fopen('data.txt','r'); 8 $samples = array(); 9 $labels = array(); 10 $i = 0; 11 while(!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 } 18 fclose($file); 19 20 $regression = new LeastSquares(); 21 $regression->train($samples,$labels); 22 23 //这个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]; 25 for($i = 0; $i < count($a); $i ++){ 26 file_put_contents("putput.txt",($regression->predict([$a[$i]]))."\n",FILE_APPEND); //以追加的方式存入文件 27 }
以后,咱们将存入文件的数据读出来,绘制一个图形,先贴最后的效果图:机器学习
代码以下:性能
1 <?php 2 include_once './src/jpgraph.php'; 3 include_once './src/jpgraph_line.php'; 4 5 $g = new Graph(1920,1080); 6 $g->SetScale("textint"); 7 $g->title->Set('data'); 8 9 $file = fopen('putput.txt','r'); 10 $y = array(); 11 $i = 0; 12 while(!feof($file)){ 13 $y[$i] = (float)(fgets($file)); 14 $i ++; 15 } 16 17 $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]; 18 19 $linePlot = new LinePlot($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 <?php 2 require 'vendor/autoload.php'; 3 4 use Phpml\Classification\SVC; 5 use Phpml\SupportVectorMachine\Kernel; 6 use Phpml\Dataset\CsvDataset; 7 8 $dataset = new CsvDataset('Iris.csv' , 4, false); 9 $classifier = new SVC(Kernel::LINEAR,$cost = 1000); 10 $classifier->train($dataset->getSamples(),$dataset->getTargets()); 11 12 echo $classifier->predict([$argv[1],$argv[2],$argv[3],$argv[4]]);//$argv是命令行参数,调试这种程序使用命令行较方便
是否是很简单?短短12行代码就搞定了。接下来,咱们来测试一下。根据咱们上面贴出的图,当咱们输入5 3.3 1.4 0.2的时候,输出应该是Iris-setosa。咱们看一下:
看,至少咱们输入一个原来就有的数据,获得了正确的结果。可是,咱们输入原数据集中没有的数据呢?咱们来测试两组:
由咱们以前贴出的两张图的数据看,咱们输入的数据在数据集中并不存在,但分类按照咱们初步的观察来看,是合理的。
因此,这个机器学习库对于大多数的人来讲,都是够用的。而大多数鄙视这个库鄙视那个库,大谈性能的人,基本上也不是什么大牛。真正的大牛已经忙着捞钱去了,或者正在作学术研究等等。咱们更多的应该是掌握算法,了解其中的道理和玄机,而不是夸夸其谈。固然,这个库并不建议用在大型项目上,只推荐小型项目或者我的项目等。
jpgraph只依赖GD库,因此下载引用以后就可使用,大量的代码都放在了绘制图形和初期的数据处理上。因为库的出色封装,学习代码并不复杂。须要全部代码或者测试数据集的小伙伴能够留言或者私信等,我提供完整的代码,解压即用(博客园的空间过小,不适合上传文件)。博主也正在学习,和你们共同努力。