贝叶斯定理与朴素贝叶斯分类器

时间:2022-12-20 13:18:17

   今天,咱也来任性地扒一扒贝叶斯分类器的那些事儿

   朴素贝叶斯由于其简单易用、易于理解的特点,已经广泛应用于文本分类、医疗诊断的应用场景。下面就简单总结一下朴素贝叶斯分类器中的相关知识点:

一、贝叶斯定理:

    朴素贝叶斯分类器是一种统计学的分类方法,其基于朴素贝叶斯定理,给定一个样本观测点,预测其属于某一类的概率。先回顾一下什么是贝叶斯定理:

首先引入概率中的两个基本公式,

1、条件概率的公式:

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

即事件A和事件B同时发生的概率等于在发生A的条件下B发生的概率乘以A的概率。

2、全概率公式:假设B是由相互独立的事件组成的概率空间{B1,b2,...bn}、则P(A)可以用全概率公式展开:

P(A)=P (A|B1)P(B1)+P(A|B2)P(B2)+..P(A|Bn)P(Bn)

我们把P(Bi|A)称作后验概率,而P(A|Bn)P(Bn)为先验概率。而P(Bi)又叫做基础概率。

通常,事件A在事件B(发生)的条件下的概率,与事件B在事件A(发生)的条件下的概率是不一样的;然而,这两者的关系有贝叶斯公式联系起来:

P(Bi|A)=P(A|Bi)P(Bi)/(P(A|B1)P(B1)+P(A|B2)P(B2)+..P(A|Bn)P(Bn))

通常事件B先与事件A发生,并且现在已经观测到A已经发生,需要去推导事件Bi发生的可能性(即哪个事件已经发生才导致了最后A发生),这是一个知果求因的过程。这样比较P(Bi|A)的大小,我们就可以知道是哪个事件Bi最有可能发生。

阮一峰的博客上有一个很好的例子,这里借鉴一下,也许会更好理解:

某个医院早上收了六个门诊病人,如下表:

  症状  职业   疾病

  打喷嚏 护士   感冒
  打喷嚏 农夫   过敏
  头痛  建筑工人 脑震荡
  头痛  建筑工人 感冒
  打喷嚏 教师   感冒
  头痛  教师   脑震荡

现在又来了第七个病人,是一个打喷嚏的建筑工人。请问他患上感冒的概率有多大?

根据贝叶斯定理

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

可得

   P(感冒|打喷嚏x建筑工人)
    = P(打喷嚏x建筑工人|感冒) x P(感冒)
    / P(打喷嚏x建筑工人)

假定"打喷嚏"和"建筑工人"这两个特征是独立的,因此,上面的等式就变成了

   P(感冒|打喷嚏x建筑工人)
    = P(打喷嚏|感冒) x P(建筑工人|感冒) x P(感冒)
    / P(打喷嚏) x P(建筑工人)

这是可以计算的。

  P(感冒|打喷嚏x建筑工人)
    = 0.66 x 0.33 x 0.5 / 0.5 x 0.33
    = 0.66

因此,这个打喷嚏的建筑工人,有66%的概率是得了感冒。同理,可以计算这个病人患上过敏或脑震荡的概率(这里这两个概率都为0值)。比较这几个概率,就可以知道他最可能得什么病。

其实这个例子已经开始分类了,是否患病,患哪种病,只不过都是概率的形式来描述。

二、朴素贝叶斯分类器:
    朴素贝叶斯分类器基于以上所讲的贝叶斯定理,由于属性i和属性j对给定类A的影响是不同的当它们之间可能相互影响,这一点会妨碍我们计算后验概率,因此为了简化计算过程,我们假设属性值在给定类上的影响独立于其他属性值(这一条也称之为类条件独立性),我们认为这种简化过程是“朴素的”,因此基于该思想的分类就称之为“朴素贝叶斯分类器”(Naive Bayesian)。
    朴素贝叶斯分类包括一下步骤:
