加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

PHP实现机器学习之朴素贝叶斯算法详解

发布时间:2021-03-31 11:46:25 所属栏目:编程 来源:网络整理
导读:本篇章节讲授PHP实现呆板进修之朴实贝叶斯算法。供各人参考研究详细如下: 呆板进修已经在我们的糊口中变获得处可见了。好比从你在家的时辰温控器开始事变到智能汽车以及我们口袋中的智妙手机。呆板进修看上去已经无处不在而且是一个很是值得试探
副问题[/!--empirenews.page--]

本篇章节讲授PHP实现呆板进修之朴实贝叶斯算法。分享给各人供各人参考,详细如下:

呆板进修已经在我们的糊口中变获得处可见了。好比从你在家的时辰温控器开始事变到智能汽车以及我们口袋中的智妙手机。呆板进修看上去已经无处不在而且是一个很是值得试探的规模。可是什么是呆板进修呢?凡是来说,呆板进修就是让体系不绝的进修而且对新的题目举办猜测。从简朴的猜测购物商品到伟大的数字助理猜测。

在这篇文章我将会行使朴实贝叶斯算法Clasifier作为一个类来先容。这是一个简朴易于实验的算法,而且可给出满足的功效。可是这个算法是必要一点统计学的常识去领略的。在文章的最后部门你可以看到一些实例代码,乃至本身去实行着本身做一下你的呆板进修。

起步

那么,这个Classifier是要用来实现什么成果呢?着实它首要是用来判定给定的语句是起劲地照旧悲观的。好比,“Symfony is the best”是一个起劲的语句,“No Symfony is bad”是一个悲观的语句。以是在给定了一个语句之后,我想让这个Classifier在我不给定一个新的法则的环境就返回一个语句范例。

我给Classifier定名了一个沟通名称的类,而且包括一个guess要领。这个要领接管一个语句的输入,而且会返回这个语句是起劲的照旧悲观的。这个类就像下面这样:

我更喜好行使列举范例的类而不是字符串作为我的返回值。我将这个列举范例的类定名为Type,而且包括两个常量:一个POSITIVE,一个NEGATIVE。这两个常量将会当做guess要领的返回值。

初始化事变已经完成,接下来就是要编写我们的算法举办猜测了。

朴实贝叶斯

朴实贝叶斯算法是基于一个实习荟萃事变的,按照这个实习集从而做出响应的猜测。这个算法运用了简朴的统计学以及一点数学去举办功效的计较。好比像下面四个文本构成的实习荟萃:


假如给定语句是“Symfony is the best”,那么你可以嗣魅这个语句是起劲地。你泛泛也会按照之提高修到的响应常识做出对应的抉择,朴实贝叶斯算法也是同样的原理:它按照之前的实习集来抉择哪一个范例越发临近。

进修

在这个算法正式事变之前,它必要大量的汗青信息作为实习集。它必要知道两件事:每一个范例对应的词发生了几多次和每一个语句对应的范例是什么。我们在实验的时辰会将这两种信息存储在两个数组傍边。一个数组包括每一范例的词语统计,另一个数组包括每一个范例的语句统计。全部的其他信息都可以从这两个数组中聚合。代码就像下面的一样:

getWords($statement); foreach ($words as $word) { if (!isset($this->words[$type][$word])) { $this->words[$type][$word] = 0; } $this->words[$type][$word]++; // 增进范例的词语统计 } $this->documents[$type]++; // 增进范例的语句统计 }

有了这个荟萃往后,此刻这个算法就可以按照汗青数据接管猜测实习了。

界说

为了表明这个算法是怎样事变的,几个界说是须要的。起首,让我们界说一下输入的语句是给定范例中的一个的概率。这个将会暗示为P(Type)。它是以已知范例的数据的范例作为分子,尚有整个实习集的数据数目作为分母来得出的。一个数据就是整个实习齐集的一个。到此刻为止,这个要领可以将会定名为totalP,像下面这样:

documents[$type] + 1) / (array_sum($this->documents) + 1); }

请留意,在这里分子和分母都加了1。这是为了停止分子和分母都为0的环境。

按照上面的实习集的例子,起劲和悲观的范例城市得出0.6的概率。每中范例的数据都是2个,一共是4个数据以是就是(2+1)/(4+1)。

第二个要界说的是对付给定的一个词是属于哪个确定范例的概率。这个我们界说成P(word,Type)。起首我们要获得一个词在实习齐集给出确定范例呈现的次数,然后用这个功效来除以整个给定范例数据的词数。这个要领我们界说为p:

words[$type][$word]) ? $this->words[$type][$word] : 0; return ($count + 1) / (array_sum($this->words[$type]) + 1); }

在本次的实习齐集,“is”的是起劲范例的概率为0.375。这个词在整个起劲的数据中的7个词中占了两次,以是功效就是(2+1)/(7+1)。

最后,这个算法应该只体谅要害词而忽略其他的身分。一个简朴的要领就是将给定的字符串中的单词疏散出来:

筹备事变都做好了,开始真正实验我们的打算吧!

猜测

为了猜测语句的范例,这个算法应该计较所给定语句的两个范例的概率。像上面一样,我们界说一个P(Type,sentence)。得出概率高的范例将会是Classifier类中算法返回的功效。

为了计较P(Type,sentence),算法傍边将用到贝叶斯定理。算法像这样被界说:P(Type,sentence)= P(Type)* P(sentence,Type)/ P(sentence)。这意味着给定语句的范例概率和给定范例语句概率除以语句的概率的功效是沟通的。

那么算法在计较每一个沟通语句的P(Tyoe,sentence),P(sentence)是保持一样的。这意味着算法就可以省略其他身分,我们只必要体谅最高的概率而不是现实的值。计较就像这样:P(Type,sentence) = P(Type)* P(sentence,Type)。

最后,为了计较P(sentence,Type),我们可觉得语句中的每个词添加一条链式法则。以是在一条语句中假若有n个词的话,它将会和P(word_1,Type)* P(word_2,Type)* P(word_3,Type)* .....*P(word_n,Type)是一样的。每一个词计较功效的概率行使了我们前面看到的界说。

好了,全部的都说完了,是时辰在php中现实操纵一下了:

getWords($statement); // 获得单词 $best_likelihood = 0; $best_type = null; foreach ($this->types as $type) { $likelihood = $this->pTotal($type); //计较 P(Type) foreach ($words as $word) { $likelihood *= $this->p($word,$type); // 计较 P(word,Type) } if ($likelihood > $best_likelihood) { $best_likelihood = $likelihood; $best_type = $type; } } return $best_type; }

这就是全部的事变,此刻算法可以猜测语句的范例了。你要做的就是让你的算法开始进修:

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"

全部的代码我已经上传到了GIT上,

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读