写在前面的话:

我现在大四,毕业设计是做一个基于大数据的用户画像研究分析。所以开始学习数据挖掘的相关技术。这是我学习的一个新技术领域,学习难度比我以往学过的所有技术都难。虽然现在在一家公司实习,但是工作还是挺忙的,经常要加班,无论工作多忙,还是决定要写一个专栏,这个专栏就写一些数据挖掘算法、数据结构、算法设计和分析的相关文章。通过写博文来督促自己不断学习。以前对于数学没有多大的兴趣爱好,从小到大,学数学也是为了考试能考个好的成绩,学过的很多数学知识,并没有深刻的感受到它的用途,不用也就慢慢遗忘,但自从我看了数学之美这本书和开始学习数据挖掘后,使我对数学有了很大的兴趣。数学源于生活,用于生活。数据挖掘中涉及到很多统计学、线性代数、微积分等相关知识,而我的很多数学知识都已经还给我以前的老师了,所以现在只能慢慢一点一点捡起来。要感谢网上有很多作者写出的好的文章,让我受益匪浅,也算是站在他们的肩膀上学习。减少了我的学习困难,而我今天开始写的专栏里的一系列文章,很多例子都是借鉴于他们文章中的例子。想了想,这个专栏名称就叫<<算法大杂烩>>,以后我会把我工作中用到的、自己学习的新算法、以及回顾梳理的每一个算法的学习笔记和心得都更新到这个专栏里。写的博文难免会有写得不好的地方,欢迎大家指正,我也喜欢和有共同学习爱好的人一起学习交流。

不一定每天都更会更新,但是肯定会坚持写下去。

今天写的第一篇博文,是关于朴素贝叶斯分类的。几年前,我就听说过这个算法,只是稍微了解一点点,仅仅停留在只知道它是通过贝叶斯定理来分类的。写这篇文章之前,我看了很多的相关知识,包括书籍和网上的一些优秀的博文。哈哈,到现在也应该算对于这个算法入门了吧。后面的参考链接中会附上一些参考的文章地址。

朴素贝叶斯分类

引子

朴素贝叶斯分类是一种常用的分类算法,他根据研究对象的某些特征,来推断出该研究对象属于该研究领域的哪个类别。
数学是解决我们生活中产生的各种问题的。所以,数学源于生活,生活中也处处体现数学,我们编程,不过是把人能够理解的数学知识转换成计算机能够理解的形式来解决实际问题。拿朴素贝叶斯分类来说,其实生活中比比皆是,举个例子:
我们在大街上看到一个人,猜测他属于哪个职业。这就是一种分类,你是根据什么来判断的。可能是根据这个人的穿着打扮,言行举止。
穿着打扮:胡子拉碴、头发乱七八糟,背着大的电脑包
言行举止:双眼无神(估计在想哪个bug的解决办法),黑眼圈重,头发没洗。
所以,我大概能看出这个人职业是程序员(开个玩笑,这只是程序员自黑而已,我身边的程序员都不是这样的,当然也包括我)。
其实穿着打扮、言行举止就是人的特征属性
我们要对某个对象分类,必须根据他的特征属性来判断。

概述

要了解贝叶斯分类,必须了解贝叶斯定理,贝叶斯定理离不开条件概率
条件概率定义:
事件A在另外一个事件B已经发生条件下的发生概率。条件概率表示为P(A|B),读作“在B条件下A的概率”。
根据文氏图,可以很清楚地看到在事件B发生的情况下,事件A发生的概率就是P(A∩B)除以P(B)。

根据文氏图,可以很清楚地看到在事件B发生的情况下,事件A发生的概率就是P(A∩B)除以P(B)。

P(A|B)=P(A∩B)/P(B)

因此,

P(A∩B)=P(A|B)P(B)

所以,

P(A|B)P(B)=P(B|A)P(A)

P(A|B)=P(B|A)P(A)/P(B)

