精华内容
下载资源
问答
  • 2021-07-15 15:57:42

    贝叶斯分类是机器学习中应用极为广泛的分类算法之一,其产生自英国数学家贝叶斯对于逆概问题的思考。朴素贝叶斯是贝叶斯模型当中最简单的一种,其算法核心为如下所示的贝叶斯公式。

     方便记忆的转换形式: pAB/pBA=pA/pB

    其中P(A)为事件A发生的概率,P(B)为事件B发生的概率,P(A|B)表示在事件B发生的条件下事件A发生的概率,同理P(B|A)则表示在事件A发生的条件下事件B发生的概率。

    '''朴素贝叶斯模型的简单代码实现  '''

    from sklearn.naive_bayes import GaussianNB
    x=[[1,2],[3,4],[5,6],[7,8],[9,10]]
    '''第2行代码中的X是特征变量,共有2个特征;第3行代码中的y是目标变量,共有2个类别——0和1 '''
    y=[0,0,0,1,1]
    bys_m=GaussianNB()
    bys_m.fit(x,y)
    print(bys_m.predict([[5,5]]))

    ''' 朴素贝叶斯模型案例实战----肿瘤预测模型  '''

    '''

    更多相关内容
  • 伯克利人工智能先导课cs188作业,朴素贝叶斯模型和KNN算法实现手写数字识别,准确率都达到很高水平,有说明文件,有训练结果绘图,适合新手入门
  • 人工智能选股之朴素贝叶斯模型主要讲解概率模型的股票交易市场中的应用,值得学习与借鉴
  • 从读取文件、去除重用词、正则化、到词向量、再到预测分类。最后ROC曲线评估,一整套(带数据集),下载即运行。如果好用,还请给个好评
  • 朴素贝叶斯模型及案例(Python)

    千次阅读 2022-04-15 14:13:49
    朴素贝叶斯贝叶斯模型当中最简单的一种,其算法核心为如下所示的贝叶斯公式。 其中P(A)为事件A发生的概率,P(B)为事件B发生的概率,P(A|B)表示在事件B发生的条件下事件A发生的概率,同理P(B|A)则表示...

    目录

    1 朴素贝叶斯的算法原理

    2 一维特征变量下的贝叶斯模型

    3 二维特征变量下的贝叶斯模型

    4 n维特征变量下的贝叶斯模型

    5 朴素贝叶斯模型的sklearn实现

    6 案例:肿瘤预测模型

    6.1 读取数据与划分

    6.1.1 读取数据

    6.1.2 划分特征变量和目标变量

    6.2 模型的搭建与使用

    6.2.1 划分训练集和测试集

    6.2.2 模型搭建

    6.2.3 模型预测与评估

    参考书籍


    1 朴素贝叶斯的算法原理

    贝叶斯分类是机器学习中应用极为广泛的分类算法之一。

    朴素贝叶斯是贝叶斯模型当中最简单的一种,其算法核心为如下所示的贝叶斯公式。

    其中P(A)为事件A发生的概率,P(B)为事件B发生的概率,P(A|B)表示在事件B发生的条件下事件A发生的概率,同理P(B|A)则表示在事件A发生的条件下事件B发生的概率。

    举一个简单的例子:已知冬季一个人感冒(事件A)的概率P(A)为40%,一个人打喷嚏(事件B)的概率P(B)为80%,一个人感冒时打喷嚏的概率P(B|A)为100%,那么如果一个人开始打喷嚏,他感冒的概率P(A|B)为多少?求解过程如下。

    2 一维特征变量下的贝叶斯模型

    以一个详细的例子来说:如何判断一个人是否感冒。假设已经有5组样本数据,见下表。

    只选取了一个特征变量“打喷嚏(X1)”,其值为1表示打喷嚏,为0表示不打喷嚏;目标变量是“感冒(Y)”,其值为1表示感冒,为0表示未感冒。

    现在要根据上述数据,利用贝叶斯公式预测一个人是否感冒。

    例如,一个人打喷嚏了(X1=1),那么他是否感冒了呢?这个问题实际上是要预测他感冒的概率P(Y|X1)。将特征变量和目标变量代入贝叶斯公式,可获得如下所示的计算公式。

    根据上述数据,可以计算在打喷嚏(X1=1)的条件下,感冒(Y=1)的概率,计算过程如下。

    其中P(X1=1|Y=1)为在感冒的条件下打喷嚏的概率,这里感冒的4个样本中有3个样本打喷嚏,所以该概率为3/4;P(Y=1)为所有样本中感冒的概率,这里5个样本中有4个样本感冒,所以该概率为4/5;P(X1=1)为所有样本中打喷嚏的概率,这里5个样本中有4个样本打喷嚏,所以该概率为4/5。

    同理,在打喷嚏(X1=1)的条件下,未感冒(Y=0)的概率的计算过程如下。

    其中P(X1=1|Y=0)为在未感冒的条件下打喷嚏的概率,为1;P(Y=0)为所有样本中未感冒的概率,为1/5;P(X1=1)为所有样本中打喷嚏的概率,为4/5。

    因为3/4大于1/4,所以在打喷嚏的条件下感冒的概率要高于未感冒的概率。

    3 二维特征变量下的贝叶斯模型

    在上边的一个特征变量的基础上加入另一个特征变量——头痛(X2),其值为1表示头痛,为0表示不头痛;目标变量仍为感冒(Y)。样本数据见下表。

    根据上述数据,仍利用贝叶斯公式来预测一个人是否感冒。例如,一个人打喷嚏且头痛(X1=1,X2=1),那么他是否感冒了呢?这个问题实际上是要预测他感冒的概率P(Y|X1,X2)。将特征变量和目标变量代入贝叶斯公式,可获得如下所示的计算公式。

    现在要计算并比较P(Y=1|X1,X2)与P(Y=0|X1,X2)的大小,由上述公式可知,两者的分母P(X1,X2)是相同的,所以直接计算并比较两者的分子P(X1,X2|Y)P(Y)的大小即可。

    在计算之前,需要先引入朴素贝叶斯模型的独立性假设朴素贝叶斯模型中的各个特征之间相互独立,即P(X1,X2|Y)=P(X1|Y)P(X2|Y)。因此,分子的计算公式可以转换为如下形式。

    在独立性假设的前提下,计算打喷嚏且头痛(X1=1,X2=1)的条件下感冒(Y=1)的概率P(Y=1|X1=1,X2=1),就转化为计算P(X1=1|Y=1)P(X2=1|Y=1)P(Y=1)的值,计算过程如下。

    同理,计算打喷嚏且头痛(X1=1,X2=1)的条件下未感冒(Y=0)的概率P(Y=0|X1=1,X2=1),即转化为计算P(X1=1|Y=0)P(X2=1|Y=0)P(Y=0)的值,计算过程如下。

    因为9/20大于1/5,所以在打喷嚏且头痛的条件下感冒的概率要高于未感冒的概率。

    4 n维特征变量下的贝叶斯模型

    在2个特征变量的基础上将贝叶斯公式推广至n个特征变量X1,X2,…,Xn,公式如下。

    朴素贝叶斯模型假设给定目标值后各个特征之间相互独立,分子的计算公式可以写成如下形式。

    其中P(X1|Y)、P(X2|Y)、P(Y)等数据都是已知的,由此可以计算在n个特征变量取不同的值的条件下,目标变量取某个值的概率,并且选择概率更高者对样本进行分类。

    5 朴素贝叶斯模型的sklearn实现

    # 这里用的是高斯贝叶斯模型
    from sklearn.naive_bayes import GaussianNB
    
    X = [[1,2],[3,4],[5,6],[7,8],[9,10]]
    y = [0,0,0,1,1]
    
    model = GaussianNB()
    model.fit(X,y)
    
    model.predict([[5,5]])
    
    # 输出结果
    # array([0])

    6 案例:肿瘤预测模型

    以一个医疗行业较为经典的肿瘤预测模型为例,讲解如何在实战中应用朴素贝叶斯模型来预测肿瘤为良性肿瘤还是恶性肿瘤。

    肿瘤性质的判断影响着患者的治疗方式和痊愈速度。传统的做法是医生根据数十个指标来判断肿瘤的性质,预测效果依赖于医生的个人经验而且效率较低,而通过机器学习,我们有望能快速预测肿瘤的性质。

    6.1 读取数据与划分

    6.1.1 读取数据

    首先通过如下代码导入某医院乳腺肿瘤患者的6个特征维度及肿瘤性质的数据。共569个患者,其中良性肿瘤358例、恶性肿瘤211例。

    其中6个特征变量分别为“最大周长”“最大凹陷度”“平均凹陷度”“最大面积”“最大半径”“平均灰度值”。

    目标变量为“肿瘤性质”,0代表肿瘤为恶性,1代表肿瘤为良性。

    6.1.2 划分特征变量和目标变量

    6.2 模型的搭建与使用

    6.2.1 划分训练集和测试集

    6.2.2 模型搭建

    6.2.3 模型预测与评估

    使用训练集拟合的模型对测试集进行预测。

    利用创建DataFrame的相关知识点,汇总预测结果y_pred和测试集中的实际值y_test,代码如下。

    注意:y_pred为一维数组,y_test为Series对象,需要统一类型

    可以看到,前5项的预测准确度为80%。

    通过如下代码可以查看所有测试集数据的预测准确度。

    朴素贝叶斯模型属于分类模型,所以也可以利用ROC曲线来评估其预测效果。

    from sklearn.metrics import roc_curve
    fpr,tpr,thres = roc_curve(y_test,y_pred_proba[:,1])
    
    import matplotlib.pyplot as plt
    plt.rcParams['font.sans-serif'] = ['SimHei']  #设置正常显示中文
    plt.plot(fpr,tpr)
    plt.xlabel('假警报率')
    plt.ylabel('命中率')
    plt.title('ROC曲线')
    plt.show()

    总结来说,朴素贝叶斯模型是一种非常经典的机器学习模型,它主要基于贝叶斯公式,在应用过程中会把数据集中的特征看成是相互独立的,而不需考虑特征间的关联关系,因此运算速度较快。相比于其他经典的机器学习模型,朴素贝叶斯模型的泛化能力稍弱,不过当样本及特征的数量增加时,其预测效果也是不错的。

    参考书籍

    《Python大数据分析与机器学习商业案例实战》

    展开全文
  • 用于分析用户转推情感倾向的多层朴素贝叶斯模型
  • 1.掌握常见机器学习分类模型思想、算法,包括Fisher线性判别、KNN、朴素贝叶斯、Logistic回归、决策树等; 2.掌握Python编程实现分类问题,模型评价指标、计时功能、保存模型。 【实验要求】 理解Python在分类...

    【实验目的】

    1.掌握常见机器学习分类模型思想、算法,包括Fisher线性判别、KNN、朴素贝叶斯、Logistic回归、决策树等;
    2.掌握Python编程实现分类问题,模型评价指标、计时功能、保存模型。

    【实验要求】

    1. 理解Python在分类问题中的评价指标等细节操作;
    2. 掌握本章讲授的分类问题的Python编程操作。

    【实验过程】(必要的实验步骤、绘图、代码注释、数据分析)

    实验步骤
    1、读入数据
    2、数据预处理
    3、数据分析方法介绍
    4、编程实现数据分析方法,含代码注释
    5、重要结果的图表绘制
    6、必要的结果解释

    【实验题目】

    利用朴素贝叶斯模型分类器计算下面的问题,要求报告模型评价指标、计时功能、保存模型。
    为了防止出现假冒伪劣、逃避关税情况,某海关单位已有以往化验检测2个原产地的葡萄酒样品124个,现有6个未知类别样本葡萄酒需要确定来源地,如何制定检验策略对6个未知样本原产地进行甄别?利用所学分类算法探讨此问题,要求进行模型评价、增加计时功能、保存模型。数据见 data_wine_new.csv.
    在这里插入图片描述

    0 1 分别对应1 2原产地

    朴素贝叶斯模型

    代码

    # -*- coding: utf-8 -*-
    '''step1 调用包'''
    import time
    starttime = time.time()
    import pandas as pd
    import numpy as np
    from sklearn.model_selection import train_test_split
    #朴素贝叶斯
    from sklearn.naive_bayes import GaussianNB  
    
    #调用准确率计算函数
    from sklearn import metrics
    from sklearn.metrics import accuracy_score  
    
    from sklearn.metrics import confusion_matrix,classification_report
    
    '''step2 导入数据'''
    data = pd.read_csv('data_wine_new.csv')
    
    '''step3 数据预处理'''
    # 把带类标号数据(用于训练和检验)
    # 和待判(最后3行)数据分开
    data_used = data.iloc[:124,:] 
    #Python从0开始计数,故上一行代码从第0行取到第114行
    #共提取了115行。
    
    data_unused = data.iloc[124:,:]
    
    
    '''step4 划分数据集'''
    #(将带类标号数据
    #划分为训练集(75%)
    #和检验集(25%)
    
    #将类别列和特征列拆分,
    #便于下面调用划分函数
    y_data=data_used.iloc[:,0]
    x_data=data_used.iloc[:,1:]
    
    #调用sklearn中的函数划分上述数据
    x_train, x_test, y_train, y_test = train_test_split(
            x_data,y_data,test_size=0.25,random_state=0)
    
    '''step5 模型计算(训练、检验、评价)'''
    #step5.1 训练模型
    model_NGB = GaussianNB()
    model_NGB.fit(x_train, y_train)
    
    #step5.2 检验模型
    y_pred = model_NGB.predict(x_test)
    
    #step5.3 模型评价(准确率)
    #这里y_test为真实检验集类标号
    #pred_test为模型预测的检验集类标号
    #比较二者即可得到准确率
    acc_test = accuracy_score(y_test,y_pred)
    print('检验准确率为:',acc_test)
    
    '''模型评价  升级版'''
    accuracy_score = accuracy_score(y_test,y_pred)
    confusion_matrix = confusion_matrix(y_test,y_pred,labels=[0,1])
    classification_report = classification_report(y_test,y_pred,labels=[0,1], target_names=["1号原产地","2号原产地"])
    classification_report_split=classification_report.split ()   #提取矩阵中的值
    #        auc = auc(best_estimator, X_train, X_test) 
    
    ##计算AUC     
    #        from sklearn import metrics
    from itertools import cycle
    colors = cycle('gmcr')
    if hasattr(model_NGB, 'predict_proba'):
        y_score = model_NGB.predict_proba(x_test)
        y_score=y_score[:,1]
    else:
        y_score = model_NGB.decision_function(x_test)
    fpr, tpr, thresholds = metrics.roc_curve(y_test, y_score)
    auc = metrics.auc(fpr, tpr)
    #        print('\n AUC is:',auc)
    
    endtime = time.time()
    testtime = endtime-starttime
    
    print('\n confusion_matrix = \n',confusion_matrix)
    print('\n classification_report =\n', classification_report)
    print('\n accuracy_score= ',accuracy_score)
    print('\n precison= ',metrics.precision_score(y_test, y_pred))
    print('\n recall= ',metrics.recall_score(y_test, y_pred))
    print('\n f1_Score= ',metrics.f1_score(y_test, y_pred))
    #        print('\n auc of train/test =', auc )
    print('\n AUC is:',auc)
    print("\n Time consuming is",np.round(testtime,3))
    
    '''step6 模型存储'''
    import joblib      
    joblib.dump(model_NGB,'model_NGB.m')   #保存模型
    '''step7 预测结果'''
    #模型训练完,检验效果满意
    #未知类别进行预测(分类)
    x_unused = data_unused.iloc[:,1:]
    pred_unused = model_NGB.predict(x_unused)
    print('待判样本预测类别为:',pred_unused)
    

    结果

    检验准确率为: 0.967741935483871

    confusion_matrix =
    [[15 1]
    [ 0 15]]

    classification_report =precisionrecallf1-scoresupport
    1号原产地1.000.940.9716
    2号原产地0.941.000.9715
    accuracy0.9731
    macro avg0.970.970.9731
    weighted avg0.970.970.9731

    accuracy_score= 0.967741935483871

    precison= 0.9375

    recall= 1.0

    f1_Score= 0.967741935483871

    AUC is: 1.0

    Time consuming is 0.017
    待判样本预测类别为: [1. 1. 1. 0. 0. 0.]

    展开全文
  • 本资源主要是实现了一个处理连续属性的朴素贝叶斯模型并在UCA上的葡萄酒数据集上进行了测评,另外源码中还包含了与数据集预处理、sklearn中的朴素贝叶斯的对比以及降维可视化等操作且注释详细,是一份完整的机器学习...
  • 朴素贝叶斯模型简单理解

    千次阅读 2020-10-25 20:16:31
    朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法。对于给定的训练数据集,首先基于特征条件独立假设学习输入\输出的联合概率分布;然后基于此模型,对给定的输入x,利用贝叶斯定理求出后验概率最大的输出...

    小白一个,如果有问题欢迎大家指正。

     

     

    朴素贝叶斯法

    朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法。对于给定的训练数据集,首先基于特征条件独立假设学习输入\输出的联合概率分布;然后基于此模型,对给定的输入x,利用贝叶斯定理求出后验概率最大的输出y。这里可以举个例子,就好比医生在帮病人看病的时候,病人手里的化验单以及各种检测证明(假设证明之间相互独立),就是特征条件,医生就好比是一个分类器,输入了一堆特征条件x,然后进行判断病人具体得的是什么病也就是P(y|x)概率最大的那个,并且这个医生诊断的准确率,与他当初受到的教育方式(构造方法)、病人的症状是否突出(待分类数据的特性)以及医生的经验多少(训练样本数量)都有密切关系。这个过程就是分类的过程。

    这里先给出几个概率的公式,让大家回忆一下,后续会用到。

    条件概率:       P(A|B) = \frac {P(AB)}{P(B)}                    P(B)为先验概率,P(A|B)为后验概率,P(AB)为联合概率

    全概率:         P(A) = \sum _{i}P(A|B_{i})P(B_{i})

    贝叶斯公式: P(B_{i}|A) = \frac {P(A|B_{i})P(B_{i})}{\sum_{j}P(A|B_{j})P(B_{j})}

    这里给一道贝叶斯公式的例题

    Q:8支步枪中有5支已校准过,3支未校准。一个射手用校准过的枪射击,中靶概率为0.8,用未校准过的枪射击,中靶概率为0.3,现从8支枪中随机取一支射击,结果中靶。求该枪是已校准过的概率。

    A:                                             P(G=1)=\frac {5}{8}             P(G=0)=\frac {3}{8}

                                                       P(A=1|G=1)=0.8        P(A=1|G=0)=0.3

                                                       P(G=1|A=1)=\frac {P(A=1|G=1)P(G=1)}{\sum_{i \in G}P(A=1|G=i)P(G=i)}=0.8163

     

     

    OK,那么现在开始朴素贝叶斯的学习。首先要给出两个朴素贝叶斯的假设。

    1、一个特征的出现的概率,与其他特征(条件)独立,其实也就是说对于给定分类的条件下,特征独立。

    2、每一个特征同等重要(特征均衡性)

     

    那么在这个假设的情况下,我们回过头来去看看贝叶斯公式,将会有新的发现(我感觉信息量巨大的发现。。。)

    贝叶斯公式带来的一些思考 P(A|D)=\frac {P(D|A)P(A)}{P(D)}

    在给定某些样本D的时候,在这些样本中计算某些结论A_{1},A_{2},....,A_{n}出现的概率,即P(A_{i}|D)

                  maxP(A_{i}|D)=max \frac {P(D|A_{i})P(A_{i})}{P(D)}=max(P(D|A_{i})P(A_{i}))\rightarrow maxP(D|A_{i})

                                                 \Rightarrow maxP(A_{i}|D) \rightarrow maxP(D|A_{i})

    第一个等式:贝叶斯公式

    第二个等式:样本给定的情况下,则对于任何的Ai,P(D)是常数,仅仅只是一个归一化因子,所以可以去掉。

    第三个箭头:若这些结论A_{1},A_{2},...,A_{n}的先验概率相等或者相近似,则得到最后一个等式。也就是可以理解为Ai的分布是均匀分布,这估计也是朴素贝叶斯的第二个假设的原因。

    总结:在已知样本D的时候,我们想要知道最有可能是哪一个结论到时候(也就是输入一个x,我们想要知道它的分类),我们通常不是计算P(A_{i}|D),而是去计算P(D|A_{i})。后面的那个概率其实就是极大似然估计了,因为我们之前LR模型或者线性回归里面,我们去估计参数的时候,都是假定参数是同等重要的,然后在此前提下去找到Ai使得分割面或者分割线,使得数据得到最大。所以,极大似然估计里面先验的假定了Ai是相同的。

    这里换一种简单的方式说明逻辑回归和朴素贝叶斯之间的关系。

    假设是一个二分类问题,并且存在三个特征X1,X2,X3。

    那么

                                                     P(Y=1|X_{1},X_{2},X_{3})=\frac {P(X_{1},X_{2},X_{3}|Y=1)P(Y=1)}{P(X_{1},X_{2},X_{3})}

                                                      P(Y=0|X_{1},X_{2},X_{3})=\frac {P(X_{1},X_{2},X_{3}|Y=0)P(Y=0)}{P(X_{1},X_{2},X_{3})}

    所以分类的最终目的就在于,\frac {P(Y=1|X_{1},X_{2},X_{3})}{P(Y=0|X_{1},X_{2},X_{3})} >1,便可以说明Y=1的概率比Y=0的概率更大。所以两个概率相除,得到

                                                                        \frac {P(X_{1},X_{2},X_{3}|Y=1)P(Y=1)}{P(X_{1},X_{2},X_{3}|Y=0)P(Y=0)}

    但是,由于概率值域是[0,1],相乘和相除容易产生过小的数值,导致编程下溢问题,所以两边取对数得到

                                             log \frac {P(Y=1|X_{1},X_{2},X_{3})}{P(Y=0|X_{1},X_{2},X_{3})}=log \frac {P(X_{1},X_{2},X_{3}|Y=1)}{P(X_{1},X_{2},X_{3}|Y=0)}+log\frac{P(Y=1)}{P(Y=0)}

    对于朴素贝叶斯而言,由于之前提过的,朴素贝叶斯当中有个强假设,就是条件独立假设,每个条件之间没有耦合,相互独立。所以对数可以进一步拆分成

                     log \frac {P(Y=1|X_{1},X_{2},X_{3})}{P(Y=0|X_{1},X_{2},X_{3})}=log \frac {P(X_{1}|Y=1)}{P(X_{1}|Y=0)}+log\frac{P(Y=1)}{P(Y=0)}+log \frac {P(X_{2}|Y=1)}{P(X_{2}|Y=0)}+log\frac{P(Y=1)}{P(Y=0)}+log \frac {P(X_{3}|Y=1)}{P(X_{3}|Y=0)}+log\frac{P(Y=1)}{P(Y=0)}

    对于逻辑回归而言,是用线性模型的预测结果取逼近这个后验概率的比值,也就是

                                           log \frac {P(Y=1|X_{1},X_{2},X_{3})}{P(Y=0|X_{1},X_{2},X_{3})}=w_{1}\cdot x_1 + w_2 \cdot x_2 + ...+ b

    此时,我们就可以发现两者的表达式是多么的相似。但是二者的区别就是在于,用了两种不同的方法求出来权重是不一样的。产生差别的原因就是在于之前朴素贝叶斯之中有一个强假设(条件独立性假设),因为这个强假设所以朴素贝叶斯不需要梯度下降直接通过统计每个特征的后验概率来当做权重,而逻辑回归,条件独立假设不成立,所以通过梯度下降法,可以得到特征之间的耦合信息,从而得到相应的权重。

     

     

    铺垫了这么多,现在开始通过一个文本分类的例子,了解朴素贝叶斯。

    样本有10000封邮件,每个邮件被标记为垃圾邮件或者非垃圾邮件,目标是确定未知的邮件是垃圾邮件还是非垃圾邮件。

    首先,这是一个二分类问题,假设类别c:垃圾邮件c1,非垃圾邮件c2。之后我们需要进行统计里面的单词,且每个单词出现了几次,相当于是建立一个词汇表。建立词汇表有两种方法。

    1、可以使用现成的单词词典,可以包含大量的单词;

    2、可以将所有邮件中出现的单词全部统计出来,得到词典。

    我们记录单词的数目为N。那么就可以将每个邮件m映射成一个维度为N的向量x。若单词w_i在邮件m中出现过,则x_i=1,否则,x_i=0。即邮件可以全部向量化。m\rightarrow (x_1,x_2,...,x_N)(也可以记录频数)。

    然后根据贝叶斯公式:P(c|x)=\frac {P(x|c)*P(c)}{P(x)}

    注意这里x是向量。由于我们之前进行强假设,特征之间是相互独立的,所以,P(x|c)可以进行拆分。

                                                                 P(x|c)=P(x_1,x_2,...,x_N|c)=P(x_1|c)*P(x_2|c)...P(x_N|c)

    带回之前的公式就可以求出P(c|x),包含x特征的邮件是属于哪一类邮件。顺便提一句,公式右边都是可以通过统计求出具体的值,因为根据大数定理,当样本足够大的时候,我们可以认为统计的比例近似于概率。

    在这里写下右边各项的含义。

    P(x_i|c_j): 在c_j(此题目,c_j要么是垃圾邮件,要么是非垃圾邮件)的前提下,第i个单词x_i出现的概率(频率)。

    P(x_i):在所有样本中,单词x_i出现的概率(频率)。

    P(c_j):在所有样本中,邮件类别c_j出现的概率(频率)。

    所以,举个例子,比如“我司可办理正规发票(保真)17%增值税发票点数优惠!”这一句话,我们需要判断出现这句话的邮件,是不是垃圾邮件,就是要看在垃圾邮件中,出现这些词的次数,然后根据大数定理,我们假定频率就代表着概率,就比如P(“发票”|c=c1(垃圾邮件))=(垃圾邮件中所有"发票"的次数)/(垃圾邮件中所有词的次数)。由于并行的计算,所以我们工业界进行词汇统计是很快的。

     

    这里给个代码(不是分类垃圾邮件的,是Mnist数字识别的,超级无敌的详细,每行基本上都有注释,感谢大佬写的代码,链接我放在了后面)

    # coding=utf-8
    # Author:Dodo
    # Date:2018-11-17
    # Email:lvtengchao@pku.edu.cn
    
    '''
    数据集:Mnist
    训练集数量:60000
    测试集数量:10000
    ------------------------------
    运行结果:
        正确率:84.3%
        运行时长:103s
    '''
    
    import numpy as np
    import time
    
    def loadData(fileName):
        '''
        加载文件
        :param fileName:要加载的文件路径
        :return: 数据集和标签集
        '''
        #存放数据及标记
        dataArr = []; labelArr = []
        #读取文件
        fr = open(fileName)
        #遍历文件中的每一行
        for line in fr.readlines():
            #获取当前行,并按“,”切割成字段放入列表中
            #strip:去掉每行字符串首尾指定的字符(默认空格或换行符)
            #split:按照指定的字符将字符串切割成每个字段,返回列表形式
            curLine = line.strip().split(',')
            #将每行中除标记外的数据放入数据集中(curLine[0]为标记信息)
            #在放入的同时将原先字符串形式的数据转换为整型
            #此外将数据进行了二值化处理,大于128的转换成1,小于的转换成0,方便后续计算
            dataArr.append([int(int(num) > 128) for num in curLine[1:]])
            #将标记信息放入标记集中
            #放入的同时将标记转换为整型
            labelArr.append(int(curLine[0]))
        #返回数据集和标记
        return dataArr, labelArr
    
    def NaiveBayes(Py, Px_y, x):
        '''
        通过朴素贝叶斯进行概率估计
        :param Py: 先验概率分布
        :param Px_y: 条件概率分布
        :param x: 要估计的样本x
        :return: 返回所有label的估计概率
        '''
        #设置特征数目
        featrueNum = 784
        #设置类别数目
        classNum = 10
        #建立存放所有标记的估计概率数组
        P = [0] * classNum
        #对于每一个类别,单独估计其概率
        for i in range(classNum):
            #初始化sum为0,sum为求和项。
            #在训练过程中对概率进行了log处理,所以这里原先应当是连乘所有概率,最后比较哪个概率最大
            #但是当使用log处理时,连乘变成了累加,所以使用sum
            sum = 0
            #获取每一个条件概率值,进行累加
            for j in range(featrueNum):
                sum += Px_y[i][j][x[j]]
            #最后再和先验概率相加(也就是式4.7中的先验概率乘以后头那些东西,乘法因为log全变成了加法)
            P[i] = sum + Py[i]
    
        #max(P):找到概率最大值
        #P.index(max(P)):找到该概率最大值对应的所有(索引值和标签值相等)
        return P.index(max(P))
    
    
    def model_test(Py, Px_y, testDataArr, testLabelArr):
        '''
        对测试集进行测试
        :param Py: 先验概率分布
        :param Px_y: 条件概率分布
        :param testDataArr: 测试集数据
        :param testLabelArr: 测试集标记
        :return: 准确率
        '''
        #错误值计数
        errorCnt = 0
        #循环遍历测试集中的每一个样本
        for i in range(len(testDataArr)):
            #获取预测值
            presict = NaiveBayes(Py, Px_y, testDataArr[i])
            #与答案进行比较
            if presict != testLabelArr[i]:
                #若错误  错误值计数加1
                errorCnt += 1
        #返回准确率
        return 1 - (errorCnt / len(testDataArr))
    
    
    def getAllProbability(trainDataArr, trainLabelArr):
        '''
        通过训练集计算先验概率分布和条件概率分布
        :param trainDataArr: 训练数据集
        :param trainLabelArr: 训练标记集
        :return: 先验概率分布和条件概率分布
        '''
        #设置样本特诊数目,数据集中手写图片为28*28,转换为向量是784维。
        # (我们的数据集已经从图像转换成784维的形式了,CSV格式内就是)
        featureNum = 784
        #设置类别数目,0-9共十个类别
        classNum = 10
    
        #初始化先验概率分布存放数组,后续计算得到的P(Y = 0)放在Py[0]中,以此类推
        #数据长度为10行1列
        Py = np.zeros((classNum, 1))
        #对每个类别进行一次循环,分别计算它们的先验概率分布
        #计算公式为书中"4.2节 朴素贝叶斯法的参数估计 公式4.8"
        for i in range(classNum):
            #下方式子拆开分析
            #np.mat(trainLabelArr) == i:将标签转换为矩阵形式,里面的每一位与i比较,若相等,该位变为Ture,反之False
            #np.sum(np.mat(trainLabelArr) == i):计算上一步得到的矩阵中Ture的个数,进行求和(直观上就是找所有label中有多少个
            #为i的标记,求得4.8式P(Y = Ck)中的分子)
            #np.sum(np.mat(trainLabelArr) == i)) + 1:参考“4.2.3节 贝叶斯估计”,例如若数据集总不存在y=1的标记,也就是说
            #手写数据集中没有1这张图,那么如果不加1,由于没有y=1,所以分子就会变成0,那么在最后求后验概率时这一项就变成了0,再
            #和条件概率乘,结果同样为0,不允许存在这种情况,所以分子加1,分母加上K(K为标签可取的值数量,这里有10个数,取值为10)
            #参考公式4.11
            #(len(trainLabelArr) + 10):标签集的总长度+10.
            #((np.sum(np.mat(trainLabelArr) == i)) + 1) / (len(trainLabelArr) + 10):最后求得的先验概率
            Py[i] = ((np.sum(np.mat(trainLabelArr) == i)) + 1) / (len(trainLabelArr) + 10)
        #转换为log对数形式
        #log书中没有写到,但是实际中需要考虑到,原因是这样:
        #最后求后验概率估计的时候,形式是各项的相乘(“4.1 朴素贝叶斯法的学习” 式4.7),这里存在两个问题:1.某一项为0时,结果为0.
        #这个问题通过分子和分母加上一个相应的数可以排除,前面已经做好了处理。2.如果特诊特别多(例如在这里,需要连乘的项目有784个特征
        #加一个先验概率分布一共795项相乘,所有数都是0-1之间,结果一定是一个很小的接近0的数。)理论上可以通过结果的大小值判断, 但在
        #程序运行中很可能会向下溢出无法比较,因为值太小了。所以人为把值进行log处理。log在定义域内是一个递增函数,也就是说log(x)中,
        #x越大,log也就越大,单调性和原数据保持一致。所以加上log对结果没有影响。此外连乘项通过log以后,可以变成各项累加,简化了计算。
        #在似然函数中通常会使用log的方式进行处理(至于此书中为什么没涉及,我也不知道)
        Py = np.log(Py)
    
        #计算条件概率 Px_y=P(X=x|Y = y)
        #计算条件概率分成了两个步骤,下方第一个大for循环用于累加,参考书中“4.2.3 贝叶斯估计 式4.10”,下方第一个大for循环内部是
        #用于计算式4.10的分子,至于分子的+1以及分母的计算在下方第二个大For内
        #初始化为全0矩阵,用于存放所有情况下的条件概率
        Px_y = np.zeros((classNum, featureNum, 2))
        #对标记集进行遍历
        for i in range(len(trainLabelArr)):
            #获取当前循环所使用的标记
            label = trainLabelArr[i]
            #获取当前要处理的样本
            x = trainDataArr[i]
            #对该样本的每一维特诊进行遍历
            for j in range(featureNum):
                #在矩阵中对应位置加1
                #这里还没有计算条件概率,先把所有数累加,全加完以后,在后续步骤中再求对应的条件概率
                Px_y[label][j][x[j]] += 1
    
    
        #第二个大for,计算式4.10的分母,以及分子和分母之间的除法
        #循环每一个标记(共10个)
        for label in range(classNum):
            #循环每一个标记对应的每一个特征
            for j in range(featureNum):
                #获取y=label,第j个特诊为0的个数
                Px_y0 = Px_y[label][j][0]
                #获取y=label,第j个特诊为1的个数
                Px_y1 = Px_y[label][j][1]
                #对式4.10的分子和分母进行相除,再除之前依据贝叶斯估计,分母需要加上2(为每个特征可取值个数)
                #分别计算对于y= label,x第j个特征为0和1的条件概率分布
                Px_y[label][j][0] = np.log((Px_y0 + 1) / (Px_y0 + Px_y1 + 2))
                Px_y[label][j][1] = np.log((Px_y1 + 1) / (Px_y0 + Px_y1 + 2))
    
        #返回先验概率分布和条件概率分布
        return Py, Px_y
    
    
    if __name__ == "__main__":
        start = time.time()
        # 获取训练集
        print('start read transSet')
        trainDataArr, trainLabelArr = loadData('路径/mnist_train.csv')
        # print("trainDataArr", trainDataArr, "trainLabelArr", trainLabelArr)
    
        # 获取测试集
        print('start read testSet')
        testDataArr, testLabelArr = loadData('路径/mnist_test.csv')
    
        #开始训练,学习先验概率分布和条件概率分布
        print('start to train')
        Py, Px_y = getAllProbability(trainDataArr, trainLabelArr)
    
        #使用习得的先验概率分布和条件概率分布对测试集进行测试
        print('start to test')
        accuracy = model_test(Py, Px_y, testDataArr, testLabelArr)
    
        #打印准确率
        print('the accuracy is:', accuracy)
        #打印时间
        print('time span:', time.time() -start)
    

     

     

    朴素贝叶斯对于贝叶斯,朴素在了哪里?

    因为乘法具有交换律,所以交换乘法的顺序不影响结果,但是,这就导致了朴素贝叶斯丢失了词语之间的顺序信息。在朴素贝叶斯眼里,“武松打死老虎”和“老虎打死武松”是完全相同的,这也就是说明了朴素贝叶斯丢失了词语之间的顺序信息(因为乘法具有交换律,所以交换乘法的顺序不影响结果),就相当于把所有的词汇扔进了一个袋子里面随便搅和。

    朴素贝叶斯模型

    当特征离散的情况:

    多项式模型

    重复的词语我们视为其出现多次,统计和判断的时候都要关注重复次数

    伯努利模型

    将重复出现的词语都视为其只出现一次,这种方式更加简化与方便。当然也丢失了词频信息,因此效果会差点。

    混合模型

    在计算句子概率时,不考虑重复词语出现的次数,但是在统计计算词语的概率时,却考虑重复词语出现的次数,也就是在训练的时候考虑重复次数,测试的时候不考虑。这种方式更加简化与方便。当然也丢失了词频信息,因此效果会差点。在训练的时候关注样本的真实概率分布,而测试的时候为了实时判断,就只计算一次。这种更关注实时性,因为判断统计的时候会更快点。

    当特征连续的情况:

    高斯模型

    当样本为例如身高体重等类似的连续特征,并且样本数量太少无法进行区间计算时,我们可以根据样本计算出均值和方差,并且假设样本分布为正态分布,这样我们就得到了密度函数。根据密度函数,我们可以将待求得特征值代入,得到密度函数得值。比如,男性的身高是均值5.855、方差0.035的正态分布。所以,男性的身高为6英尺的概率的相对值等于1.5789。根据得到的值进行计算类别。

     

    平滑技术

    常用得平滑技术基本上时拉普拉斯平滑。由于在测试集上,可能出现未记录得特征,导致P(x|y)为0,从而得到的P(y|x)为0,这显然时不对的。这个错误是因为训练集不足,所以,这个时候我们引入平滑技术。

    思想其实很简单,只要让概率不为0就好了,哪怕是一个再小的数都可以。所以,对于每个类别下所有划分的计数都加1。

     

    其中ajl,代表第j个特征的第l个选择,Sj代表第j个特征的个数,K代表种类的个数。\lambda为1就是拉普拉斯平滑。

     

    面试题(我只是个搬运工):

    问题:什么是贝叶斯决策论?

    回答:贝叶斯决策论是概率框架下实施决策的基本方法。要了解贝叶斯决策论,首先得先了解以下几个概念:先验概率、条件概率、后验概率、误判损失、条件风险、贝叶斯判别准则。概念似乎有点多,别急,下面我们一个个来进行讨论。

    先验概率: 所谓先验概率,就是根据以往的经验或者现有数据的分析所得到的概率。如,随机扔一枚硬币,则p(正面) = p(反面) = 1/2,这是我们根据已知的知识所知道的信息,即p(正面) = 1/2为先验概率。

    条件概率: 所谓条件概率是指事件A在另一事件B发生的条件下发送的概率。用数学符号表示为:P(B|A),即B在A发生的条件下发生的概率。举个栗子,你早上误喝了一瓶过期了的牛奶(A),那我们来算一下你今天拉肚子的概率(B),这个就叫做条件概率。即P(拉肚子|喝了过期牛奶), 易见,条件概率是有因求果(知道原因推测结果)。

    后验概率: 后验概率跟条件概率的表达形式有点相似。数学表达式为p(A|B), 即A在B发生的条件下发生的概率。以误喝牛奶的例子为例,现在知道了你今天拉肚子了(B),算一下你早上误喝了一瓶过期了的牛奶(A)的概率, 即P(A|B),这就是后验概率,后验概率是有果求因(知道结果推出原因)

    误判损失: 数学表达式:L(j|i), 判别损失表示把一个标记为i类的样本误分类为j类所造成的损失。 比如,当你去参加体检时,明明你各项指标都是正常的,但是医生却把你分为癌症病人,这就造成了误判损失,用数学表示为:L(癌症|正常)。

    条件风险: 是指基于后验概率P(i|x)可获得将样本x分类为i所产生的期望损失,公式为:R(i|x) = ∑L(i|j)P(j|x)。(其实就是所有判别损失的加权和,而这个权就是样本判为j类的概率,样本本来应该含有P(j|x)的概率判为j类,但是却判为了i类,这就造成了错判损失,而将所有的错判损失与正确判断的概率的乘积相加,就能得到样本错判为i类的平均损失,即条件风险。)

    举个栗子,假设把癌症病人判为正常人的误判损失是100,把正常人判为癌症病人的误判损失是10,把感冒病人判为癌症的误判损失是8,即L(正常|癌症) = 100, L(癌症|正常) = 10,L(癌症|感冒) = 8, 现在,我们经过计算知道有一个来体检的员工的后验概率分别为:p(正常|各项指标) = 0.2, p(感冒|各项指标) = 0.4, p( 癌症|各项指标)=0.4。假如我们需要计算将这个员工判为癌症的条件风险,则:R(癌症|各项指标) = L(癌症|正常)* p(正常|各项指标) + L(癌症|感冒) * p(感冒|各项指标) = 5.2

    贝叶斯判别准则: 贝叶斯判别准则是找到一个使条件风险达到最小的判别方法。即,将样本判为哪一类,所得到的条件风险R(i|x)(或者说平均判别损失)最小,那就将样本归为那个造成平均判别损失最小的类。

    此时:h*(x) = argminR(i|x) 就称为 贝叶斯最优分类器

    总结:贝叶斯决策论是基于先验概率求解后验概率的方法,其核心是寻找一个判别准则使得条件风险达到最小。而在最小化分类错误率的目标下,贝叶斯最优分类器又可以转化为求后验概率达到最大的类别标记,即 h*(x) = argmaxP(i|x)。(此时,L(i|j) = 0, if i = j;L(i|j) = 1, otherwise)

    问题1:你知道什么叫做朴素贝叶斯吗?

    回答:知道。朴素贝叶斯采用 属性条件独立性 的假设,对于给定的待分类观测数据X,计算在X出现的条件下,各个目标类出现的概率(即后验概率),将该后验概率最大的类作为X所属的类。而计算后验概率的贝叶斯公式为:p(A|B) =[ p(A) * p(B|A)]/p(B),因为p(B)表示观测数据X出现的概率,它在所有关于X的分类计算公式中都是相同的,所以我们可以把p(B)忽略,则 p(A|B)= p(A) * p(B|A)

    举个栗子,公司里面男性有60人,女性有40人,男性穿皮鞋的人数有25人,穿运动鞋的人数有35人,女性穿皮鞋的人数有10人,穿高跟鞋的人数有30人。现在你只知道有一个人穿了皮鞋,这时候你就需要推测他的性别是什么。如果推测出他是男性的概率大于女性,那么就认为他是男性,否则认为他是女性。(如果此时条件允许,你可以现场给面试官演示一下怎么计算, 计算过程如下:

    p(性别 = 男性) = 0.6
    p(性别 = 女性) = 0.4
    p(穿皮鞋|男性)  = 0.417
    p(穿皮鞋|女性) = 0.25

    p(穿皮鞋|男性) * p(性别 = 男性) = 0.2502
    p(穿皮鞋|女性) * p(性别 = 女性) = 0.1

    因为0.2502>0.1, 所以我们可以认为这个人是男性)

     

    问题2:朴素贝叶斯中的“朴素”怎么理解?

    回答:朴素贝叶斯中的朴素可以理解为是“简单、天真”的意思,因为“朴素”是假设了特征之间是同等重要、相互独立、互不影响的,但是在我们的现实社会中,属性之间并不是都是互相独立的,有些属性也会存在性,所以说朴素贝叶斯是一种很“朴素”的算法。

    (有没有注意到,如果遇到这个问题的话,接下来面试官可能会问的范围就很广了,建议面试者可以准备一下半朴素贝叶斯跟贝叶斯网络的知识)

    问题3:你能说说朴素贝叶斯的工作流程是怎么样的吗?

    回答:朴素贝叶斯的工作流程可以分为三个阶段进行,分别是准备阶段、分类器训练阶段和应用阶段。

    1. 准备阶段:这个阶段的任务是为朴素贝叶斯分类做必要的准备,主要工作是根据具体情况确定特征属性,并对每个特征属性进行适当划分,去除高度相关性的属性(如果两个属性具有高度相关性的话,那么该属性将会在模型中发挥了2次作用,会使得朴素贝叶斯所预测的结果向该属性所希望的方向偏离,导致分类出现偏差),然后由人工对一部分待分类项进行分类,形成训练样本集合。这一阶段的输入是所有待分类数据,输出是特征属性和训练样本。(这一阶段是整个朴素贝叶斯分类中唯一需要人工完成的阶段,其质量对整个过程将有重要影响。)

    2. 分类器训练阶段:这个阶段的任务就是生成分类器,主要工作是计算每个类别在训练样本中的出现频率及每个特征属性划分对每个类别的条件概率估计,并将结果记录。其输入是特征属性和训练样本,输出是分类器。这一阶段是机械性阶段,根据前面讨论的公式可以由程序自动计算完成。

    3. 应用阶段:这个阶段的任务是使用分类器对待分类项进行分类,其输入是分类器和待分类项,输出是待分类项与类别的映射关系。这一阶段也是机械性阶段,由程序完成。

     

    问题4:你能给我说说朴素贝叶斯有什么优缺点吗?

    回答:朴素贝叶斯的优点有4个,分别是:

    1. 朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。

    2. 对缺失数据不太敏感,算法也比较简单,常用于文本分类。

    3. 分类准确度高,速度快。

    4. 对小规模的数据表现很好,能处理多分类任务,适合增量式训练,当数据量超出内存时,我们可以一批批的去增量训练(朴素贝叶斯在训练过程中只需要计算各个类的概率和各个属性的类条件概率,这些概率值可以快速地根据增量数据进行更新,无需重新全量计算)。

    朴素贝叶斯的缺点有3个,分别是:

    1. 对训练数据的依赖性很强,如果训练数据误差较大,那么预测出来的效果就会不佳。

    2. 理论上,朴素贝叶斯模型与其他分类方法相比具有最小的误差率。 但是在实际中,因为朴素贝叶斯“朴素,”的特点,导致在属性个数比较多或者属性之间相关性较大时,分类效果不好。 而在属性相关性较小时,朴素贝叶斯性能最为良好。 对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进。

    3. 需要知道先验概率,且先验概率很多时候是基于假设或者已有的训练数据所得的,这在某些时候可能会因为假设先验概率的原因出现分类决策上的错误。

    问题5:“朴素”是朴素贝叶斯在进行预测时候的缺点,那么有这么一个明显的假设缺点在,为什么朴素贝叶斯的预测仍然可以取得较好的效果?

    回答:

    1. 对于分类任务来说,只要各个条件概率之间的排序正确,那么就可以通过比较概率大小来进行分类,不需要知道精确的概率值(朴素贝叶斯分类的核心思想是找出后验概率最大的那个类,而不是求出其精确的概率)

    2. 如果属性之间的相互依赖对所有类别的影响相同,或者相互依赖关系可以互相抵消,那么属性条件独立性的假设在降低计算开销的同时不会对分类结果产生不良影响。

    问题6:什么是拉普拉斯平滑法?

    回答:拉普拉斯平滑法是朴素贝叶斯中处理零概率问题的一种修正方式。在进行分类的时候,可能会出现某个属性在训练集中没有与某个类同时出现过的情况,如果直接基于朴素贝叶斯分类器的表达式进行计算的话就会出现零概率现象。为了避免其他属性所携带的信息被训练集中未出现过的属性值“抹去”,所以才使用拉普拉斯估计器进行修正。具体的方法是:在分子上加1,对于先验概率,在分母上加上训练集中可能的类别数;对于条件概率,则在分母上加上第i个属性可能的取值数

    问题7:朴素贝叶斯中有没有超参数可以调?

    回答:朴素贝叶斯是没有超参数可以调的,所以它不需要调参,朴素贝叶斯是根据训练集进行分类,分类出来的结果基本上就是确定了的,拉普拉斯估计器不是朴素贝叶斯中的参数,不能通过拉普拉斯估计器来对朴素贝叶斯调参。

    问题8:朴素贝叶斯中有多少种模型?

    回答:朴素贝叶斯含有3种模型,分别是高斯模型,对连续型数据进行处理;多项式模型,对离散型数据进行处理,计算数据的条件概率(使用拉普拉斯估计器进行平滑的一个模型);伯努利模型,伯努利模型的取值特征是布尔型,即出现为ture,不出现为false,在进行文档分类时,就是一个单词有没有在一个文档中出现过。

    问题9: 你知道朴素贝叶斯有哪些应用吗?

    回答:知道(肯定得知道啊,不然不就白学了吗?) 朴素贝叶斯的应用最广的应该就是在文档分类、垃圾文本过滤(如垃圾邮件、垃圾信息等)、情感分析(微博、论坛上的积极、消极等情绪判别)这些方面,除此之外还有多分类实时预测、推荐系统(贝叶斯与协同过滤组合使用)、拼写矫正(当你输入一个错误单词时,可以通过文档库中出现的概率对你的输入进行矫正)等。

    问题10:你觉得朴素贝叶斯对异常值敏不敏感?

    回答:朴素贝叶斯对异常值不敏感。所以在进行数据处理时,我们可以不去除异常值,因为保留异常值可以保持朴素贝叶斯算法的整体精度,而去除异常值则可能在进行预测的过程中由于失去部分异常值导致模型的泛化能力下降。

    问题11:朴素贝叶斯是高方差还是低方差模型?

    回答:朴素贝叶斯是低方差模型。(误差 = 偏差 + 方差)对于复杂模型来说,由于复杂模型充分拟合了部分数据,使得它们的偏差变小,但由于对部分数据过分拟合,这就导致预测的方差会变大。因为朴素贝叶斯假设了各个属性之间是相互的,算是一个简单的模型。对于简单的模型来说,则恰恰相反,简单模型的偏差会更大,相对的,方差就会较小。(偏差是模型输出值与真实值的误差,也就是模型的精准度,方差是预测值与模型输出期望的的误差,即模型的稳定性,也就是数据的集中性的一个指标)

     

     

     

    参考

    https://github.com/Dod-o/Statistical-Learning-Method_Code/blob/master/CodePic.png                     (实现李航统计学习里面的代码,基本上每行都有注释,很nice)

    https://cloud.tencent.com/developer/article/1474960                                                                           (朴素贝叶斯面试题来源)

     

    展开全文
  • 机器学习—朴素贝叶斯模型 1.通俗解释: 朴素贝叶斯模型的基本思路就是利用贝叶斯的后验概率公式来推算当前属性下的数据样本属于哪一个类别。直白一点说,就是在特征属性为当前取值的条件下,该样本归属于那个类别的...
  • 朴素贝叶斯模型的概述和python代码实现
  • 多项式朴素贝叶斯也是多用于文本处理,其原理和计算的流程和伯努利朴素贝叶斯基本一致,唯一的区别在于单词的计数方式,由《伯努利朴素贝叶斯》一文可知,在文本处理的环节中,我们将单词是否出现在词组作为特征,但...
  • 朴素贝叶斯模型详解

    2019-02-11 12:09:39
    一:贝叶斯定理 P(A∣B)P(A|B)P(A∣B) = P(A)P(B∣A)P(B)\frac{P(A)P(B|A)}{P(B)}P(B)P(A)P(B∣A)​,其中P(A∣B)P(A|B)P(A∣B)是在BBB发生条件下AAA发生的可能性。 二:特征条件独立性 如果AAA、BBB两事件相互独立...
  • P(B|A)=P(AB)/P(A)=12%/29%≈41% 3.2 朴素贝叶斯模型流程 朴素贝叶斯的基本方法: 在统计数据的基础上,依据条件概率公式,计算当前特征的样本属于某个分类的概率,选最大的概率分类。 对于给出的待分类项,求解在...
  • 朴素贝叶斯模型及python实现

    千次阅读 2021-02-05 17:40:36
    1 朴素贝叶斯模型朴素贝叶斯法是基于贝叶斯定理、特征条件独立假设的分类方法。在预测时,对输入x,找出对应后验概率最大的 y 作为预测。NB模型:输入:先验概率分布:P(Y=ck),k=1,2,⋯,KP\left(Y=c_{k}\right), \...
  • 利用朴素贝叶斯模型识别垃圾邮件,http://blog.csdn.net/gane_cheng/article/details/53219332
  • 朴素贝叶斯模型(NAIVE BAYESIAN MODEL)

    千次阅读 2019-07-15 10:28:53
    朴素贝叶斯方法是在贝叶斯算法的基础上进行了相应的简化,即假定给定目标值时属性之间相互条件独立。也就是说没有哪个属性变量对于决策结果来说占有着较大的比重,也没有哪个属性变量对于决策结果占有着较小的比重。...
  • 介绍 首先我们需要搞清楚条件概率和联合概率的意思,可以通过下图进行描述: ...可知:,即:即为我们的朴素贝叶斯模型 Demo 我们通过一个小的Demo来理解贝叶斯理论的思想(这里对比了一下knn模型,因此...
  • 该算法首先通过训练过程获取朴素贝叶斯模型中的各个参数,然后以此为基础,在测试过程中完成关键词提取。相较于传统的tf*idf算法,该算法能准确提取出文档中的关键词,具有良好的扩展性。
  • 朴素贝叶斯模型的简单应用

    千次阅读 2018-06-14 17:24:52
    朴素贝叶斯模型是贝叶斯理论中最简单的一类,基本假设有两个,一是特征相互独立,二是特征同等重要,这样可以大大简化计算,虽然在实际中属性之间未必是相互独立的,甚至存在严重的依赖性(此时会用到半朴素贝叶斯...
  • 基于朴素贝叶斯模型的单词语义相似度度量
  • 人工智能-项目实践-文本分类-LDA模型提取文本特征,然后用朴素贝叶斯模型进行分类 核心思路是把分词之后的结果分为几类; LDA(Latent Dirichlet Allocation)模型可提取出来的且精度可以识别出来的 LDA模型可提取...
  • 一、朴素贝叶斯的推导朴素贝叶斯学习(naive Bayes)是一种有监督的学习,训练时不仅要提供训练样本的特征向量X,而且还需提供训练样本的实际标记Y,是一种基于贝叶斯定理和特征条件独立假设的分类方法。1. 贝叶斯...
  • 朴素贝叶斯模型进行垃圾邮件分类

    千次阅读 2020-07-07 18:17:43
    127-151.txt为普通邮件标记为0 labels = np.array([1]*127 + [0]*24) model = MultinomialNB() #朴素贝叶斯模型 model.fit(vector, labels) #测试模型 def predict(filename): """对未知邮件分类""" # 构建未知邮件...
  • 本节主要介绍数据挖掘中常见的分类方法决策树和朴素贝叶斯算法。 决策树算法 决策树(Decision Tree,DT)分类法是一个简单且广泛使用的分类技术。 决策树是一个树状预测模型,它是由结点和有向边组成的层次结构。...
  • 文章目录机器学习【系列】之第四章朴素贝叶斯模型前言一、朴素贝叶斯模型的算法原理二、朴素贝叶斯模型的简单代码实现案例分析:肿瘤预测模型1.读取数据2.划分特征变量和目标变量3.模型的搭建与使用总结 前言 本章...
  • 简单的朴素贝叶斯模型练习

    千次阅读 2017-10-22 19:32:21
    朴素贝叶斯模型,说白了就是在事件独立的情况下,计算某一特征属于哪个类别的概率大,那么就把这一特征归于这一类。 公式:p(c|wi) = p(wi|c)*p(c) / p(wi) 如果:p(c1|wi)>p(c2|wi),则wi属于类c1  p(c1|wi) # ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 36,337
精华内容 14,534
关键字:

朴素贝叶斯模型

友情链接: project_2.rar