朴素贝叶斯算法:

一、概率:

我们往往将一件事情发生的可能性称之为概率,例如我们在初中所学习的:仍一枚筛子,一点的可能性称之为概率。
联合概率:
有多个条件同时成立的概率事件为联合概率:
P(A,B)=P(A)*P(B)
条件概率:
如果两个事件成立的概率相互独立,在一个事件成立的前提下,另一个事件成立的概率称为条件概率:
P(A|B)
P(A1,A2|B) = P(A1|B)*P(A2|B)

二、朴素贝叶斯公式——贝叶斯公式

copula联合概率python_python


朴素贝叶斯算法在文档分类算法中比较常用,针对文档分类的参数对上式进行解释。C为文档的类别,W为文档的特征(词频等特征)。故上式可以变换为以下公式:

copula联合概率python_算法_02


C为文档的类别,F1,F2…为文档的特征值。

算法计算流程如下:
(1)、P(C)为某一个文档分类的概率,例如是科技文的概率:
P(C)= 文档类别的数量/总文档的数量

(2)、P(W|C)=为预测文章中特征出现的概率:
P(W|C) = P(F1|C)= Nn/N
Nn为某一词在该文章中出现的 次数
N为该文章中所有的数量总和
(3)、 P(F1,F2,…)为:该文档中每个词出现的概率

三、拉普拉斯平滑系数

通过贝叶斯函数我们可知,当某一词在文章中出现的次数为零时,通过贝叶斯公式计算该文章所属的这一类别的概率即为零。但是这篇文章中仍然出现一些与此类别相关的词,故我们需要引入拉普拉斯平滑系数:
P(F1|C) = (Nn+α)/(N+αm)
α为指定的系数,这里我们一般定为1,m为文档中特征词的个数。Nn与N与上式含义一致。

四、代码样例:

from sklearn.datasets import fetch_20newsgroups
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB


def beyas():
    """
    朴素贝叶斯实现文档分类
    :return: None
    """

    # 导入新闻文章数据
    news = fetch_20newsgroups(subset="all")

    # 对数据进行分割
    x_train, x_test, y_train, y_test = train_test_split(news.data, news.target, test_size=0.25)

    # 对文章的特征词进行特征抽取
    tfidf = TfidfVectorizer()
    x_train = tfidf.fit_transform(x_train)
    x_test = tfidf.transform(x_test)

    # 运用朴素贝叶斯进行分类
    nb = MultinomialNB(alpha=1)
    nb.fit(x_train, y_train)
    y_predict = nb.predict(x_test)
    print("预测结果为", y_predict)
    y_score = nb.score(x_test,y_test)
    print("准确率为:", y_score)


if __name__ == "__main__":
    beyas()

优缺点:

优点:
算法原理通俗易懂,一般常用于文本分类问题,同时对数据集的缺失值的影响不大,算法计算过程较快,相对的准确度较高
缺点:
对于数据集相关中如果有多篇文章相互关联,则对结果会有一定影响。