朴素贝叶斯分类(离散分类,python实例) - Blog of Mathias
Blog of Mathias Web Securtiy&Deep Learning
朴素贝叶斯分类(离散分类,python实例)
发表于: | 分类: 技术文章 | 评论:0 | 阅读:398
  • 朴素贝叶斯,是指在贝叶斯先验概率的基础上,每个独立事件,或者说特征(features)发生的概率可以看做各自独立的情况下的一种特殊的情况,针对普通的分类问题,作为一种生成模型具有很好的求解效果,但是在一些特征之间具有相互关联的情况下,就具有很大的局限性,这个时候联合概率分布不能看做是各个概率的简单乘积,而要加上先验概率.
    首先引入一个经典的统计学问题
    假设某个医院早上收了六个门诊病人。
      症状  职业   疾病
      打喷嚏 护士   感冒
      打喷嚏 农夫   过敏
      头痛  建筑工人 脑震荡
      头痛  建筑工人 感冒
      打喷嚏 教师   感冒
      头痛  教师   脑震荡
    现在又来了第七个病人,是一个打喷嚏的建筑工人。请问他患上感冒的概率有多大?
    由贝叶斯定理 P(A|B) = P(B|A) P(A) / P(B)
    由于对某些复杂的连续值难以进行处理,这里仅仅以这个基本问题作为引子
    对于朴素贝叶斯分类器来说,它假设所有特征都彼此独立
    假设某个体有n项特征(Feature),分别为F1、F2、...、Fn。现有m个类别(Category),分别为C1、C2、...、Cm。
    P(C|F1F2...Fn)
      = P(F1F2...Fn|C)P(C) / P(F1F2...Fn)
    由于 P(F1F2...Fn) 对于所有的类别都是相同的,可以省略,问题就变成了求
    P(F1F2...Fn|C)P(C)的最大值。
    也就是 P(F1|C)P(F2|C)..P(Fn|C)*P(C)
    也就是说 对于某种类别C,通过分别计算其出现的概率,可以大致判断对象的类别,也就是分类器
    简单的用伪代码做个思路梳理
    输入特征f1,f2....fn
    首先样本的各特征和类别都存储在相应的列表里
    对么对于P(c),代码如下

num=0
for i in category:
if(i==c):
num=num+1
那么P(c)=num/length(c)

由大数定理,这里可以近似的把频率看做概率。
对于其他的P(Fn|C)
由于数组长度相同 考虑用代码

num=0
other=0 
for i in category: 
if(i==c):
num=num+1
if(fn[i]==fn)
other=other+1

最终的P(Fn|C)=other/num
依次相乘,再进行对比即可
下面就对上面的例题做一个分类处理
感冒,过敏,脑震荡分别为1,2,3
打喷嚏,头痛分别为1,2
护士,农夫,建筑工人,教师分别为1,2,3,4
最终python代码如下

# -*- coding: gbk -*-
def calc(n):
    t=0;
    num=0;
    other1=0
    other2=0
    for i in category:
        if(i==n):
            num=num+1;
            if(f1[t]==1):
                other1=other1+1;
            if(f2[t]==3):
                other2=other2+1;
        t=t+1;
    cate1=float(num)/float(len(category));
    cate1=cate1*float(other1)/float(num);
    cate1=cate1*float(other2)/float(num);
    return cate1;
f1=[1,1,2,2,1,2];
f2=[1,2,3,3,4,4];
category=[1,2,3,1,1,3];
c1=calc(1);
c2=calc(2);
c3=calc(3);
print "患感冒的可能度为:%f 患过敏的可能度为:%f 患脑震荡的可能度为:%f" % (c1,c2,c3);

1.png

很明显 通过这个度量值,该患者最可能患感冒. 要注意这里的可能度并不是概率 而舍弃了常量部分。

还不快抢沙发

添加新评论