朴素贝叶斯算法资料整理和PHP 实现版本

朴素贝叶斯算法简洁

http://blog.csdn.net/xlinsist/article/details/51236454

引言

先前曾经看了一篇文章,一个老外程序员写了一些很牛的Shell脚本,包括晚下班自动给老婆发短信啊,自动冲Coffee啊,自动扫描一个DBA发来的邮件啊, 等等。于是我也想用自己所学来做一点有趣的事情。我的想法如下:

首先我写个scrapy脚本来抓取某个网站上的笑话

之后写个Shell脚本每天早上6点自动抓取最新的笑话

然后用朴素贝叶斯模型来判断当前的笑话是否属于成人笑话

如果是成人笑话,用脚本把它自动发给好兄弟的邮箱

如果不是成人笑话,用脚本把它自动发给女朋友的邮箱

在这个系列的文章中,你会学到:

朴素贝叶斯背后的数学原理

算法具体的工作过程(结合实例)

scikit-learn快速实现算法

这个系列的文章还会涉及到scrapy,pandas,numpy的一些知识,遇到这些知识的时候我会具体解释的。这个系列的文章我会主要详细的介绍上面的第3步实现过程,其余的我会将源码放在github上供大家参考。下面,就让我们享受这个奇妙之旅吧。

朴素贝叶斯概述

众所周知,朴素贝叶斯是一种简单但是非常强大的线性分类器。它在垃圾邮件分类,疾病诊断中都取得了很大的成功。它只所以称为朴素,是因为它假设特征之间是相互独立的,但是在现实生活中,这种假设基本上是不成立的。那么即使是在假设不成立的条件下,它依然表现的很好,尤其是在小规模样本的情况下。但是,如果每个特征之间有很强的关联性和非线性的分类问题会导致朴素贝叶斯模型有很差的分类效果。

朴素贝叶斯背后的数学原理

后验概率(Posterior Probabilities)

为了更好地了解朴素贝叶斯分类器是怎么工作的,了解贝叶斯法则是很必要的。它可以被简单地描述成下面的公式:

后验概率=条件概率先验概率现象概率

我们可以用一个关于老天是否下雨的例子来解释上面的公式。

P(给定天上有乌云,下雨的概率)=P(给定天上下雨,有乌云的概率)P(下雨的概率)P(有乌云的概率)

我们可以看到,如果我们想要在给定现象下,预测某种结果的概率,我们必须知道:1、在给定这种结果下,出现这种现象的概率。2、出现这种结果的概率。3、出现这种现象的概率。

在实际应用中,我们的现象不可能只有一个,比如,在垃圾邮件分类中,甚至可能有几千个词的特征向量。下面,我将引入一些数学上的记号来统一后面的表达:

ωj表示属于哪个类别,j∈{1,2,3,…,m}

xi表示特征向量中的第i个特征,i∈{1,2,3,…,n}

朴素贝叶斯的目标就是分别求得P(ωj|给定现象)j∈{1,2,3,…,m},选出最大的概率。

下面我将分别解释上面的三个概率。

条件概率(Conditional Probabilities)

随机变量的独立性意味着我告诉你一个变量的出现,并不影响你相信另一个出现的可能。最简单的一个例子就是抛硬币,也就是第一次的反正面并不会影响你再一次抛出现反正面的概率(也就是0.5)。

朴素贝叶斯模型中,特征之间不仅仅是独立的,而且是加条件的独立的。比如说:我的特征向量x中,有n个特征,那么我可以把概率写成下面的形式:

P(x|ωj)=P(x1|ωj)P(x2|ωj)P(x3|ωj)P(xn|ωj)=∏k=1nP(xk|ωj)

P(x|ωj)的概率我们可以理解成:在给定属于某个类别的条件下,观察到出现现象x的概率。在特征向量中的每个特点的概率我们都可以通过极大似然估计(maximum-likelihood estimate)来求得,也就是简单地求某个特征在某个类别中的频率,公式如下:

P(xi|ωj)=Nxi|ωjNωj(i=(1,…,n))

Nxi|ωj:在所有属于类别ωj的训练样本中,特征xi出现的次数

Nωj:在所有属于类别ωj的训练样本中,所有特征出现的次数

