AI 日报

数据挖掘领域十大经典算法之—朴素贝叶斯算法(附代码)

  • By admin
  • Oct 23, 2023 - 2 min read



朴素贝叶斯算法介绍

朴素贝叶斯算法(Naive Bayes)是一种常用的分类算法,属于概率统计算法的一类。它基于贝叶斯定理和特征之间条件独立的假设,通过计算样本的后验概率来进行分类。朴素贝叶斯算法简单高效,适用于处理大规模的文本分类、垃圾邮件过滤、情感分析等问题。

算法原理

朴素贝叶斯算法的核心思想是根据已知的训练数据集学习样本的概率分布,然后根据新的样本特征计算其属于各个类别的条件概率,最后选择具有最大条件概率的类别作为分类结果。

具体而言,朴素贝叶斯假设特征之间条件独立,即每个特征与其他特征之间互相独立。基于这个假设,可以将多个特征的联合概率转化为单个特征的条件概率的乘积。贝叶斯定理提供了基于训练集计算样本的后验概率的方法,其计算公式为:

算法实现

以下是朴素贝叶斯算法的Python实现代码:


```python
class NaiveBayes:
    def __init__(self):
        self.prior_prob = {}
        self.conditional_prob = {}
        
    def train(self, X, y):
        # 计算先验概率
        for label in set(y):
            self.prior_prob[label] = sum(1 for i in y if i == label) / len(y)
        
        # 计算条件概率
        for label in set(y):
            label_X = [X[i] for i in range(len(X)) if y[i] == label]
            for feature in range(len(label_X[0])):
                feature_values = set(x[feature] for x in label_X)
                for value in feature_values:
                    key = str(feature) + '|' + str(label) + '=' + str(value)
                    self.conditional_prob[key] = sum(1 for x in label_X if x[feature] == value) / len(label_X)
        
    def predict(self, X):
        y_pred = []
        for x in X:
            max_prob = -1
            pred_label = None
            for label in self.prior_prob.keys():
                prob = self.prior_prob[label]
                for feature in range(len(x)):
                    key = str(feature) + '|' + str(label) + '=' + str(x[feature])
                    if key in self.conditional_prob:
                        prob *= self.conditional_prob[key]
                if prob > max_prob:
                    max_prob = prob
                    pred_label = label
            y_pred.append(pred_label)
        return y_pred

# 使用示例
X = [[1, 'S'], [1, 'M'], [1, 'M'], [1, 'S'], [1, 'S'], [2, 'S'], [2, 'M'], [2, 'M'], [2, 'L'], [2, 'L'], [3, 'L'], [3, 'M'], [3, 'M'], [3, 'L'], [3, 'L']]
y = ['N', 'N', 'Y', 'Y', 'N', 'N', 'N', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'N']
model = NaiveBayes()
model.train(X, y)
X_test = [[2, 'S'], [1, 'M'], [3, 'L'], [1, 'S'], [3, 'L']]
y_pred = model.predict(X_test)
print(y_pred)
```

以上代码实现了朴素贝叶斯算法的训练和预测过程。训练函数train计算了先验概率和条件概率,预测函数predict通过计算后验概率选择最可能的类别标签。

通过上述代码,我们可以看到朴素贝叶斯算法的简洁且易于实现。然而,朴素贝叶斯算法的条件独立假设可能会导致一些信息的损失,因此在处理实际问题时需要根据实际情况选择合适的算法。