朴素贝叶斯算法
假设我们有已知数据集 {(x1,y1),⋯,(xn,yn)},其中 xi=(xi(1),⋯,xi(m))T,yi∈{c0,c1,⋯,ck};这里表示我们有n 组数据集,每个数据集的输入有m 个特征,每个特征都属于k 个分类中的一个。
我们的需求是,如果此时有一个特征\mathbf{x},根据上面的数据集,我们需要推断出\mathbf{x}所属的分类。
根据数据集,我们能计算出先验概率:
P(Y=ck),k=1,2,⋯,K
有公式:
P(X=x∣Y=ck)=P(X(1)=x(1),⋯,X(n)=x(n)∣Y=ck)
为了减少参数计算,朴素贝叶斯假设所有的参数都是独立的。因此,上述表达式可以等价成:
P(X=x∣Y=ck)=i=1∏nP(X(j)=x(j)∣Y=ck)
根据贝叶斯公式:
P(Y=ck∣X=x)=∑kP(X=x∣Y=ck)P(Y=ck)P(X=x∣Y=ck)P(Y=ck)
分母对于所有的c_k都是相等的,因此我们最终要计算的学习结果为
f(x)=argmaxk P(X=x∣Y=ck)P(Y=ck)=argmaxk P(Y=ck)i=1∏nP(X(j)=x(j)∣Y=ck)
对于上述公式的两项,都能通过数据集计算出来。举个例子:
| 1 | 2 | 3 | 4 | 5 |
---|
X^{(1)} | 1 | 1 | 2 | 1 | 3 |
X^{(2)} | M | F | F | F | M |
Y | -1 | 1 | -1 | -1 | 1 |
假设给定的特征x={1,F},求解分类。
P(Y=1)=52
P(Y=−1)=53
P(X(1)=1∣Y=1)=21,P(X(2)=F∣Y=1)=21
P(X(1)=1∣Y=−1)=1,P(X(2)=F∣Y=−1)=1
k=1,结果为52×21×21=101
k=2,结果为53×1×1=53
所以最终结果是-1
拉普拉斯平滑
该方法是为了避免分母出现0的情况,在分子+λ,在分母上+Sjλ
应用实例
朴素贝叶斯可以快速用于海量互联网文本分类。
我们用鸢尾花的例子,借助 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