统计学习方法--朴素贝叶斯法

420 阅读1分钟

朴素贝叶斯算法

假设我们有已知数据集 {(x1,y1),,(xn,yn)}\{(\mathbf{x_1}, y_1),\cdots,(\mathbf{x_n}, y_n)\},其中 xi=(xi(1),,xi(m))Tyi{c0,c1,,ck}\mathbf{x_i}=(x_{i}^{(1)},\cdots,x_{i}^{(m)})^\mathrm{T},y_i\in \{c_0,c_1,\cdots,c_k\};这里表示我们有n 组数据集,每个数据集的输入有m 个特征,每个特征都属于k 个分类中的一个。

我们的需求是,如果此时有一个特征\mathbf{x},根据上面的数据集,我们需要推断出\mathbf{x}所属的分类。

根据数据集,我们能计算出先验概率:

P(Y=ck),k=1,2,,KP(Y=c_k), k=1,2,\cdots,K

有公式:

P(X=xY=ck)=P(X(1)=x(1),,X(n)=x(n)Y=ck)P(X=\mathbf{x}|Y=c_k)=P(X^{(1)}=x^{(1)},\cdots,X^{(n)}=x^{(n)}|Y=c_k)

为了减少参数计算,朴素贝叶斯假设所有的参数都是独立的。因此,上述表达式可以等价成:

P(X=xY=ck)=i=1nP(X(j)=x(j)Y=ck)P(X=\mathbf{x}|Y=c_k)=\prod_{i=1}^{n}P(X^{(j)}=x^{(j)}|Y=c_k)

根据贝叶斯公式:

P(Y=ckX=x)=P(X=xY=ck)P(Y=ck)kP(X=xY=ck)P(Y=ck)P(Y=c_k|X=\mathbf{x})=\frac{P(X=\mathbf{x}|Y=c_k)P(Y=c_k)}{\sum_{k}P(X=\mathbf{x}|Y=c_k)P(Y=c_k)}

分母对于所有的c_k都是相等的,因此我们最终要计算的学习结果为

f(x)=argmaxk P(X=xY=ck)P(Y=ck)=argmaxk P(Y=ck)i=1nP(X(j)=x(j)Y=ck)f(\mathbf{x})=\mathop{argmax}_k \ P(X=\mathbf{x}|Y=c_k)P(Y=c_k)\\= \mathop{argmax}_k\ P(Y=c_k)\prod_{i=1}^{n}P(X^{(j)}=x^{(j)}|Y=c_k)

对于上述公式的两项,都能通过数据集计算出来。举个例子:

12345
X^{(1)}11213
X^{(2)}MFFFM
Y-11-1-11

假设给定的特征x={1,F}\mathbf{x}=\{1,F\},求解分类。

P(Y=1)=25P(Y=1)=\frac{2}{5}

P(Y=1)=35P(Y=-1)=\frac{3}{5}

P(X(1)=1Y=1)=12,P(X(2)=FY=1)=12P(X^{(1)}=1|Y=1)=\frac{1}{2}, P(X^{(2)}=F|Y=1)=\frac{1}{2}

P(X(1)=1Y=1)=1,P(X(2)=FY=1)=1P(X^{(1)}=1|Y=-1)=1, P(X^{(2)}=F|Y=-1)=1

k=1,结果为25×12×12=110k=1,结果为\frac{2}{5} \times\frac{1}{2}\times\frac{1}{2}=\frac{1}{10}

k=2,结果为35×1×1=35k=2,结果为\frac{3}{5}\times1\times1=\frac{3}{5}

所以最终结果是-1

拉普拉斯平滑

该方法是为了避免分母出现0的情况,在分子+λ\lambda,在分母上+SjλS_j\lambda

应用实例

朴素贝叶斯可以快速用于海量互联网文本分类。

我们用鸢尾花的例子,借助 sklearn 的代码库来计算:

from sklearn.naive_bayes import GaussianNB
from sklearn import datasets
iris = datasets.load_iris()

gnb = GaussianNB()
y_pred = gnb.fit(iris.data, iris.target).predict(iris.data)
print("Number of mislabeled points out of a total %d points : %d" %
      (iris.data.shape[0], (iris.target != y_pred).sum()))

最终输出的结果:

Number of mislabeled points out of a total 150 points : 6