📅  最后修改于: 2023-12-03 15:40:19.791000             🧑  作者: Mango
朴素贝叶斯分类器是一种基于贝叶斯定理和特征条件独立假设的分类方法,它在实际应用中被广泛应用于文本分类、垃圾邮件过滤、情感分析、推荐系统等领域。
朴素贝叶斯分类器的原理是基于贝叶斯定理:
$$ P(y|x) = \frac{P(x|y)P(y)}{P(x)} $$
其中,$y$表示类别,$x$表示特征,$P(y)$表示先验概率,表示某个样本属于类别$y$的概率;$P(x|y)$表示条件概率,表示在类别$y$的条件下特征$x$发生的概率;$P(x)$表示证据因子,表示特征$x$发生的概率。
朴素贝叶斯分类器假设特征是相互独立的,即:
$$ P(x_1, x_2, ..., x_n|y) = P(x_1|y)P(x_2|y)...P(x_n|y) $$
于是:
$$ P(y|x) = \frac{P(x_1|y)P(x_2|y)...P(x_n|y)P(y)}{P(x)} $$
因为$P(x)$对于所有类别都是相同的,所以可以省略,得到:
$$ P(y|x) \propto P(x_1|y)P(x_2|y)...P(x_n|y)P(y) $$
于是,对于给定的样本$x$,计算其属于不同类别$y$的后验概率,找到最大后验概率所对应的类别即为预测结果。
以文本分类为例,给出朴素贝叶斯分类器的实现步骤:
下面是Python代码的实现:
import numpy as np
class NaiveBayes:
def __init__(self, alpha=1.0):
self.alpha = alpha
def fit(self, X, y):
n_examples, n_features = X.shape
self.classes = np.unique(y)
n_classes = len(self.classes)
# 计算每个类别出现的概率
self.priors = np.zeros(n_classes)
for i, c in enumerate(self.classes):
self.priors[i] = np.sum(y == c) / n_examples
# 计算在每个类别中每个特征出现的概率
self.posteriors = np.zeros((n_classes, n_features))
for i, c in enumerate(self.classes):
X_c = X[y == c]
self.posteriors[i] = (np.sum(X_c, axis=0) + self.alpha) / (np.sum(X_c) + n_features * self.alpha)
def predict(self, X):
likelihoods = np.zeros((X.shape[0], len(self.classes)))
for i, c in enumerate(self.classes):
likelihoods[:, i] = np.sum(np.log(self.posteriors[i] * X + (1 - X) * (1 - self.posteriors[i])), axis=1) + np.log(self.priors[i])
return self.classes[np.argmax(likelihoods, axis=1)]
其中,alpha
是拉普拉斯平滑的超参数,fit
方法用于训练模型,predict
方法用于预测新样本的类别。
朴素贝叶斯分类器是一种简单而有效的分类方法,尤其在文本分类等领域有着广泛应用。但是它的假设条件较为强烈,可能会给结果带来一定的误差。因此,在实际应用中,需要根据具体任务和数据集选择合适的分类模型。