一、简介
多项式朴素贝叶斯(Multinomial Naive Bayes)是一种基于贝叶斯定理的分类算法。它假设每个特征的概率分布都是多项式分布,因此被称为多项式朴素贝叶斯。该算法具有简单、快速、准确等特点,常应用于文本分类、垃圾邮件过滤和情感分析等领域。
二、贝叶斯定理
首先让我们了解一下贝叶斯定理,它是概率论的重要理论基础之一。贝叶斯定理表明,当已知某个假设和一些证据时,可以利用贝叶斯定理计算该假设在给定证据的条件下的后验概率。其中,P(A|B) 表示在 B 发生的条件下 A 发生的概率,P(B|A) 表示在 A 发生的条件下 B 发生的概率,P(A) 和 P(B) 分别表示 A、B 发生的先验概率。
P(A|B) = P(B|A) * P(A) / P(B)
三、多项式朴素贝叶斯算法
在文本分类问题中,通常将文本表示成词袋模型,即将每个文本看作一个由词语构成的集合,忽略词语的顺序和语法。设一个文本包含 n 个词,表示为 w1, w2, ..., wn,其所属类别为 C。则由贝叶斯定理可以得到:
P(C|w1,w2,...,wn) = P(C) * P(w1,w2,...,wn|C) / P(w1,w2,...,wn)
其中,P(C) 为文本属于 C 类的先验概率,P(w1,w2,...,wn|C) 表示在 C 类下,文本所包含的词语的联合概率,可以近似地表示为每个词语在 C 类中出现的概率的乘积,即:
P(w1,w2,...,wn|C) ≈ P(w1|C) * P(w2|C) * ... * P(wn|C)
由此可得:
P(C|w1,w2,...,wn) ≈ P(C) * P(w1|C) * P(w2|C) * ... * P(wn|C) / P(w1,w2,...,wn)
为了简化计算,通常对分母 P(w1,w2,...,wn) 进行省略,因为它对所有类别的条件概率密度函数都是相同的。因此,最终可得:
P(C|w1,w2,...,wn) ≈ P(C) * Π P(wi|C)
四、拟合模型
对于拟合文本分类模型,需要进行以下步骤:
1. 准备数据集
首先,需要准备一个文本分类的数据集。可以从网上下载,例如以新闻内容为例的新闻数据集。
2. 构建词袋模型
对于文本中出现的每个词,统计它们出现的次数并进行编号。然后将每个文本表示成一个向量,长度为词典大小,其中每个元素表示对应词出现的次数。
import numpy as np from sklearn.feature_extraction.text import CountVectorizer text = ["This is a good product.", "This is a bad product."] vectorizer = CountVectorizer() X = vectorizer.fit_transform(text) print(vectorizer.get_feature_names(), X.toarray()) # Output: ['bad', 'good', 'is', 'product', 'this'] [[1 1 1 1 1] [1 0 1 1 1]]
3. 计算类别的先验概率
统计训练集中每个类别所占的比例。
y_train = np.array([0, 1]) # 0表示好评,1表示差评 prior = np.bincount(y_train) / len(y_train) print("prior probability:", prior) # Output: [0.5 0.5]
4. 计算每个类别下每个词出现的概率
统计训练集中每个类别下每个词出现的次数,然后计算每个词在每个类别下的概率。
X_train = X.toarray() cond_prob = np.zeros((2, X_train.shape[1])) # 2表示有两个类别,shape[1]表示词典大小 for i in range(2): cond_prob[i] = X_train[y_train==i].sum(axis=0) / X_train[y_train==i].sum() print("conditional probability:", cond_prob) # Output: [[0. 0.16666667 0.16666667 0.16666667 0.16666667 0.16666667 0.16666667] [0.14285714 0.14285714 0.14285714 0.14285714 0.21428571 0.14285714 0.07142857]]
5. 预测结果
对于一个新的文本,将它表示成一个向量,然后根据贝叶斯定理计算它属于每个类别的后验概率,最终选择后验概率最大的类别。
X_test = vectorizer.transform(["This is a very good product."]).toarray() posterior = np.zeros(2) for i in range(2): posterior[i] = prior[i] * np.prod(X_test ** cond_prob[i] * (1 - X_test) ** (1-cond_prob[i])) pred = np.argmax(posterior) print("predicted class:", pred) # Output: predicted class: 0 (即好评)
五、总结
多项式朴素贝叶斯算法是一种简单、快速、准确的分类算法,可应用于文本分类、垃圾邮件过滤和情感分析等领域。该算法的核心思想是基于贝叶斯定理和朴素贝叶斯假设,通过统计训练集中每个类别下每个词出现的概率来计算后验概率,从而实现分类。通过构建词袋模型、计算先验概率和条件概率,可以训练出一个文本分类模型。预测时,将测试集表示成一个向量,根据模型计算后验概率后选择后验概率最大的类别。如果是多分类问题,可以采用一对多的方法来处理。