上面的公式就是贝叶斯定理
生活中,我们经常知道这种情况 ,P(A|B),但是不知道P(B|A).比如:
A:   表示用户收入高
B:表示订购2G流量套餐
P(A|B) 表示订购2G流量套餐的用户收入高的概率,这个可以通过统计的样本算出得到。
但是现在有一个用户收入高(A),他购买2G流量套餐(B)的概率是多少,即P(B|A),这才是我们关注
所以通过贝叶斯定理,我们可以把这两者挂上钩,求出我们想知道的P(B|A)

病人疾病预测分类例子

 
看一个简单的形式化的列子,来说明贝叶斯分类的作用
这个例子来自:阮一峰老师的介绍贝叶斯应用博文中的一个病人分类的例子
如下:其中特征属性是症状和职业,类别是疾病(包括感冒,过敏、脑震荡)
某个医院早上收了六个门诊病人,如下表。
[plain] view plaincopy print?
  1. 症状  职业   疾病
  2. 打喷嚏 护士   感冒
  3. 打喷嚏 农夫   过敏
  4. 头痛  建筑工人 脑震荡
  5. 头痛  建筑工人 感冒
  6. 打喷嚏 教师   感冒
  7. 头痛  教师   脑震荡
现在又来了第七个病人,是一个打喷嚏的建筑工人。请问他患上感冒的概率有多大?
根据贝叶斯定理:
P(A|B) = P(B|A) P(A) / P(B)
可得
[plain] view plaincopy print?
  1. P(感冒|打喷嚏x建筑工人)
  2.     = P(打喷嚏x建筑工人|感冒) x P(感冒)
  3.     / P(打喷嚏x建筑工人)
假定"打喷嚏"和"建筑工人"这两个特征是独立的,因此,上面的等式就变成了
[plain] view plaincopy print?
  1. P(感冒|打喷嚏x建筑工人)
  2.     = P(打喷嚏|感冒) x P(建筑工人|感冒) x P(感冒)
  3.     / P(打喷嚏) x P(建筑工人)
这是可以计算的。
[plain] view plaincopy print?
  1. P(感冒|打喷嚏x建筑工人)
  2.     = 0.66 x 0.33 x 0.5 / 0.5 x 0.33
  3.     = 0.66
因此,这个打喷嚏的建筑工人,有66%的概率是得了感冒。同理,可以计算这个病人患上过敏或脑震荡的概率。比较这几个概率,就可以知道他最可能得什么病。
这就是贝叶斯分类器的基本方法:在统计资料的基础上,依据找到的一些特征属性,来计算各个类别的概率,找到概率最大的类,从而实现分类。

贝叶斯分类的定义

1、设为一个待分类项,而每个a为x的一个特征属性。

2、有类别集合

3、计算

4、求出在X个属性条件下,所有类别的概率,选取概率最大的。则X属于概率最大的类别

,则

根据贝叶斯定理,要求P(A|B),只要求出P(B|A)即可 .这里Y指A,X指B.把B分解为各个特征属性,求出每个类别的每个特征属性即可,如下

1、找到一个已知分类的待分类项集合,这个集合叫做训练样本集。

2、统计得到在各类别下各个特征属性的条件概率估计。即

3、如果各个特征属性是条件独立的,则根据贝叶斯定理有如下推导:

因为分母对于所有类别为常数,因为我们只要将分子最大化皆可。又因为各特征属性是条件独立的,所以有:

上式等号右边的每一项,都可以从统计资料中得到,由此就可以计算出每个类别对应的概率,从而找出最大概率的那个类。

注意:各个特征属性是条件独立的,这是朴素贝叶斯所要求的,如果各个特征属性不独立,就不属于朴素贝叶斯,属于贝叶斯网络,后面的文章会讲解。

账号真假检测例子

再看一个例子,该例子来自网上张阳的算法杂货铺博文

