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安全性漫谈
Jun 28 PHP
解析PHP中empty is_null和isset的测试
Jun 29 PHP
CI框架给视图添加动态数据
Dec 01 PHP
腾讯微博提示missing parameter errorcode 102 错误的解决方法
Dec 22 PHP
详解PHP中的Traits
Jul 29 PHP
php通过文件头判断格式的方法
May 28 PHP
PHP获取中国时间(上海时区时间)及美国时间的方法
Feb 23 PHP
浅谈PHP中pack、unpack的详细用法
Mar 12 PHP
Laravel 实现在Blade模版中使用全局变量代替路径的例子
Oct 22 PHP
PHP设计模式之数据访问对象模式(DAO)原理与用法实例分析
Dec 12 PHP
php判断数组是否为空的实例方法
May 10 PHP
Mac M1安装mnmp (Mac+Nginx+MySQL+PHP) 开发环境
Mar 29 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获取通过http协议post提交过来xml数据及解析xml
2012/12/16 PHP
探讨file_get_contents与curl效率及稳定性的分析
2013/06/06 PHP
PHP+FFMPEG实现将视频自动转码成H264标准Mp4文件
2014/09/24 PHP
十幅图告诉你什么是PHP引用
2015/02/22 PHP
用PHP代码给图片加水印
2015/07/01 PHP
Javascript 刷新全集常用代码
2009/11/22 Javascript
javascript实现文字图片上下滚动的具体实例
2013/06/28 Javascript
html5 canvas js(数字时钟)实例代码
2013/12/23 Javascript
JS和函数式语言的三特性
2014/03/05 Javascript
浅谈jquery中delegate()与live()
2015/06/22 Javascript
JavaScript实现定时隐藏与显示图片的方法
2015/08/06 Javascript
举例讲解JavaScript substring()的使用方法
2015/11/09 Javascript
基于Bootstrap仿淘宝分页控件实现代码
2016/11/07 Javascript
Jquery Easyui菜单组件Menu使用详解(15)
2016/12/18 Javascript
JavaScript定义及输出螺旋矩阵的方法详解
2017/12/01 Javascript
js控制随机数生成概率代码实例
2019/03/21 Javascript
微信小程序下拉菜单效果的实例代码
2019/05/14 Javascript
深入剖析JavaScript instanceof 运算符
2019/06/14 Javascript
原生JavaScript实现日历功能代码实例(无引用Jq)
2019/09/23 Javascript
vuex实现数据状态持久化
2019/11/11 Javascript
微信小程序中data-key属性之数据传输(经验总结)
2020/08/22 Javascript
基于react项目打包css引用路径错误解决方案
2020/10/28 Javascript
python基础教程之序列详解
2014/08/29 Python
浅析Python中MySQLdb的事务处理功能
2016/09/21 Python
Python通过调用有道翻译api实现翻译功能示例
2018/07/19 Python
python使用numpy实现直方图反向投影示例
2020/01/17 Python
css3强大的动画效果animate使用说明及浏览器兼容介绍
2013/01/09 HTML / CSS
Europcar澳大利亚官网:全球汽车租赁领域的领导者
2019/03/24 全球购物
P D PAOLA意大利官网:西班牙著名的珠宝首饰品牌
2019/09/24 全球购物
英国复古服装购物网站:Collectif
2019/10/30 全球购物
大学毕业生通用自荐信范文
2013/10/31 职场文书
竞选班长演讲稿
2013/12/30 职场文书
倡议书的写法
2014/08/30 职场文书
防震减灾主题班会
2015/08/14 职场文书
SQLServer RANK() 排名函数的使用
2022/03/23 SQL Server
ubuntu20.04虚拟机无法上网的问题及解决
2022/12/24 Servers