您的位置:

多项式朴素贝叶斯

一、简介

多项式朴素贝叶斯(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 (即好评)

五、总结

多项式朴素贝叶斯算法是一种简单、快速、准确的分类算法,可应用于文本分类、垃圾邮件过滤和情感分析等领域。该算法的核心思想是基于贝叶斯定理和朴素贝叶斯假设,通过统计训练集中每个类别下每个词出现的概率来计算后验概率,从而实现分类。通过构建词袋模型、计算先验概率和条件概率,可以训练出一个文本分类模型。预测时,将测试集表示成一个向量,根据模型计算后验概率后选择后验概率最大的类别。如果是多分类问题,可以采用一对多的方法来处理。