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


Posted in PHP onJuly 14, 2017

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花蕊部分数据,有三种不同的分类:

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

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

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

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

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

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

<?php
include_once './src/jpgraph.php';
include_once './src/jpgraph_line.php';

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

//文件的处理
$file = fopen('data.txt','r');
$labels = array();
while(!feof($file)){
 $data = explode(' ',fgets($file));  
 $data[1] = str_replace(',','.',$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('data');
$g->Add($linePlot);
$g->Stroke();

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

<?php
 require 'vendor/autoload.php';

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

 $file = fopen('data.txt','r');
 $samples = array();
 $labels = array();
 $i = 0;
 while(!feof($file)){
  $data = explode(' ',fgets($file));
  $samples[$i][0] = (int)$data[0];
  $data[1] = str_replace(',','.',$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机器学习库php-ml的简单测试和使用方法

代码如下:

<?php
include_once './src/jpgraph.php';
include_once './src/jpgraph_line.php';

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

$file = fopen('putput.txt','r');
$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('data');
$g->Add($linePlot);
$g->Stroke();

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

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

<?php
require 'vendor/autoload.php';

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

$dataset = new CsvDataset('Iris.csv' , 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。我们看一下:

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

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

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

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

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

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

以上这篇PHP机器学习库php-ml的简单测试和使用方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP中static关键字原理的学习研究分析
Jul 18 PHP
php中$_REQUEST、$_POST、$_GET的区别和联系小结
Nov 23 PHP
PHP获取网址的顶级域名函数代码
Sep 24 PHP
CodeIgniter启用缓存和清除缓存的方法
Jun 12 PHP
VPS中使用LNMP安装WordPress教程
Dec 28 PHP
php实现的网络相册图片防盗链完美破解方法
Jul 01 PHP
php实现微信公众号主动推送消息
Dec 31 PHP
laravel自定义分页效果
Jul 23 PHP
php面向对象程序设计中self与static的区别分析
May 21 PHP
如何在Laravel5.8中正确地应用Repository设计模式
Nov 26 PHP
PHP程序员简单的开展服务治理架构操作详解(二)
May 14 PHP
php + ajax 实现的写入数据库操作简单示例
May 16 PHP
thinkphp3.2嵌入百度编辑器ueditor的实例代码
Jul 13 #PHP
PHP微信PC二维码登陆的实现思路
Jul 13 #PHP
PHP基于socket实现客户端和服务端通讯功能
Jul 13 #PHP
php中请求url的五种方法总结
Jul 13 #PHP
Laravel 5.4重新登录实现跳转到登录前页面的原理和方法
Jul 13 #PHP
php获取'/'传参的值简单方法
Jul 13 #PHP
php多文件打包下载的实例代码
Jul 12 #PHP
You might like
PHP和.net中des加解密的实现方法
2013/02/27 PHP
浅谈PHP调用Webservice思路及源码分享
2014/06/04 PHP
php数组使用规则分析
2015/02/27 PHP
PHP  实现等比压缩图片尺寸和大小实例代码
2016/10/08 PHP
ExtJs Excel导出并下载IIS服务器端遇到的问题
2011/09/16 Javascript
7款风格新颖的jQuery/CSS3菜单导航分享
2013/04/23 Javascript
jqGrid日期格式的判断示例代码(开始日期与结束日期)
2013/11/08 Javascript
jQuery使用toggleClass方法动态添加删除Class样式的方法
2015/03/26 Javascript
极力推荐一款小巧玲珑的可视化编辑器bootstrap-wysiwyg
2016/05/27 Javascript
仿iframe效果Aajx文件上传实例
2016/11/18 Javascript
node.js(express)中使用Jcrop进行图片剪切上传功能
2017/04/21 Javascript
Angular2入门教程之模块和组件详解
2017/05/28 Javascript
JS与HTML结合实现流程进度展示条思路详解
2017/09/03 Javascript
vue-router 源码实现前端路由的两种方式
2018/07/02 Javascript
微信小程序云开发如何使用npm安装依赖
2019/05/18 Javascript
Vue 同步异步存值取值实现案例
2020/08/05 Javascript
[51:06]2018DOTA2亚洲邀请赛3月29日 小组赛A组 KG VS Liquid
2018/03/30 DOTA
python3 pillow生成简单验证码图片的示例
2017/09/19 Python
浅谈python正则的常用方法 覆盖范围70%以上
2018/03/14 Python
Python格式化输出字符串方法小结【%与format】
2018/10/29 Python
Python直接赋值、浅拷贝与深度拷贝实例分析
2019/06/18 Python
Python线程条件变量Condition原理解析
2020/01/20 Python
Django跨域资源共享问题(推荐)
2020/03/09 Python
基于Python绘制个人足迹地图
2020/06/01 Python
如何用canvas实现在线签名的示例代码
2018/07/10 HTML / CSS
学生干部的自我评价分享
2014/01/18 职场文书
员工考核管理制度
2014/02/02 职场文书
创业计划实施的7大步骤
2014/02/05 职场文书
营销总监岗位职责范本
2014/02/26 职场文书
精彩的广告词
2014/03/19 职场文书
产品委托授权书范本
2014/09/16 职场文书
巾帼文明岗事迹材料
2014/12/24 职场文书
小爸爸观后感
2015/06/15 职场文书
2016春季小学开学寄语
2015/12/03 职场文书
利用python做表格数据处理
2021/04/13 Python
Django cookie和session的应用场景及如何使用
2021/04/29 Python