根据某社区网站的抽样统计,该站10000个账号中有89%为真实账号(设为C0),11%为虚假账号(设为C1)。

  C0 = 0.89

  C1 = 0.11

接下来,就要用统计资料判断一个账号的真实性。假定某一个账号有以下三个特征:

    F1: 日志数量/注册天数 
    F2: 好友数量/注册天数 
    F3: 是否使用真实头像(真实头像为1,非真实头像为0)

    F1 = 0.1 
    F2 = 0.2 
    F3 = 0

请问该账号是真实账号还是虚假账号?

方法是使用朴素贝叶斯分类器,计算下面这个计算式的值。

    P(F1|C)P(F2|C)P(F3|C)P(C)

虽然上面这些值可以从统计资料得到,但是这里有一个问题:F1和F2是连续变量,不适宜按照某个特定值计算概率。

一个技巧是将连续值变为离散值,计算区间的概率。比如将F1分解成[0, 0.05]、(0.05, 0.2)、[0.2, +∞]三个区间,然后计算每个区间的概率。在我们这个例子中,F1等于0.1,落在第二个区间,所以计算的时候,就使用第二个区间的发生概率。

根据统计资料,可得:

  P(F1|C0) = 0.5, P(F1|C1) = 0.1 
  P(F2|C0) = 0.7, P(F2|C1) = 0.2 
  P(F3|C0) = 0.2, P(F3|C1) = 0.9

因此,

  P(F1|C0) P(F2|C0) P(F3|C0) P(C0) 
    = 0.5 x 0.7 x 0.2 x 0.89 
    = 0.0623

  P(F1|C1) P(F2|C1) P(F3|C1) P(C1) 
    = 0.1 x 0.2 x 0.9 x 0.11 
    = 0.00198

可以看到,虽然这个用户没有使用真实头像,但是他是真实账号的概率,比虚假账号高出30多倍,因此判断这个账号为真。

贝叶斯分类的含义

长久以来,人们对一件事情发生或不发生的概率,只有固定的0和1,即要么发生,要么不发生,从来不会去考虑某件事情发生的概率有多大,不发生的概率又是多大。比如如果问那时的人们一个问题:“有一个袋子,里面装着若干个白球和黑球,请问从袋子中取得白球的概率是多少?”他们会想都不用想,会立马告诉你,取出白球的概率就是1/2,要么取到白球,要么取不到白球,即θ只能有一个值,不是1/2,就是0,而且不论你取了多少次,取得白球的概率θ始终都是1/2,即不随观察结果X 的变化而变化。

直到贝叶斯定理的出现,贝叶斯定理不把概率θ看做一个固定的值(比如上面取白球的概率一直都是1/2),而看做一个随机变量,他会随着观察结果变化

贝叶斯及贝叶斯派提出了一个思考问题的固定模式:

  • 先验分布 + 样本信息  后验分布

上述思考模式意味着,新观察到的样本信息将修正人们以前对事物的认知。换言之,在得到新的样本信息之前,人们对的认知是先验分布,在得到新的样本信息后,人们对的认知为

条件概率公式进行变形,可以得到如下形式:

P(A|B)=P(A)    *    P(B|A)/P(B)

我们把P(A)称为"先验概率",即在事件B发生之前,事件A发生的概率,在事件B发生之前,它是一个无条件分布,因为A还没有与事件B关联上,他是先验分布。

P(A|B)称为"后验概率"(Posterior probability),即在B事件发生之后,我们对A事件概率的重新评估。P(B|A)/P(B)称为"可能性函数"(Likelyhood),这是一个调整因子,使得预估概率更接近真实概率。它的分布就是后验分布

所以,条件概率可以理解成下面的式子:

  后验概率 = 先验概率 x 调整因子

这就是贝叶斯推断的含义。我们先预估一个"先验概率",然后加入实验结果,看这个实验到底是增强还是削弱了"先验概率",由此得到更接近事实的"后验概率"。