现在,我要用一个简单的分类垃圾邮件的例子来阐明上面的概念。比如我有4封邮件,其中2封为垃圾邮件,特征向量中有4个特征。具体如下表:

样本序号 love buy deal cat 是否为垃圾邮件

1 1 0 0 1 不是

2 0 1 1 0 是

3 0 1 0 1 是

4 1 0 1 1 不是

现在我要求P(buy,deal|spam)这个概率,通过条件的独立性和极大似然估计,我们可以求出这个概率:

P(buy,deal|spam)=P(buy|spam)P(deal|spam)=1+11+1+1+111+1+1+1=18

先验概率(Prior Probabilities)

先验概率道理其实很简单,在上面的那个垃圾邮件的例子中,我们可以用极大似然估计来求得:24,通式如下:

p(ωj)=NωjNc

Nωj:属于类ωj的样本数

Nc:所有的样本数

通过上面后验概率的公式,我们可知:如果先验概率服从均匀分布,那么后验概率将完全取决于条件概率和现象概率,然而现象概率是常量,所以后验概率就完全取决于条件概率了。

注意:我认为在某些分类应用中,先验概率应该去咨询应用领域的专家,你不能单凭样本中出现的概率来求得先验概率。比如:如果我的训练集中,下雨天的样本要比晴天的样本多,你不能说现实生活中下雨天的概率要比晴天的时候大。因此,对于某些应用,先验概率应该去咨询应用领域的专家。

现象概率(Evidence Probabilities)

现象概率是独立于类别的。比如上面那个垃圾邮件的例子,我想知道P(deal)这个现象发生的概率,我只需要找出我所有的样本中出现deal这个特征的概率,与属于哪个类别没有任何关系。

其实我们完全没有必要算出这个概率,因为我们要求属于哪个类别的概率最大,而在这个过程中,它对于每次计算类别的概率中(也就是P(ωj|xi))都是常量,所以它不会影响到最终的决策。

加上平滑(Additive Smoothing)

还是上面那个邮件的例子,假设我们要求P(love|spam),我们会发现,在垃圾邮件中并没有出现love这个词,因此概率为0,如果这个条件概率为0,那么整个后验概率就为0。为了避免0概率的发生,我们可以加上平滑项。把上面条件概率的公式改为下面的形式:

P(xi|ωj)=Nxi|ωj+αNωj+αn(i=(1,…,n))

Nxi|ωj:在所有属于类别ωj的训练样本中,特征xi出现的次数

Nωj:在所有属于类别ωj的训练样本中,所有特征出现的次数

α:附加的平滑项参数。α<1叫做Lidstone smoothing ;α=1叫做Laplace smoothing

n:特征数

一个PHP版本的朴素贝叶斯

http://blog.csdn.net/u012543061/article/details/53005029

时间: 07-23

朴素贝叶斯算法资料整理和PHP 实现版本的相关文章

挖掘算法(1)朴素贝叶斯算法

原文:http://www.blogchong.com/post/NaiveBayes.html 1 文档说明 该文档为朴素贝叶斯算法的介绍和分析文档,并且结合应用实例进行了详细的讲解. 其实朴素贝叶斯的概念以及流程都被写烂了,之所以写这些是方便做个整理,记录备忘.而实例部分进行了详细的描述,网络上该实例比较简单,没有过程. 至于最后部分,则是对朴素贝叶斯的一个扩展了,当然只是简单的描述了一下过程,其中涉及到的中文分词以及TFIDF算法,有时间再具体补上. 2 算法介绍 2.1 贝叶斯定理 (1

统计学习方法 -&gt; 朴素贝叶斯算法

需要知道的是在什么时候可以用朴素贝叶斯算法:需要保证特征条件独立. 主要过程是学习输入和输出的联合概率分布. 预测的时候,就可以根据输入获得对打后验概率对应的输出y. 先验概率:已知输出,求输入.后验概率相反. 简单来说朴素贝叶斯算法,就是在对样本进行学习之后,到了需要做决策的时候,给定x,给出最大概率的y.这个本质上就是一个典型的后验概率模型.不过在该模型的算法推到上,还用到了先验概率的计算.但注意:最终朴素贝叶斯就是一种后验概率模型求P(y|x). 后验概率模型有一个好处,相当于期望风险最小

朴素贝叶斯算法及实现

