写在前面的话:html
我如今大四,毕业设计是作一个基于大数据的用户画像研究分析。因此开始学习数据挖掘的相关技术。这是我学习的一个新技术领域,学习难度比我以往学过的全部技术都难。虽然如今在一家公司实习,可是工做仍是挺忙的,常常要加班,不管工做多忙,仍是决定要写一个专栏,这个专栏就写一些数据挖掘算法、数据结构、算法设计和分析的相关文章。经过写博文来督促本身不断学习。之前对于数学没有多大的兴趣爱好,从小到大,学数学也是为了考试能考个好的成绩,学过的不少数学知识,并无深入的感觉到它的用途,不用也就慢慢遗忘,但自从我看了数学之美这本书和开始学习数据挖掘后,使我对数学有了很大的兴趣。数学源于生活,用于生活。数据挖掘中涉及到不少统计学、线性代数、微积分等相关知识,而个人不少数学知识都已经还给我之前的老师了,因此如今只能慢慢一点一点捡起来。要感谢网上有不少做者写出的好的文章,让我受益不浅,也算是站在他们的肩膀上学习。减小了个人学习困难,而我今天开始写的专栏里的一系列文章,不少例子都是借鉴于他们文章中的例子。想了想,这个专栏名称就叫<<算法大杂烩>>,之后我会把我工做中用到的、本身学习的新算法、以及回顾梳理的每个算法的学习笔记和心得都更新到这个专栏里。写的博文不免会有写得很差的地方,欢迎你们指正,我也喜欢和有共同窗习爱好的人一块儿学习交流。程序员
不必定天天都更会更新,可是确定会坚持写下去。算法
今天写的第一篇博文,是关于朴素贝叶斯分类的。几年前,我就据说过这个算法,只是稍微了解一点点,仅仅停留在只知道它是经过贝叶斯定理来分类的。写这篇文章以前,我看了不少的相关知识,包括书籍和网上的一些优秀的博文。哈哈,到如今也应该算对于这个算法入门了吧。后面的参考连接中会附上一些参考的文章地址。编程
根据文氏图,能够很清楚地看到在事件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)
一、设为一个待分类项,而每一个a为x的一个特征属性。
二、有类别集合。
三、计算。
四、求出在X个属性条件下,全部类别的几率,选取几率最大的。则X属于几率最大的类别
,则
。
根据贝叶斯定理,要求P(A|B),只要求出P(B|A)便可 .这里Y指A,X指B.把B分解为各个特征属性,求出每一个类别的每一个特征属性便可,以下
一、找到一个已知分类的待分类项集合,这个集合叫作训练样本集。
二、统计获得在各种别下各个特征属性的条件几率估计。即。
三、若是各个特征属性是条件独立的,则根据贝叶斯定理有以下推导:
由于分母对于全部类别为常数,由于咱们只要将分子最大化皆可。又由于各特征属性是条件独立的,因此有:
上式等号右边的每一项,均可以从统计资料中获得,由此就能够计算出每一个类别对应的几率,从而找出最大几率的那个类。
注意:各个特征属性是条件独立的,这是朴素贝叶斯所要求的,若是各个特征属性不独立,就不属于朴素贝叶斯,属于贝叶斯网络,后面的文章会讲解。
再看一个例子,该例子来自网上张阳的算法杂货铺博文
根据某社区网站的抽样统计,该站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.0623P(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个元组,分别获得以下几率
这些校准的几率估计与对应的未校准的估计很接近,可是避免了零几率值
再看一个阮一峰老师的朴素贝叶斯应用一文中摘自维基百科的例子,关于处理连续变量的另外一种方法。
下面是一组人类身体特征的统计资料。
已知某人身高6英尺、体重130磅,脚掌8英寸,请问该人是男是女?
根据朴素贝叶斯分类器,计算下面这个式子的值。
P(身高|性别) x P(体重|性别) x P(脚掌|性别) x P(性别)
这里的困难在于,因为身高、体重、脚掌都是连续变量,不能采用离散变量的方法计算几率。并且因为样本太少,因此也没法分红区间计算。怎么办?
这时,能够假设男性和女性的身高、体重、脚掌都是正态分布,经过样本计算出均值和方差,也就是获得正态分布的密度函数。有了密度函数,就能够把值代入,算出某一点的密度函数的值。
好比,男性的身高是均值5.85五、方差0.035的正态分布。因此,男性的身高为6英尺的几率的相对值等于1.5789(大于1并无关系,由于这里是密度函数的值,只用来反映各个值的相对可能性)。
有了这些数据之后,就能够计算性别的分类了。
P(身高=6|男) x P(体重=130|男) x P(脚掌=8|男) x P(男)
= 6.1984 x e-9P(身高=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