今天,咱也来任性地扒一扒贝叶斯分类器的那些事儿
朴素贝叶斯由于其简单易用、易于理解的特点,已经广泛应用于文本分类、医疗诊断的应用场景。下面就简单总结一下朴素贝叶斯分类器中的相关知识点:
一、贝叶斯定理:
朴素贝叶斯分类器是一种统计学的分类方法,其基于朴素贝叶斯定理,给定一个样本观测点,预测其属于某一类的概率。先回顾一下什么是贝叶斯定理:
首先引入概率中的两个基本公式,
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值)。比较这几个概率,就可以知道他最可能得什么病。
[data_Tang,text_Tang] = xlsread('C:UsersAdministratorDesktopTang.csv'); data_Tang = data_Tang(:,2); ProbIdx_Tang = data_Tang/sum(data_Tang); [data_Song,text_Song] = xlsread('C:UsersAdministratorDesktopSong.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 属于宋词的概率 %d ', ... Prob_tang/Prob_sum, Prob_song/Prob_sum); if (Prob_tang>Prob_song) disp('这是一首唐诗') else disp('这是一首宋词') end算法实例输出:
属于唐诗的概率 9.999996e-001 属于宋词的概率 4.300644e-007 这是一首唐诗