1.朴素贝叶斯算法介绍 一个待分类项x=(a,b,c...),判断x属于y1,y2,y3...类别中的哪一类. 贝叶斯公式: 算法定义如下: (1).设x={a1, a2, a3, ...}为一个待分类项,而a1, a2, a3...分别为x的特征 (2).有类别集合C={y1, y2,  y3,  ..} (3).计算p(y1|x), p(y2|x), p(y3|x), .... (4).如果p(y(k)|x)=max{p(y1|x), p(y2|x), p(y3|x), ....},则x属于

C#编程实现朴素贝叶斯算法下的情感分析

C#编程实现 这篇文章做了什么 朴素贝叶斯算法是机器学习中非常重要的分类算法,用途十分广泛,如垃圾邮件处理等.而情感分析(Sentiment Analysis)是自然语言处理(Natural Language Progressing)中的重要问题,用以对文本进行正负面的判断,以及情感度评分和意见挖掘.本文借助朴素贝叶斯算法,针对文本正负面进行判别,并且利用C#进行编程实现. 不先介绍点基础? 朴素贝叶斯,真的很朴素 朴素贝叶斯分类算法,是一种有监督学习算法,通过对训练集的学习,基于先验概率与贝叶

【数据挖掘】朴素贝叶斯算法计算ROC曲线的面积

题记:          近来关于数据挖掘学习过程中,学习到朴素贝叶斯运算ROC曲线.也是本节实验课题,roc曲线的计算原理以及如果统计TP.FP.TN.FN.TPR.FPR.ROC面积等等.往往运用ROC面积评估模型准确率,一般认为越接近0.5,模型准确率越低,最好状态接近1,完全正确的模型面积为1.下面进行展开介绍: ROC曲线的面积计算原理 一.朴素贝叶斯法的工作过程框架图 二.利用weka工具,找到训练的预处理数据 1.利用朴素贝叶斯算法对weather.nominal.arff文件进行

数据挖掘|朴素贝叶斯算法

作者:张一 链接:https://zhuanlan.zhihu.com/p/21571692 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 因为后期的项目将涉及到各种各样的价格数据处理问题,所以我们现在开始学习一些简单的数据清洗与算法的知识.关于算法,以前听起来觉得好高大上,现在开始学,觉得书上的描述并不是很通俗易懂,所以用自己的语言来简要写一下这些算法~ 注:非商业转载注明作者即可,商业转载请联系作者授权并支付稿费.本人已授权"维权骑士"网站(ht

朴素贝叶斯算法原理及实现

朴素贝叶斯算法简单高效,在处理分类问题上,是应该首先考虑的方法之一. 1.准备知识 贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类. 这个定理解决了现实生活里经常遇到的问题:已知某条件概率,如何得到两个事件交换后的概率,也就是在已知P(A|B)的情况下如何求得P(B|A).这里先解释什么是条件概率: 表示事件B已经发生的前提下,事件A发生的概率,叫做事件B发生下事件A的条件概率.其基本求解公式为:. 下面不加证明地直接给出贝叶斯定理: 2.朴素贝叶斯分类 2.1

朴素贝叶斯算法(Naive Bayes)

朴素贝叶斯算法(Naive Bayes) 阅读目录 一.病人分类的例子 二.朴素贝叶斯分类器的公式 三.账号分类的例子 四.性别分类的例子 生活中很多场合需要用到分类,比如新闻分类.病人分类等等. 本文介绍朴素贝叶斯分类器(Naive Bayes classifier),它是一种简单有效的常用分类算法. 回到顶部 一.病人分类的例子 让我从一个例子开始讲起,你会看到贝叶斯分类器很好懂,一点都不难. 某个医院早上收了六个门诊病人,如下表. 症状 职业 疾病 打喷嚏 护士 感冒  打喷嚏 农夫 过敏

初识分类算法(3)-----朴素贝叶斯算法

1. 例子引入:如上篇的play or not 例子. 未知分类的样本:D:<A=sunny, B=cool, C=high ,D=strong>,  是 or 否? 我们要判断该样本的分类,即比较该样本属于是的概率大还是否的概率大 P(是/否|A=sunny, B=cool, C=high ,D=strong) P(是|A=sunny, B=cool, C=high ,D=strong)=P(是,(A=sunny, B=cool, C=high ,D=strong))/P(A=sunny,