在这里,如果"可能性函数"P(B|A)/P(B)>1,意味着"先验概率"被增强,事件A的发生的可能性变大;如果"可能性函数"=1,意味着B事件无助于判断事件A的可能性;如果"可能性函数"<1,意味着"先验概率"被削弱,事件A的可能性变小。

水果糖问题例子

这个例子同样来自阮一峰老师的博文,加深对贝叶斯推断的理解

第一个例子。两个一模一样的碗,一号碗有30颗水果糖和10颗巧克力糖,二号碗有水果糖和巧克力糖各20颗。现在随机选择一个碗,从中摸出一颗糖,发现是水果糖。请问这颗水果糖来自一号碗的概率有多大?

我们假定,H1表示一号碗,H2表示二号碗。由于这两个碗是一样的,所以P(H1)=P(H2),也就是说,在取出水果糖之前,这两个碗被选中的概率相同。因此,P(H1)=0.5,我们把这个概率就叫做"先验概率",即没有做实验之前,来自一号碗的概率是0.5。

再假定,E表示水果糖,所以问题就变成了在已知E的情况下,来自一号碗的概率有多大,即求P(H1|E)。我们把这个概率叫做"后验概率",即在E事件发生之后,对P(H1)的修正。

根据贝叶斯定理,得到

P(H1|E)=P(H1)  *  P(E|H1)/P(E)

已知,P(H1)等于0.5,P(E|H1)为一号碗中取出水果糖的概率,等于0.75,那么求出P(E)就可以得到答案。根据全概率公式(不懂全概率公式的可以查找相关资料理解),

P(E)=P(E|H1) * P(H1)  +  P(E|H2)*P(H2)

所以,将数字代入原方程,得到

P(H1|E)=0.5*   0.75/0.625=0.6

这表明,来自一号碗的概率是0.6。也就是说,取出水果糖之后,H1事件的可能性得到了增强。

连续型特征属性和零概率事件处理

上面讲的特征属性值,都是离散的,账号真假检测例子中把连续的转换成区间,每个区间也可以看成离散的,但是如果在不能这样转换的情况下怎么解决?如果特征属性值是不是离散的,而是连续的怎么办?

我们是站在巨人的肩膀上,前人早已经为我们找到了应对之策

当特征属性为连续值时,通常假定其值服从高斯分布(也称正态分布)。即:

因此只要计算出训练样本中各个类别中此特征项划分的各均值和标准差,代入上述公式即可得到需要的估计值。(ak为观察到的属性值)

另一个需要讨论的问题就是当P(a|y)=0怎么办,当某个类别下某个特征项划分没有出现时,就是产生这种现象,这会令分类器质量大大降低。为了解决这个问题,引入了拉普拉斯校准,它的思想非常简单,就是对没类别下所有划分(概率为零的)的计数加1,这样如果训练样本集数量充分大时,并不会对结果产生影响,并且解决了上述频率为零的尴尬局面。

买电脑是否和收入相关的例子

验证买电脑,是否和收入有关的场景下:

类 buys_computer=yes包含1000个元组,有0个元组income=low  ,990个元组 income=medium,10个元组income=high,这些事件的概率分别是0,    0.990,    0.010.

有概率为0,肯定不行.使用拉普拉斯校准,对每个收入-值对应加1个元组,分别得到如下概率

[plain] view plaincopy print?
  1. 1/1003=0.001
  2. 991/1003=0.998
  3. 11/1003=0.011

这些校准的概率估计与对应的未校准的估计很接近,但是避免了零概率值

性别分类的例子

再看一个阮一峰老师的朴素贝叶斯应用一文中摘自维基百科的例子,关于处理连续变量的另一种方法。

下面是一组人类身体特征的统计资料。

[plain] view plaincopy print?
  1. 性别  身高(英尺) 体重(磅) 脚掌(英寸)
  2. 男     6       180     12
  3. 男     5.92     190     11
  4. 男     5.58     170     12
  5. 男     5.92     165     10
  6. 女     5       100      6
  7. 女     5.5      150      8
  8. 女     5.42     130      7
  9. 女     5.75     150      9

