朴素贝叶斯分类器基于贝叶斯定理。
贝叶斯定理( Thomas Bayes) ,用来描述两个条件概率之间的关系,比如 P(A|B) 和 P(B|A)。按照乘法法则,可以立刻导出:P(A∩B) = P(A)*P(B|A)=P(B)*P(A|B)。如上公式也可变形为:P(B|A) = P(A|B)*P(B) / P(A)。
通常,事件A在事件B(发生)的条件下的概率,与事件B在事件A的条件下的概率是不一样的;然而,这两者是有确定的关系,贝叶斯法则就是这种关系的陈述。
其中P(A|B)是在B发生的情况下A发生的可能性。
在贝叶斯法则中,每个名词都有约定俗成的名称:
P(A)是A的先验概率或边缘概率。之所以称为”先验”是因为它不考虑任何B方面的因素。
P(A|B)是已知B发生后A的条件概率,也由于得自B的取值而被称作A的后验概率。
P(B|A)是已知A发生后B的条件概率,也由于得自A的取值而被称作B的后验概率。
P(B)是B的先验概率或边缘概率,也作标准化常量(normal。zed consnt)。
何为朴素?
即各个特征相互独立。
理论方面就不累述了,直接写用法。
同样用iris 数据集进行训练:
高斯模型
有些特征可能是连续型变量,比如说人的身高,物体的长度,这些特征可以转换成离散型的值,比如如果身高在160cm以下,特征值为1;在160cm和170cm之间,特征值为2;在170cm之上,特征值为3。也可以这样转换,将身高转换为3个特征,分别是f1、f2、f3,如果身高是160cm以下,这三个特征的值分别是1、0、0,若身高在170cm之上,这三个特征的值分别是0、0、1。不过这些方式都不够细腻,高斯模型可以解决这个问题。高斯模型假设这些一个特征的所有属于某个类别的观测值符合高斯分布。
多项式模型
该模型常用于文本分类,特征是单词,值是单词的出现次数。考虑重复词语的情况,也就是说,重复的词语我们视为其出现多次。
P((“代开”,“发票”,“增值税”,“发票”,“正规”,“发票”)|S)
=P(“代开””|S)P(“发票”|S)P(“增值税”|S)P(“发票”|S)P(“正规”|S)P(“发票”|S)
=P(“代开””|S)P^3(“发票”|S)P(“增值税”|S)P(“正规”|S)
注意这一项:P^3(“发票”|S)。
在统计计算P(“发票”|S)时,每个被统计的样本中重复的词语也统计多次。
P(“发票”|S)=出现“发票”的次数的总和所有词出现次数(计算重复次数)的总和
你看这个多次出现的结果,出现在概率的指数/次方上,因此这样的模型叫作多项式模型。
伯努利模型
伯努利模型中,对于一个样本来说,其特征用的是全局的特征。更加简化的方法是将重复的词语都视为其只出现1次.
P((“代开”,“发票”,“增值税”,“发票”,“正规”,“发票”)|S)
=P(“发票”|S)P(“代开””|S)P(“增值税”|S)P(“正规”|S)
出现了只计算一次
这样的模型叫作伯努利模型(又称为二项独立模型)。这种方式更加简化与方便。当然它丢失了词频的信息,因此效果可能会差一些。
“`
from sklearn import datasets
from sklearn.naive_bayes import GaussianNB
import matplotlib.pyplot as plt
import numpy as np
iris = datasets.load_iris()
x = iris.data[:, [1, 2]]
y = iris.target
gnb = GaussianNB()
gnb.fit(x, y)
y_pre = gnb.predict(x)
right_num = (iris.target == y_pre).sum()
print x.shape[0]
print right_num
print right_num.astype(“float”)/x.shape[0]
print gnb.score(x, y)
def plot_decision_visual(data, labels,classifier, resolution=0.1):
x_min, x_max = data[:, 0].min() - 1, data[:, 0].max() +1
y_min, y_max = data[:, 1].min() - 1, data[:, 1].max() +1
xx, yy = np.meshgrid(np.arange(x_min, x_max, resolution),
np.arange(y_min, y_max, resolution))
z = classifier.predict(np.array([xx.ravel(), yy.ravel()]).T)
z = z.reshape(xx.shape)
plt.contourf(xx, yy, z, alpha=0.5)
for i, m, color in zip(range(3), ‘>ox’, ‘rgb’):
plt.scatter(data[labels == i, 0],
data[labels == i, 1],
marker=m,
c=color)
plt.xticks([])
plt.yticks([])
plt.show()
plot_decision_visual(x, y, gnb)
“`