1、给定训练样本及样本样本对应的类标号构成的集合DataSet,每个样本用一个n维属性描述X = {x1,x2,...,xn}
2、假设一共有m个类C1、C2、...Cm,计算这m个类的先验概率P(C1)、P(C2)、...、P(Cm),通常可以由样本集合         DataSet估计。
3、计算条件X下,P(Ci|X)概率,即X属于类别Ci的概率:
   P(Ci|X) = P(X|Ci)*P(Ci)/P(X)
    使用类条件假设则P(X|Ci) = P(x1|Ci)*P(x2|Ci)...P(xn|Ci)
    比较P(Ci|X)与P(Cj|X)的大小:
    若 P(Ci|X) > P(Cj|X)  (1<=j<=m,j≠i) 成立
    则X属于类别Ci。
    注意一下几点,计算更为简便:
    (1)、分母P(X)对所有类是等价的,其大小并不影响最后P(Ci|X)与P(Cj|X)的比较,因此可以忽略不算也行;
    (2)、若X中属性xi是连续值属性,可以对xi进行分布拟合,在拟合其概率,如假设对应类Cj中属性值xi服从高斯分布,可以使用MLE方法估计属性xi的均值与方差参数,再利用高斯分布公式进行计算P(X|Ci)
   (3)、若X中属性xi是离散值属性,则P(X|Ci)使用类Ci中xi频数与样本总数的比值进行估计。
前面做过一个唐诗宋词的分析,请看这里:且看看唐诗宋词都在写什么,接下来,使用该文中的词频统计与朴素贝叶斯分类方法,对输入的一篇的诗文进行一个简单的分类:
第一步:对唐诗及宋词建立键值表TP、SP,键为词语,值为当前类下该词出现的概率;
第二步:输入一首唐诗Poetry,并对其进行分词(这里的分词就不多赘述了,网上有很多Package可供使用)
第三步:对已分词的Poetry在TP、SP中查询各词的概率,未查询到该词的词语可以将其认为是稀有词、按照可查询词         中的最小概率值计算;
第四步:按照贝叶斯定理计算Poetry属于各类的概率P(C1|Poetry)、P(C2|Poetry)
第五步:比较P(C1|Poetry)、P(C2|Poetry)的大小,并输出所属类别;
以下是用Matlab做的一个简单算法实例,中文分词、词频统计程序可以在这里下载
[data_Tang,text_Tang]  = xlsread('C:\Users\Administrator\Desktop\Tang.csv');
data_Tang = data_Tang(:,2);
ProbIdx_Tang = data_Tang/sum(data_Tang);


[data_Song,text_Song]  = xlsread('C:\Users\Administrator\Desktop\Song.csv');
ProbIdx_Song = data_Song/sum(data_Song);


% 静夜思 李白 床前 明月 光,疑是 地上 霜。举头 望 明月,低头 思 故乡。
text_test = ['床前' '明月' '光' '疑是' '地上' '霜'...
             '举头' '望' '明月' '低头' '思' '故乡'];
Prob_tang = 1;
Prob_song = 1;
m=[];
n=[];
for i=1:length(data_Tang)
    for j=1:length(text_test)
        if ( strcmpi(text_Tang(i),text_test(j) ) )
            Prob_tang = Prob_tang*ProbIdx_Tang(i);
            m = [m,j]; 
        end 
    end
end
if (length(m)<length(text_test))
    Prob_tang = (min(ProbIdx_Tang))^(length(text_test)-length(m));
end




for i=1:length(data_Song)
    for j=1:length(text_test)
        if ( strcmpi(text_Song(i),text_test(j) ) )
            Prob_song = Prob_song*ProbIdx_Song(i);
            n = [n,j]; 
        end 
    end
end
if (length(n)<length(text_test))
    Prob_song = (min(ProbIdx_Song))^(length(text_test)-length(n));
end
Prob_sum = Prob_tang+Prob_song;
fprintf('属于唐诗的概率 %d \n 属于宋词的概率 %d \n', ...
         Prob_tang/Prob_sum, Prob_song/Prob_sum);


if (Prob_tang>Prob_song)
    disp('这是一首唐诗')
   else
    disp('这是一首宋词')
end
算法实例输出:
属于唐诗的概率 9.999996e-001 
属于宋词的概率 4.300644e-007 
这是一首唐诗
   
    当然,由于词频统计使用的是全唐诗,当然包含了当前分析的这首”静夜思“,是存在一点问题的;当然,若看盗墓笔记看多了,决定任性的去盗墓,发现墓中石壁刻有奇诗一首,不妨把唐诗宋词元曲以及魏晋南北朝的诗词都包含进来构建一个更复杂一点的分类器,看看你所盗之墓的朝代以及文物价值。这里纯属说笑哈~,主要还是讨论下朴素贝叶斯分类器及可能的应用价值。