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下MAIL的另一解决方案
Oct 09 PHP
社区(php&amp;&amp;mysql)三
Oct 09 PHP
dedecms防止FCK乱格式化你的代码的修改方法
Mar 17 PHP
php下图片文字混合水印与缩略图实现代码
Dec 11 PHP
php csv操作类代码
Dec 14 PHP
基于pear auth实现登录验证
Feb 26 PHP
php中动态变量用法实例
Jun 10 PHP
php通过获取头信息判断图片类型的方法
Jun 26 PHP
PHP数组实例详解
Jun 26 PHP
Yii+upload实现AJAX上传图片的方法
Jul 13 PHP
浅谈php://filter的妙用
Mar 05 PHP
php 使用expat方式解析xml文件操作示例
Nov 26 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输出控制功能在简繁体转换中的应用
2006/10/09 PHP
php中unlink()、mkdir()、rmdir()等方法的使用介绍
2012/12/21 PHP
php简单实现屏蔽指定ip段用户的访问
2015/04/29 PHP
PHP 观察者模式深入理解与应用分析
2019/09/25 PHP
IE和firefox浏览器的event事件兼容性汇总
2009/12/06 Javascript
小结Node.js中非阻塞IO和事件循环
2014/09/18 Javascript
简单分析javascript面向对象与原型
2015/05/21 Javascript
JS实现的颜色实时渐变效果完整实例
2016/03/25 Javascript
js编写当天简单日历效果【实现代码】
2016/05/03 Javascript
手机Web APP如何实现分享多平台功能
2016/08/19 Javascript
jQuery select自动选中功能实现方法分析
2016/11/28 Javascript
JavaScript闭包和范围实例详解
2016/12/19 Javascript
MVVM 双向绑定的实现代码
2018/06/21 Javascript
fetch 如何实现请求数据
2018/12/20 Javascript
ES6知识点整理之函数数组参数的默认值及其解构应用示例
2019/04/17 Javascript
IE11下处理Promise及Vue的单项数据流问题
2019/07/24 Javascript
在layui中对table中的数据进行判断(0、1)转换为提示信息的方法
2019/09/28 Javascript
Vue 使用beforeEach实现登录状态检查功能
2019/10/31 Javascript
taro 实现购物车逻辑的实例代码
2020/06/05 Javascript
python在windows下实现备份程序实例
2014/07/04 Python
python 字典(dict)按键和值排序
2016/06/28 Python
Python字典操作详细介绍及字典内建方法分享
2018/01/04 Python
python: line=f.readlines()消除line中\n的方法
2018/03/19 Python
python实现requests发送/上传多个文件的示例
2018/06/04 Python
Python使用ConfigParser模块操作配置文件的方法
2018/06/29 Python
Python OpenCV处理图像之图像像素点操作
2018/07/10 Python
python 基于dlib库的人脸检测的实现
2019/11/08 Python
法国时尚童装网站:Melijoe
2016/08/10 全球购物
英国的潮牌鞋履服饰商店:size?
2019/03/26 全球购物
俄罗斯园林植物网上商店:Garshinka
2020/07/16 全球购物
优秀教师感人事迹材料
2014/05/04 职场文书
2014年创卫工作总结
2014/11/24 职场文书
红旗渠导游词
2015/02/09 职场文书
Mysql - 常用函数 每天积极向上
2021/04/05 MySQL
原生Js 实现的简单无缝滚动轮播图的示例代码
2021/05/10 Javascript
Python利用capstone实现反汇编
2022/04/06 Python