1. 简介
朴素贝叶斯法(Naive Bayes model,NBM)是基于贝叶斯定理与特征条件独立假设的分类方法,它与决策树模型(Decision Tree Model)是使用最广泛的分类模型。与决策树模型相比,朴素贝叶斯分类器(Naive Bayes Classifier 或 NBC)发源于古典数学理论,有着坚实的数据基础,以及稳定的分类效率同时NBC模型所需要的模型参数很少,对缺失数据不太敏感,算法也比较简单。理论上NBC模型与其他分类相比具有最小的误差率。
2.定义
2.1 贝叶斯方法
贝叶斯方法是基于贝叶斯原理的分类方法,通过使用概率统计的知识对数据样本进行分类,其有着坚实的数学技术,在使用中误判率也较低。其特点是结合了先验概率和后验概率,这样不仅避免了只使用先验概率的主观偏见,同时也避免了单独使用后验概率产生的过拟合现象。贝叶斯分类算法在数据集较大的情况下表现出较高的准确率,同时算法本身也比较简单。
2.2 朴素贝叶斯算法
朴素贝叶斯算法(Naive Bayesian algorithm) 是应用最为广泛的分类算法之一。
朴素贝叶斯方法是在贝叶斯算法的基础上进行了相应的简化,即假定给定目标值时属性之间相互条件独立。也就是说没有哪个属性变量对于决策结果来说占有着较大的比重,也没有哪个属性变量对于决策结果占有着较小的比重。虽然这个简化方式在一定程度上降低了贝叶斯分类算法的分类效果,但是在实际的应用场景中,极大地简化了贝叶斯方法的复杂性。
2.3 贝叶斯定理
贝叶斯定理是由英国数学家贝叶斯 ( Thomas Bayes 1702-1761年) 发展,用来描述两个条件概率事件的关系。
比如 P(A|B) 和 P(B|A)。按照乘法法则,可以立刻导出:P(A∩B) = P(A)*P(B|A)=P(B)*P(A|B)。如上公式也可变形为:P(A|B)=P(B|A)*P(A)/P(B)。
贝叶斯法则
通常,事件A在事件B(发生)的条件下的概率,与事件B在事件A的条件下的概率是不一样的;然而,这两者是有确定的关系,贝叶斯法则就是这种关系的陈述。
作为一个规范的原理,贝叶斯法则对于所有概率的解释是有效的;然而,频率主义者和贝叶斯主义者对于在应用中概率如何被赋值有着不同的看法:频率主义者根据随机事件发生的频率,或者总体样本里面的个数来赋值概率;贝叶斯主义者要根据未知的命题来赋值概率。一个结果就是,贝叶斯主义者有更多的机会使用贝叶斯法则。
贝叶斯法则是关于随机事件A和B的条件概率和边缘概率的。
其中P(A|B)是在B发生的情况下A发生的可能性。为完备事件组,即
在贝叶斯法则中,每个名词都有约定俗成的名称:
Pr(A)是A的先验概率或边缘概率。之所以称为"先验"是因为它不考虑任何B方面的因素。
Pr(A|B)是已知B发生后A的条件概率,也由于得自B的取值而被称作A的后验概率。
Pr(B|A)是已知A发生后B的条件概率,也由于得自A的取值而被称作B的后验概率。
Pr(B)是B的先验概率或边缘概率,也作标准化常量(normalized constant)。
按这些术语,Bayes法则可表述为:
后验概率 = (似然度 * 先验概率)/标准化常量 也就是说,后验概率与先验概率和似然度的乘积成正比。
另外,比例Pr(B|A)/Pr(B)也有时被称作标准似然度(standardised likelihood),Bayes法则可表述为:
后验概率 = 标准似然度 * 先验概率。
以上引用自百度,如需深入理解可参考看概率论。
2.4 先验概率与后验概率
定义:
- 先验概率:在考虑任何新证据或数据之前,基于以往经验或知识对事件发生概率的一种主观估计或基于总体分布的理论概率。它反映了在没有特定信息的情况下,某个事件发生的可能性。
- 后验概率:后验概率是在考虑了新的证据或数据之后,对事件发生概率的重新评估。它是基于先验概率,并结合新的观测数据,根据贝叶斯定理计算得到的
为了更好的解释我们举个例子:
假设已知一种流感在人群中的发病率是3%,经过医学诊断检测得到的结果中:检测为阳性的准确率为90%,检测为阴性的准确率有95%
现在有过一个人检测为阳性,需要计算其为真阳性的概率。
在上面的描述中,流感在人群中的发病率就是先验概率,即通过经验等方式的主管估计或基于分布的理论概率。而后面的求解一个人在检测为阳性时,为真阳性的概率是后验概率,即在获得到新的数据或者证据之后对数据进行重新频率,讨论在条件A发生的情况下B发生的概率。
3. 计算
我们继续回到上述的例子中:
假设某疾病的先验概率为P(D)= 0.1(即疾病人人群中的发病率为10%),现在有一种检测方式,当检测为阳性,切真实患病的概率为P(+|D) = 0.95(真阳性的概率),检测为阴性性,并且患病的概率为:P(+|-D)=0.05(假阳性的概率)。
现在有个人检测结果为阳性,求其患病的概率:
P(D|+)
4. 代码实现
import numpy as np
class NaiveBayes:
def fit(self, X, y):
self.classes = np.unique(y)
self.num_classes = len(self.classes)
self.num_features = X.shape[1]
self.priors = np.zeros(self.num_classes)
self.likelihoods = np.zeros((self.num_classes, self.num_features))
n = len(X)
for i, c in enumerate(self.classes):
X_c = X[y == c]
self.priors[i] = len(X_c) / n
self.likelihoods[i] = (np.sum(X_c, axis=0) + 1) / (np.sum(X_c) + self.num_features)
def predict(self, X):
posteriors = np.zeros((len(X), self.num_classes))
for i, x in enumerate(X):
for j, c in enumerate(self.classes):
likelihood = self.likelihoods[j]
prior = self.priors[j]
posteriors[i][j] = np.log(prior) + np.sum(np.log(likelihood) * x)
return self.classes[np.argmax(posteriors, axis=1)]
调用
# 示例数据
X = np.array([[1, 1], [1, 0], [0, 1], [0, 0]])
y = np.array([1, 1, 0, 0])
nb = NaiveBayes()
nb.fit(X, y)
predictions = nb.predict(X)
print("预测结果:", predictions)