[白话解析] 深入浅出朴素贝叶斯模型原理及应用 (3)

对于有两个类别c1,c1的分类问题来说,其特征为w1,⋯,wn,特征之间是相互独立的,属于类别c1的贝叶斯模型的基本过程为:

P(c1∣w1,⋯,wn)=P(w1,⋯,wn∣c1)⋅P(c1) / P(w1,⋯,wn) 如果做句子分类,可以认为是出现了w1, w2, ..., wn这些词之后,该句子被归纳到c1类的概率。

其中:

P(w1,⋯,wn)=P(w1,⋯,wn∣c1)⋅P(c1) + P(w1,⋯,wn∣c2)⋅P(c2)

预测的过程使用到了上述的公式,即:
\[ P(c1∣w1,⋯,wn)=\frac{P(w1,⋯,wn∣c1)⋅P(c1)}{P(w1,⋯,wn∣c1)⋅P(c1)+P(w1,⋯,wn∣c2)⋅P(c2)} \]
对上述的公式简化:
\[ P(c1∣w1,⋯,wn)=\frac{P(w1,⋯,wn∣c1)⋅P(c1)}{P(w1,⋯,wn∣c1)⋅P(c1)+P(w1,⋯,wn∣c2)⋅P(c2)} \]

\[ =\frac{1}{1+\frac{P(w1,⋯,wn∣c2)⋅P(c2)}{P(w1,⋯,wn∣c1)⋅P(c1)}} \]

\[ =\frac{1}{1+exp[log(\frac{P(w1,⋯,wn∣c2)⋅P(c2)}{P(w1,⋯,wn∣c1)⋅P(c1)})]} \]

\[ =\frac{1}{1+exp[log(P(w1,⋯,wn∣c2)⋅P(c2))−log(P(w1,⋯,wn∣c1)⋅P(c1))]} \]

其中,分母中的1可以改写为:
\[ 1=exp[log(P(w1,⋯,wn∣c1)⋅P(c1))−log(P(w1,⋯,wn∣c1)⋅P(c1))] \]

3. 结合公式再详解代码

根据上面的公式,针对c1, c2,我们需要

a. 先求

\[ P(w1,⋯,wn∣c1)⋅P(c1) \]

b. 再求

\[ P(c1) \]

结合代码

p(Ck) = k这类词出现的概率 = self.d[k].getsum() / self.total p(w1|Ck) = w1这个词在Ck类出现的概率 = self.d[k].freq(word) k = 1,2 c. 再计算

\[ log(P(w1,⋯,wn∣c1)⋅P(c1)) \]

这个公式就是
\[ log(P(w1|c1)...p(wn∣c1)⋅P(c1)) \]
这个公式的结果就是:
\[ log(sum_{p(w1|C1)...p(wn|C1)}) + log(P(c1)) \]
最后展开:
\[ log(sum_{p(w1|C1)...p(wn|C1)}) + log(self.d[1].getsum()) - log(self.total)) \]
这个就是下面的 tmp[k]。其中,第一个for循环中的tmp[k]对应了公式中的log(P(ck)),第二个for循环中的tmp[k]对应了公式中的log(P(w1,⋯,wn∣ck)⋅P(ck))。两个for循环的结果就是最终的tmp[k]。

def classify(self, x): tmp = {} for k in self.d: # 正类和负类 tmp[k] = log(self.d[k].getsum()) - log(self.total) # 正类/负类的和的log函数-所有之和的log函数 for word in x: tmp[k] += log(self.d[k].freq(word)) # 词频,不存在就为0 ret, prob = 0, 0 for k in self.d: now = 0 try: for otherk in self.d: now += exp(tmp[otherk]-tmp[k]) # for循环中有一个结果是0, exp(0)就是1.就是上面分母中的1 now = 1/now except OverflowError: now = 0 if now > prob: ret, prob = k, now return (ret, prob) 0x04 参考

朴素贝叶斯分类模型(一)

朴素贝叶斯分类——大道至简

带你搞懂朴素贝叶斯分类算法

snownlp情感分析源码解析

朴素贝叶斯详解及中文舆情分析

[数据挖掘]朴素贝叶斯分类

NLP系列(2)_用朴素贝叶斯进行文本分类(上)

情感分析——深入snownlp原理和实践

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyxddw.html