📜  机器学习-朴素贝叶斯分类器(1)

📅  最后修改于: 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$的后验概率,找到最大后验概率所对应的类别即为预测结果。

实现

以文本分类为例,给出朴素贝叶斯分类器的实现步骤:

  1. 将文本表示成特征向量,一般是通过提取文本的词袋模型来得到。
  2. 计算训练集中每个类别出现的概率。
  3. 对于每个类别,计算在该类别中每个特征出现的概率。
  4. 对于一个新的文本,计算其属于不同类别的后验概率,并找到最大概率对应的类别作为预测结果。

下面是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方法用于预测新样本的类别。

总结

朴素贝叶斯分类器是一种简单而有效的分类方法,尤其在文本分类等领域有着广泛应用。但是它的假设条件较为强烈,可能会给结果带来一定的误差。因此,在实际应用中,需要根据具体任务和数据集选择合适的分类模型。