本文实例讲述了php实现机器学习之朴素贝叶斯算法。分享给大家供大家参考,具体如下:
机器学习已经在我们的生活中变得随处可见了。比如从你在家的时候温控器开始工作到智能汽车以及我们口袋中的智能手机。机器学习看上去已经无处不在并且是一个非常值得探索的领域。但是什么是机器学习呢?通常来说,机器学习就是让系统不断的学习并且对新的问题进行预测。从简单的预测购物商品到复杂的数字助理预测。
在这篇文章我将会使用朴素贝叶斯算法clasifier作为一个类来介绍。这是一个简单易于实施的算法,并且可给出满意的结果。但是这个算法是需要一点统计学的知识去理解的。在文章的最后部分你可以看到一些实例代码,甚至自己去尝试着自己做一下你的机器学习。 起步
那么,这个classifier是要用来实现什么功能呢?其实它主要是用来判断给定的语句是积极地还是消极的。比如,“symfony is the best”是一个积极的语句,“no symfony is bad”是一个消极的语句。所以在给定了一个语句之后,我想让这个classifier在我不给定一个新的规则的情况就返回一个语句类型。
我给classifier命名了一个相同名称的类,并且包含一个guess方法。这个方法接受一个语句的输入,并且会返回这个语句是积极的还是消极的。这个类就像下面这样:
class classifier
{
public function guess($statement)
{}
}
class type
{
const positive = 'positive';
const negative = 'negative';
}
初始化工作已经完成,接下来就是要编写我们的算法进行预测了。 朴素贝叶斯
朴素贝叶斯算法是基于一个训练集合工作的,根据这个训练集从而做出相应的预测。这个算法运用了简单的统计学以及一点数学去进行结果的计算。比如像下面四个文本组成的训练集合:
语句类型symfony is the bestpositivephpstorm is greatpositiveiltar complains a lotnegativeno symfony is badnegative
如果给定语句是“symfony is the best”,那么你可以说这个语句是积极地。你平常也会根据之前学习到的相应知识做出对应的决定,朴素贝叶斯算法也是同样的道理:它根据之前的训练集来决定哪一个类型更加相近。 学习
在这个算法正式工作之前,它需要大量的历史信息作为训练集。它需要知道两件事:每一个类型对应的词产生了多少次和每一个语句对应的类型是什么。我们在实施的时候会将这两种信息存储在两个数组当中。一个数组包含每一类型的词语统计,另一个数组包含每一个类型的语句统计。所有的其他信息都可以从这两个数组中聚合。代码就像下面的一样:
function learn($statement, $type)
{
$words = $this->getwords($statement);
foreach ($words as $word) {
if (!isset($this->words[$type][$word])) {
$this->words[$type][$word] = 0;
}
$this->words[$type][$word]++; // 增加类型的词语统计
}
$this->documents[$type]++; // 增加类型的语句统计
}
$classifier = new classifier();
$classifier->learn('symfony is the best', type::positive);
$classifier->learn('phpstorm is great', type::positive);
$classifier->learn('iltar complains a lot', type::negative);
$classifier->learn('no symfony is bad', type::negative);
var_dump($classifier->guess('symfony is great')); // string(8) "positive"
var_dump($classifier->guess('i complain a lot')); // string(8) "negative"