已知某人身高6英尺、体重130磅,脚掌8英寸,请问该人是男是女?

根据朴素贝叶斯分类器,计算下面这个式子的值。

P(身高|性别) x P(体重|性别) x P(脚掌|性别) x P(性别)

这里的困难在于,由于身高、体重、脚掌都是连续变量,不能采用离散变量的方法计算概率。而且由于样本太少,所以也无法分成区间计算。怎么办?

这时,可以假设男性和女性的身高、体重、脚掌都是正态分布,通过样本计算出均值和方差,也就是得到正态分布的密度函数。有了密度函数,就可以把值代入,算出某一点的密度函数的值。

比如,男性的身高是均值5.855、方差0.035的正态分布。所以,男性的身高为6英尺的概率的相对值等于1.5789(大于1并没有关系,因为这里是密度函数的值,只用来反映各个值的相对可能性)。

有了这些数据以后,就可以计算性别的分类了。

  P(身高=6|男) x P(体重=130|男) x P(脚掌=8|男) x P(男) 
    = 6.1984 x e-9

  P(身高=6|女) x P(体重=130|女) x P(脚掌=8|女) x P(女) 
    = 5.3778 x e-4

可以看到,女性的概率比男性要高出将近10000倍,所以判断该人为女性。

下一篇会写贝叶斯网络。

参考文章:

http://www.ruanyifeng.com/blog/2011/08/bayesian_inference_part_one.html

http://www.ruanyifeng.com/blog/2013/12/naive_bayes_classifier.html

http://www.cnblogs.com/leoo2sk/archive/2010/09/17/naive-bayesian-classifier.html

http://blog.csdn.net/zdy0_2004/article/details/41096141

参考书籍:数据挖掘概念与技术。数据挖掘十大算法,统计学概率论方面的数学知识

码字不易,转载请指明出自http://blog.csdn.net/tanggao1314/article/details/66478782

转载于:https://www.cnblogs.com/csguo/p/7804355.html

[数据挖掘]朴素贝叶斯分类相关推荐

  1. 数据挖掘-朴素贝叶斯分类

    数据挖掘-朴素贝叶斯分类 什么是分类? 分类是一种重要的数据分析形式,它提取刻画重要数据类的模型.这种模型称为分类器,预测分类的(离散的,无序的)类标号.例如医生对病人进行诊断是一个典型的分类过程,医 ...

  2. 数据挖掘——朴素贝叶斯分类

    <数据挖掘>国防科技大学 <数据挖掘>青岛大学 Python:贝叶斯分类 贝叶斯分类基于贝叶斯定理,是机器学习的核心方法之一. 目前研究较多的贝叶斯分类器主要有四种: 朴素贝叶 ...

  3. 数据挖掘—朴素贝叶斯分类算法(Java实现)

    算法描述 (1)扫描训练样本数据集,分别统计训练集中类别 Ci 的个数 Di 和属于类别Ci 的样本中属性Ak取值Xk为 Dik 的实例样本个数,构成统计表: (2)计算先验概率和条件概率,构成概率表 ...

  4. 【python数据挖掘课程】二十一.朴素贝叶斯分类器详解及中文文本舆情分析

    这是<Python数据挖掘课程>系列文章,也是我上课内容及书籍中的一个案例.本文主要讲述朴素贝叶斯分类算法并实现中文数据集的舆情分析案例,希望这篇文章对大家有所帮助,提供些思路.内容包括: ...

  5. python数据挖掘课程】二十一.朴素贝叶斯分类器详解及中文文本舆情分析

    #2018-04-06 13:52:30 April Friday the 14 week, the 096 day SZ SSMR python数据挖掘课程]二十一.朴素贝叶斯分类器详解及中文文本舆 ...

  6. 数据挖掘 | 判别分析 +朴素贝叶斯分类算法

    本节记录一下由贝叶斯定理延伸出来的几种预测性建模的方法,主要为线性判别分析(一次,二次),朴素贝叶斯(稍稍提一下贝叶斯网络) 1. 判别分析 判别分析适用于自变量连续,因变量为分类型的情形: 设因变量 ...

  7. 【Python】大数据挖掘课程作业3——使用朴素贝叶斯分类对B站评论进行分析

    [Python]大数据挖掘课程作业3--使用朴素贝叶斯分类对B站评论进行分析 参考资料:<Python数据科学手册> 数据来源:B站观察者网.观视频工作室.央视新闻.小央视频.环球网.环球 ...

  8. 【数据挖掘】拉普拉斯修正 ( 判别模型 | 概率模型 | 贝叶斯分类 | 拉普拉斯修正 | 朴素贝叶斯分类应用场景 | 朴素贝叶斯优缺点 )

    文章目录 I . 判别模型 与 概率模型 II . 贝叶斯分类 III . 拉普拉斯修正 IV . 使用 朴素贝叶斯分类器 + 拉普拉斯修正 为样本分类 ( 完整分类流程 ) V . 朴素贝叶斯分类器 ...

  9. 数据挖掘:基于朴素贝叶斯分类算法的文本分类实践

    前言: 如果你想对一个陌生的文本进行分类处理,例如新闻.游戏或是编程相关类别.那么贝叶斯分类算法应该正是你所要找的了.贝叶斯分类算法是统计学中的一种分类方法,它利用概率论中的贝叶斯公式进行扩展.所以, ...

