当前位置: 首页 > 工具软件 > PHP-ML > 使用案例 >

利用PHP实现机器学习,php-ml的应用

高宏峻
2023-12-01

php-ml机器学习库

https://php-ml.readthedocs.io/en/latest/#author 库中包含算法,交叉验证,神经网络,预处理,特征提取等功能。

利用composer安装

composer require php-ai/php-ml

近邻算法,$samples是数据,$labels是标记,传入的参数[3,2]由模型训练获得结果最靠近d,所以叫近邻算法,

近邻算法还有一些细分:

k-NN分类 
输入:包含特征空间中的 k 个最接近的训练样本。 
输出:一个分类族群。
k-NN回归 
输入:包含特征空间中的 k 个最接近的训练样本。 
输出:该对象的属性值。该值是其 k 个最近邻居的值的平均值。

演示下KNN分类 

<?php
require_once __DIR__ . '/vendor/autoload.php';

use Phpml\Classification\KNearestNeighbors;

//近邻算法 KNN算法
$samples = [[1, 3], [1, 4], [2, 4], [3, 1], [4, 1], [4, 2]];
$labels = ['a', 'b', 'c', 'd', 'e', 'f'];

$classifier = new KNearestNeighbors();
$classifier->train($samples, $labels);

echo $classifier->predict([3, 2]);

线性,近邻,贝叶斯

<?php

require_once __DIR__ . '/vendor/autoload.php';

use Phpml\Classification\SVC;
use Phpml\SupportVectorMachine\Kernel;
use Phpml\Classification\NaiveBayes;
use Phpml\Classification\KNearestNeighbors;


/*
说一个班级里面有三个男生(男生1、男生2,男生3),三个女生(女生1、女生2,女生3),其中
男生1 身高:176cm 体重:70kg;
男生2 身高:180cm 体重:80kg;
男生2 身高:186cm 体重:86kg;

女生1 身高:161cm 体重:45kg;
女生2 身高:163cm 体重:47kg;
女生3 身高:165cm 体重:49kg;
如果我们将男生定义为1,女生定义为-1(这里定义数值无所谓,你可以定义男生8,女生6,只要是数值就行)
*/
$samples = [[176, 70], [180, 80], [161, 45], [163, 47], [186, 86], [165, 49]];
$labels = [1, 1, -1, -1, 1, -1];

/*
 * 线性分类
 * */
$classifier = new SVC(Kernel::LINEAR, $cost = 1000);
/* 对其进行训练   */
$classifier->train($samples, $labels);
/*预测190cm高 80kg的人,是男还是女*/
echo $classifier->predict([190, 80]); //线性分类,输出1,预测结果为男性

/*
 * KNN-分类
 * */
$classifier = new KNearestNeighbors();
/* 对其进行训练   */
$classifier->train($samples, $labels);
/*预测190cm高 80kg的人,是男还是女*/
echo $classifier->predict([190, 80]); //输出1,近邻算法预测结果也为男性

/*
 * 朴素贝叶斯
 * 最为广泛的两种分类模型是决策树模型(Decision Tree Model)和朴素贝叶斯模型(Naive Bayesian Model,NBM)。
 * 和决策树模型相比,朴素贝叶斯分类器(Naive Bayes Classifier 或 NBC)发源于古典数学理论,有着坚实的数学基础,以及稳定的分类效率。
 * 同时,NBC模型所需估计的参数很少,对缺失数据不太敏感,算法也比较简单。
 * 理论上,NBC模型与其他分类方法相比具有最小的误差率。
 * 但是实际上并非总是如此,这是因为NBC模型假设属性之间相互独立,这个假设在实际应用中往往是不成立的,这给NBC模型的正确分类带来了一定影响。
 * */
$classifier = new NaiveBayes();
$classifier->train($samples, $labels);
echo $classifier->predict([158, 45],[170,30]); //输出-1,女性

利用apriori进行关联性规则学习

<?php
require_once 'vendor/autoload.php';
use Phpml\Association\Apriori;
/*
一个电商网站 统计6位用户购买习惯
A用户喜欢购买   衣服,鞋子, 辣条
B用户喜欢购买   辣条, 面条, 席子
C用户喜欢购买   衣服,席子, 面条
D用户喜欢购买   衣服,面条,鞋子
E用户喜欢购买   衣服, 面条, 辣条
F用户喜欢购买   衣服, 鞋子, 辣条
*/
/*将上面的数据放入$samples数组里
*/
$samples = [['衣服', '鞋子', '辣条'], ['辣条', '面条', '席子'], ['衣服','席子', '面条'], ['衣服','面条','鞋子'],['衣服', '面条', '辣条'],['衣服', '鞋子', '辣条']];
$labels  = [];
/*
参数
support支持度
confidence 自信度
*/
$associator = new Apriori($support = 0.5, $confidence = 0.5);
/* 对其进行训练   */
$associator->train($samples, $labels);
/*
假设又有一位G用户,他购买了衣服,
电商网站想要通过他购买的衣服给她推荐别的产品
以便他购买更多的商品
系统会根据以往用户的训练数据推断出G用户可能需要的商品
*/
print_r($associator->predict(['衣服']));
//return  Array ( [0] => Array ( [0] => 鞋子 ) [1] => Array ( [0] => 辣条 ) [2] => Array ( [0] => 面条 ) )
/*
总结:这种算法根据一些行为来推断下一个行为
*/

回归预测

require_once 'vendor/autoload.php';
use Phpml\Regression\LeastSquares;
use Phpml\Regression\SVR;
/*
我们现在对一支股票进行预测
张氏股从2010年开始
2010年单股价123.5$
2011年单股价124.5$
2012年单股价134.5$
2013年单股价144$
2014年单股价144.7$
2015年单股价154.5$
2016年单股价184.5$
我们根据每年的股价涨势计算出
2010年 涨1.1%
2011年 涨1.2%
2012年 涨2.1%
2013年 涨3.1%
2014年 涨3.3%
2015年 涨4.1%
2016年 涨5.1%
*/
/*将上面的数据放入$samples数组里
*/
$samples = [[2010], [2011], [2012], [2013], [2014], [2015],[2016]];
/*
在labels中存入每年的股价涨势
*/
$labels = [1.1, 1.2, 2.1, 3.1, 3.3, 4.1,5.1];
/*
下面我们采用最小二乘法逼近线性模型进行预测
*/
$regression = new LeastSquares();
/*
下面我们采用libsvm的向量回归进行预测
*/
$regression = new SVR(Kernel::LINEAR);
/* 对其进行训练   */
$regression->train($samples, $labels);
/*
如果我们想知道2017年张氏股的涨势是什么样的,我们用最小二乘法逼近线性模型来进行预测
*/
print_r($regression->predict([2017]));
// return 5.53667
/*
我们预测的结果是涨势5.53%
该实例采用回归的最小二乘法算法和向量回归来进行预测的
*/

 

 类似资料: