logo
电话:13843226952
 
工作时间:周一至周六:8:30-5:00  周日可联系客服QQ
   
  建站咨询㈠ 建站咨询㈡ 售后服务 售前咨询  
关于阳光,吉林市网站建设,吉林市网站制作,网络公司
 当前位置:本站首页 >>> 行业新闻

朴素贝叶斯算法

日期:2016-11-25    来自:吉林市阳光网络科技有限公司   作者:Admin   去百度查找  去Google查找

   朴素贝叶斯算法是基于一个训练集合工作的,根据这个训练集从而做出相应的预测。这个算法运用了简单的统计学以及一点数学去进行结果的计算。比如像下面四个文本组成的训练集合:
语句 类型
Symfony is the best Positive
PhpStorm is great Positive
Iltar complains a lot Negative
No Symfony is bad Negative

  如果给定语句是“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]++; // 增加类型的语句统计
}

有了这个集合以后,现在这个算法就可以根据历史数据接受预测训练了。

定义

  为了解释这个算法是如何工作的,几个定义是必要的。首先,让我们定义一下输入的语句是给定类型中的一个的概率。这个将会表示为P(Type)。它是以已知类型的数据的类型作为分子,还有整个训练集的数据数量作为分母来得出的。一个数据就是整个训练集中的一个。到现在为止,这个方法可以将会命名为totalP,像下面这样:

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

请注意,在这里分子和分母都加了1。这是为了避免分子和分母都为0的情况。

  根据上面的训练集的例子,积极和消极的类型都会得出0.6的概率。每中类型的数据都是2个,一共是4个数据所以就是(2+1)/(4+1)。

  第二个要定义的是对于给定的一个词是属于哪个确定类型的概率。这个我们定义成P(word,Type)。首先我们要得到一个词在训练集中给出确定类型出现的次数,然后用这个结果来除以整个给定类型数据的词数。这个方法我们定义为p:

function p($word, $type)
{
$count = isset($this->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)。

  最后,这个算法应该只关心关键词而忽略其他的因素。一个简单的方法就是将给定的字符串中的单词分离出来:


function getWords($string)
{
return preg_split('/\s+/', preg_replace('/[^A-Za-z0-9\s]/', '', strtolower($string)));
}

准备工作都做好了,开始真正实施我们的计划吧!

预测

  为了预测语句的类型,这个算法应该计算所给定语句的两个类型的概率。像上面一样,我们定义一个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中实际操作一下了:

function guess($statement)
{
$words = $this->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;
}

这就是所有的工作,现在算法可以预测语句的类型了。你要做的就是让你的算法开始学习:

$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"
结束语

  尽管我们只进行了很少的训练,但是算法还是应该能给出相对精确的结果。在真实环境,你可以让机器学习成百上千的记录,这样就可以给出更精准的结果。

 
上一篇:thinkphp3.0 模板中函数的使用
下一篇:淘宝猜你喜欢是如何实现的
  阳光新闻 更多>>>
吉林网站建设_吉林网页制作-阳光新闻
2018年五一放假通知
2018年清明节放假通知
祝福到!给您送祝福啦!
2018年春节放假通知!
2017年国庆中秋放假安排
2017年春节放假通知
  招贤纳士 更多>>>
诚招吉林市网站建设商务经理
招聘吉林市网站建设技术员
公司招收吉林市网站开发学员
因业务发展需要特诚聘商务代表
  网站建设专题 更多>>>
阳光科技为您提供网站改版服务
为什么网页设计要简练?
如何在百度提交收录,怎样让自己的网站排名
什么样的网站最受访客喜欢?
吉林市网站建设形式与内容应统一
网站管理与团队经营的秘诀
优质的单页网站如何创建
 
Copyright © 2008-2018 www.jlsyg.com, All Rights Reserved    
电话:13843226952  联系人:王经理
ICP备案号:吉ICP备10003760号   技术支持:吉林网站建设
打造好的吉林网络公司!我们为您提供高品质的吉林网站建设吉林市网站建设吉林网站制作吉林网页制作吉林网站优化吉林seo服务!