朴素贝叶斯分类器是一种基于贝叶斯定理的简单而高效的分类算法。由于其实现简单,计算复杂度低,并且在许多实际问题中表现良好,朴素贝叶斯分类器被广泛应用于文本分类、垃圾邮件过滤、情感分析等任务。

朴素贝叶斯分类器原理

朴素贝叶斯算法基于条件独立性假设,假设特征之间是独立的。在这个假设下,我们可以根据特征的条件概率和类的先验概率结合贝叶斯定理进行分类。

贝叶斯定理的公式为: [ P(C|X) = \frac{P(X|C)P(C)}{P(X)} ]

其中: - ( P(C|X) ) 是在给定特征 ( X ) 的情况下,类 ( C ) 的后验概率。 - ( P(X|C) ) 是在给定类 ( C ) 的情况下,特征 ( X ) 的似然概率。 - ( P(C) ) 是类 ( C ) 的先验概率。 - ( P(X) ) 是特征 ( X ) 的边际概率。

通常我们不需要计算 ( P(X) ) 因为它在不同类之间是相同的,我们可以直接计算后验概率 ( P(C|X) ) 与各个类的先验概率和似然概率的乘积。

实现步骤

  1. 数据准备:需要准备训练数据,以及每个类的先验概率。
  2. 计算条件概率:对每个特征在每个类中出现的频率进行计算,得到条件概率。
  3. 分类:对新的样本应用计算得到的概率,并选择最大概率对应的类。

Python 手写实现

下面是一个简单的朴素贝叶斯分类器的Python实现示例:

import numpy as np
from collections import defaultdict

class NaiveBayesClassifier:
    def __init__(self):
        self.class_prior = defaultdict(float)  # 先验概率
        self.word_prob = defaultdict(lambda: defaultdict(float))  # 条件概率
        self.vocab = set()  # 特征集合
        self.total_documents = 0  # 文档总数

    def fit(self, X, y):
        self.total_documents = len(X)
        class_counts = defaultdict(int)

        # 计算每个类的先验概率和出现的词汇
        for i in range(len(X)):
            class_counts[y[i]] += 1
            for word in X[i]:
                self.vocab.add(word)
                self.word_prob[y[i]][word] += 1

        # 计算先验概率
        for c in class_counts:
            self.class_prior[c] = class_counts[c] / self.total_documents

        # 计算条件概率
        for c in self.word_prob:
            total_words_in_class = sum(self.word_prob[c].values())
            for word in self.vocab:
                # 使用拉普拉斯平滑
                self.word_prob[c][word] = (self.word_prob[c][word] + 1) / (total_words_in_class + len(self.vocab))

    def predict(self, X):
        predictions = []

        for document in X:
            class_probabilities = {}
            for c in self.class_prior:
                # 计算每个类的后验概率
                class_probabilities[c] = np.log(self.class_prior[c])  # 先验概率的对数

                for word in document:
                    if word in self.vocab:
                        class_probabilities[c] += np.log(self.word_prob[c][word])  # 似然概率的对数

            # 找到具有最大概率的类
            predictions.append(max(class_probabilities, key=class_probabilities.get))

        return predictions

# 示例数据
X_train = [["我", "爱", "北京"], ["天气", "很好"], ["我", "喜欢", "蓝天"], ["北京", "的", "天气", "很好"]]
y_train = ["积极", "积极", "积极", "积极"]

X_test = [["我", "爱", "蓝天"], ["今天天气", "不错"]]

# 创建分类器
classifier = NaiveBayesClassifier()
classifier.fit(X_train, y_train)

# 进行预测
predictions = classifier.predict(X_test)
print(predictions)  # 输出: ['积极', '积极']

总结

朴素贝叶斯分类器由于其简单高效,尤其适合特征维度较高的场景,如文本分类。尽管其假设条件独立性在实际问题中往往不成立,但在许多情况下,它仍能取得良好的分类效果。希望以上的实现能帮助您更好地理解朴素贝叶斯分类器的原理及用法。

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部