最新文章

  1. hdu5007 小水题
  2. 锦州财经学校计算机系,锦州一职高与财经学校哪个好
  3. layui 下拉框空选项不显示_layui下select下拉框不显示或没有效果
  4. Puffer:专注拥塞控制、带宽预测和ABR
  5. 使用CMD命令删除文件函数
  6. 关服了的手游怎么进去_如果手游彻底停服了的话,我的二次元“老婆”们怎么办?...
  7. Python使用pdfkit、wkhtmltopdf将html转换为pdf错误记录文档
  8. 电商系统中API接口防止参数篡改和重放攻击(小程序/APP)
  9. oracle查询结果怎么去掉重复的,怎么去除重复的查询结果
  10. 商城GW-SHOP,基于 微信小程序 + springboot + vue 技术构建
  11. 搞深度学习框架的那帮人,不是疯子,就是骗子
  12. 高版本linux安装gamit,Linux下安装GAMIT10.5
  13. 关于Svchost.exe的说明及可能出现的问题解答
  14. 二月(不积跬步无以至千里)
  15. 如何在H3C路由器使用ACL来管理网络安全
  16. 初识c语言(入门篇)
  17. 渗透测试之信息收集 -tryhackme-Content Discovery
  18. 西电工作笔记(部分)【10000字】【原创】
  19. 【ACM 2020 - Text Recognition in the Wild:A Survey】OCR识别综述
  20. 1.2.2 musl pwn

热门文章

  1. 龙芯下中标系统C语言查找设备号_龙芯:主控进驻国产激光打印机并适配麒麟OS...
  2. ssh 端口_【科普】SSH都不懂,还搞什么网络
  3. LeetCode 1864. 构成交替字符串需要的最小交换次数
  4. Feature Engineering 特征工程 4. Feature Selection
  5. LeetCode 1306. 跳跃游戏 III(广度优先搜索BFS)
  6. python写字板_pywinauto简单操作写字板的例子
  7. eplise怎么连接数据库_eclipse连接mysql
  8. matlab打开笔记本摄像头_基于MATLAB调用电脑摄像头获取视频和图像
  9. 用户画像之Spark ML实现
  10. 计算机专业配置笔记本,学计算机专业的买什么样配置和价格的笔记本好?