scikit-learn 朴素贝叶斯类库_scikit-learn multinomialnb-程序员宅基地

技术标签: 机器学习  

scikit-learn 朴素贝叶斯类库

朴素贝叶斯方法是基于贝叶斯定理的一组有监督学习算法,即“简单”地假设每对特征之间相互独立。 给定一个类别 y y y 和一个从$ x_1$ 到 x n x_n xn的相关的特征向量, 贝叶斯定理阐述了以下关系:
P ( y ∣ x 1 , x 2 , … , x n ) = P ( y ) P ( x 1 , … , x n ∣ y ) P ( x 1 , … , x n ) P(y|x_1,x_2,\ldots,x_n) = \frac{P(y)P(x_1,\ldots,x_n|y)}{P(x_1,\ldots,x_n )} P(yx1x2xn)=P(x1xn)P(y)P(x1xny)
使用简单(navie)的假设-每对特征之间都是相互独立的:
P ( x i ∣ y , x 1 , x 2 , … , x i − 1 , x i + 1 , … , x n ) = P ( x i ∣ y ) P(x_i|y,x_1,x_2,\ldots,x_{i-1},x_{i+1},\ldots,x_n) = P(x_i|y) P(xiyx1x2xi1xi+1xn)=P(xiy)
可以对关系式进行化简为:
P ( y ∣ x 1 , … , x n ) = P ( y ) ∏ i = 1 n P ( x i ∣ y ) P ( x 1 , … , x n ) P(y|x_1,\ldots,x_n) = \frac{P(y)\prod_{i=1}^{n}P(x_i|y)}{P(x_1,\ldots,x_n)} P(yx1xn)=P(x1xn)P(y)i=1nP(xiy)
由于在给定的输入中 P ( x 1 , … , x n ) P(x_1,\ldots,x_n) P(x1xn)是常量,使用下面的分类规则:
P ( y ∣ x 1 , … , x n ) ∝ P ( y ) ∏ i = 1 n P ( x i ∣ y ) P(y|x_1,\ldots,x_n) \propto P(y) \prod_{i=1}^{n}P(x_i|y) P(yx1xn)P(y)i=1nP(xiy)
y ^ = a r g   m a x ⎵ y P ( y ) ∏ i = 1 n P ( x i ∣ y ) \hat{y} = arg \ \underbrace{max}_{y}P(y) \prod_{i=1}^{n} P(x_i|y) y^=arg y maxP(y)i=1nP(xiy)
我们可以使用最大后验概率(Maximum A Posteriori, MAP) 来估计 P ( y ) P(y) P(y) P ( x i ∣ y ) P(x_i|y) P(xiy),前者是训练集中类别 y y y的相对频率。各种各样的的朴素贝叶斯分类器的差异大部分来自于处理 P ( x i ∣ y ) P(x_i \mid y) P(xiy)分布时的所做的假设不同。
尽管其假设过于简单,在很多实际情况下,朴素贝叶斯工作得很好,特别是文档分类和垃圾邮件过滤。这些工作都要求 一个小的训练集来估计必需参数。相比于其他更复杂的方法,朴素贝叶斯学习器和分类器非常快。 分类条件分布的解耦意味着可以独立单独地把每个特征视为一维分布来估计。这样反过来有助于缓解维度灾难带来的问题。
另一方面,尽管朴素贝叶斯被认为是一种相当不错的分类器,但却不是好的估计器(estimator),所以不能太过于重视从predict_proba输出的概率。


1.高斯朴素贝叶斯

GaussianNB实现了运用于分类的高斯朴素贝叶斯算法。特征的可能性(即概率)假设为高斯分布:
P ( x i ∣ y ) = 1 2 π σ y 2 e x p ⟮ − ( x i − μ y ) 2 2 σ y 2 ⟯ P(x_i \mid y) = \frac{1}{\sqrt{2\pi\sigma_y^2}} exp\lgroup -\frac{(x_i - \mu_y)^2}{2\sigma_y^2}\rgroup P(xiy)=2πσy2 1exp2σy2(xiμy)2
参数 σ y \sigma_y σy μ y \mu_y μy使用极大似然然估计。


2. 多项分布朴素贝叶斯

MultinomialNB实现了服从多项分布数据的朴素贝叶斯算法,也是用于文本分类(这个领域中数据往往以词向量表示,尽管在实践中 tf-idf 向量在预测时表现良好)的两大经典朴素贝叶斯算法之一。布参数由每类 y y y θ y = ( θ y 1 , … , θ y n ) \theta_y = (\theta_{y1},\ldots,\theta_{yn}) θy=(θy1,,θyn)向量决定, 式中 n n n 是特征的数量(对于文本分类,是词汇量的大小) θ y i \theta_{yi} θyi 是样本中属于类 y y y 中特征 i i i 概率 P ( x i ∣ y ) P(x_i \mid y) P(xiy)
参数 θ y \theta_y θy 使用平滑过的最大似然估计法来估计,即相对频率计数:
θ ^ y i = N y i + α N y + α n \hat{\theta}_{yi} = \frac{N_{yi} + \alpha}{N_y + \alpha n} θ^yi=Ny+αnNyi+α
式中 N y i = ∑ x ∈ T x i N_{yi} = \sum_{x \in T} x_i Nyi=xTxi 是 训练集 T T T 中 特征 i i i在类 y y y 中出现的次数, N y = ∑ i = 1 ∣ T ∣ N y i N_{y} = \sum_{i=1}^{|T|} N_{yi} Ny=i=1TNyi 是类 y y y 中出现所有特征的计数总和。
先验平滑因子 α ≥ 0 \alpha \ge 0 α0 应用于在学习样本中没有出现的特征,以防在将来的计算中出现0概率输出。 把 α = 1 \alpha = 1 α=1 被称为拉普拉斯平滑(Lapalce smoothing),而 α &lt; 1 \alpha &lt; 1 α<1 被称为利德斯通平滑(Lidstone smoothing)。


3. 伯努利朴素贝叶斯

BernoulliNB实现了用于多重伯努利分布数据的朴素贝叶斯训练和分类算法,即有多个特征,但每个特征 都假设是一个二元 (Bernoulli, boolean) 变量。 因此,这类算法要求样本以二元值特征向量表示;如果样本含有其他类型的数据, 一个BernoulliNB实例会将其二值化(取决于binarize参数)。
伯努利朴素贝叶斯的决策规则基于
P ( x i ∣ y ) = P ( i ∣ y ) x i + ( 1 − P ( i ∣ y ) ) ( 1 − x i ) P(x_i \mid y) = P(i \mid y) x_i + (1 - P(i \mid y))(1 - x_i) P(xiy)=P(iy)xi+(1P(iy))(1xi)
与多项分布朴素贝叶斯的规则不同 伯努利朴素贝叶斯明确地惩罚类 y y y中没有出现作为预测因子的特征 i i i ,而多项分布分布朴素贝叶斯只是简单地忽略没出现的特征。
BernoulliNB一共有4个参数,其中3个参数的名字和意义和MultinomialNB完全相同。唯一增加的一个参数是binarize。这个参数主要是用来帮BernoulliNB处理二项分布的,可以是数值或者不输入。如果不输入,则BernoulliNB认为每个数据特征都已经是二元的。否则的话,小于binarize的会归为一类,大于binarize的会归为另外一类。
在文本分类的例子中,词频向量(word occurrence vectors)(而非词数向量(word count vectors))可能用于训练和用于这个分类器。 BernoulliNB可能在一些数据集上可能表现得更好,特别是那些更短的文档。实际使用时,最好对两个模型都进行评估。


4. 在莺尾花数据集上的测试代码及结果
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
from sklearn.preprocessing import StandardScaler
from sklearn.naive_bayes import GaussianNB, MultinomialNB
from sklearn.pipeline import Pipeline
from sklearn.neighbors import KNeighborsClassifier

#解决中文显示乱码的问题
from matplotlib.font_manager import FontProperties
myfont = FontProperties(fname='/home/liyuanshuo/Downloads/simheittf/simhei.ttf')


def iris_type(s):
    it = {
    b'Iris-setosa': 0, b'Iris-versicolor': 1, b'Iris-virginica': 2}
    return it[s]

def GasssianNB_test():
    data = np.loadtxt('iris.data', dtype=float, delimiter=',', converters={
    4: iris_type})
    print(data)
    x, y = np.split(data, (4, ), axis=1)
    x = x[:, :2]
    print(x)
    print(y)

    gnb = Pipeline([('sc', StandardScaler()), ('clf', GaussianNB())])
    gnb.fit(x, y.ravel())

    #下面使用多项式分布贝叶斯和K紧邻分类作为对比
    # gnb = MultinomialNB().fit(x, y.ravel())
    # gnb = KNeighborsClassifier(n_neighbors=5).fit(x, y.ravel())

    #下面画图展示结果
    N, M = 500, 500                                     #横纵各采样多少个值
    x1_min, x1_max = x[:, 0].min(), x[:, 0].max()       #第0列的范围
    x2_min, x2_max = x[:, 1].min(), x[:, 1].max()       #第一列的范围
    t1 = np.linspace(x1_min, x1_max, N)
    t2 = np.linspace(x2_min, x2_max, N)
    x1, x2 = np.meshgrid(t1, t2)                        #生成网格采样点
    x_test = np.stack((x1.flat, x2.flat), axis=1)       #测试点


    # mpl.rcParams['font.sans-serif'] = ['simhei']
    mpl.rcParams['axes.unicode_minus'] = False
    # plt.rcParams['font.sans-serif'] = ['simhei']
    plt.rcParams['axes.unicode_minus'] = False
    cm_light = mpl.colors.ListedColormap(['#77E0A0', '#FF8080', '#A0A0FF'])
    cm_dark = mpl.colors.ListedColormap(['g', 'r', 'b'])

    y_hat = gnb.predict(x_test)                         #预测值
    y_hat = y_hat.reshape(x1.shape)                     #保证输入和输出的形状相同
    plt.figure(facecolor='w')
    plt.pcolormesh(x1, x2, y_hat, cmap=cm_light)        #显示预测值
    plt.scatter(x[:, 0], x[:, 1], c='y', edgecolors='k', s=50, cmap=cm_dark)  #显示样本
    plt.xlabel(u'花萼长度', fontsize=14, fontproperties=myfont)
    plt.ylabel(u'花萼宽度', fontsize=14, fontproperties=myfont)
    plt.xlim(x1_min, x1_max)
    plt.ylim(x2_min, x2_max)
    plt.title('GaussianNB对莺尾花数据分类结果', fontsize=18, fontproperties=myfont)
    plt.grid(True)
    plt.show()
    plt.savefig('GaussianNB对莺尾花数据分类结果.png')


    #训练集上的预测结果
    y_hat = gnb.predict(x)
    y = y.reshape(-1)
    result = y_hat==y
    print(y_hat)
    print(result)
    acc = np.mean(result)
    print('训练集分类准确率: %.2f%%'%(100*acc))



if __name__ == '__main__':
    GasssianNB_test()

结果图片如下:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


5使用随机数据实现的代码
import numpy as np
from sklearn.naive_bayes import GaussianNB, MultinomialNB
from sklearn import metrics


def MultinomialNB_test():
    np.random.seed(0)
    M = 20
    N = 5
    x = np.random.randint(2, size=(M, N))
    x = np.array(list(set([tuple(t) for t in x])))
    M = len(x)
    y = np.arange(M)
    print('样本个数: %d,特征数目: %d'%x.shape)
    print('样本为:\n', x)
    mnb = MultinomialNB(alpha=1)
    mnb.fit(x, y)
    y_hat = mnb.predict(x)
    print('预测类别: ', y_hat)
    print('预测准确率: %.2f%%'%(100*np.mean(y_hat==y)))
    print('系统得分: ', mnb.score(x, y))
    print('系统得分: ', metrics.accuracy_score(y, y_hat))

    err = y_hat != y
    for i, e in enumerate(err):
        if e:
            print(y[i], ': \t', x[i], '被认为与', x[y_hat[i]], '一个类别')


if __name__ == '__main__':
    MultinomialNB_test()s

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/liyuanshuo_nuc/article/details/83514802

智能推荐

攻防世界_难度8_happy_puzzle_攻防世界困难模式攻略图文-程序员宅基地

文章浏览阅读645次。这个肯定是末尾的IDAT了,因为IDAT必须要满了才会开始一下个IDAT,这个明显就是末尾的IDAT了。,对应下面的create_head()代码。,对应下面的create_tail()代码。不要考虑爆破,我已经试了一下,太多情况了。题目来源:UNCTF。_攻防世界困难模式攻略图文

达梦数据库的导出(备份)、导入_达梦数据库导入导出-程序员宅基地

文章浏览阅读2.9k次,点赞3次,收藏10次。偶尔会用到,记录、分享。1. 数据库导出1.1 切换到dmdba用户su - dmdba1.2 进入达梦数据库安装路径的bin目录,执行导库操作  导出语句:./dexp cwy_init/[email protected]:5236 file=cwy_init.dmp log=cwy_init_exp.log 注释:   cwy_init/init_123..._达梦数据库导入导出

js引入kindeditor富文本编辑器的使用_kindeditor.js-程序员宅基地

文章浏览阅读1.9k次。1. 在官网上下载KindEditor文件,可以删掉不需要要到的jsp,asp,asp.net和php文件夹。接着把文件夹放到项目文件目录下。2. 修改html文件,在页面引入js文件:<script type="text/javascript" src="./kindeditor/kindeditor-all.js"></script><script type="text/javascript" src="./kindeditor/lang/zh-CN.js"_kindeditor.js

STM32学习过程记录11——基于STM32G431CBU6硬件SPI+DMA的高效WS2812B控制方法-程序员宅基地

文章浏览阅读2.3k次,点赞6次,收藏14次。SPI的详情简介不必赘述。假设我们通过SPI发送0xAA,我们的数据线就会变为10101010,通过修改不同的内容,即可修改SPI中0和1的持续时间。比如0xF0即为前半周期为高电平,后半周期为低电平的状态。在SPI的通信模式中,CPHA配置会影响该实验,下图展示了不同采样位置的SPI时序图[1]。CPOL = 0,CPHA = 1:CLK空闲状态 = 低电平,数据在下降沿采样,并在上升沿移出CPOL = 0,CPHA = 0:CLK空闲状态 = 低电平,数据在上升沿采样,并在下降沿移出。_stm32g431cbu6

计算机网络-数据链路层_接收方收到链路层数据后,使用crc检验后,余数为0,说明链路层的传输时可靠传输-程序员宅基地

文章浏览阅读1.2k次,点赞2次,收藏8次。数据链路层习题自测问题1.数据链路(即逻辑链路)与链路(即物理链路)有何区别?“电路接通了”与”数据链路接通了”的区别何在?2.数据链路层中的链路控制包括哪些功能?试讨论数据链路层做成可靠的链路层有哪些优点和缺点。3.网络适配器的作用是什么?网络适配器工作在哪一层?4.数据链路层的三个基本问题(帧定界、透明传输和差错检测)为什么都必须加以解决?5.如果在数据链路层不进行帧定界,会发生什么问题?6.PPP协议的主要特点是什么?为什么PPP不使用帧的编号?PPP适用于什么情况?为什么PPP协议不_接收方收到链路层数据后,使用crc检验后,余数为0,说明链路层的传输时可靠传输

软件测试工程师移民加拿大_无证移民,未受过软件工程师的教育(第1部分)-程序员宅基地

文章浏览阅读587次。软件测试工程师移民加拿大 无证移民,未受过软件工程师的教育(第1部分) (Undocumented Immigrant With No Education to Software Engineer(Part 1))Before I start, I want you to please bear with me on the way I write, I have very little gen...

随便推点

Thinkpad X250 secure boot failed 启动失败问题解决_安装完系统提示secureboot failure-程序员宅基地

文章浏览阅读304次。Thinkpad X250笔记本电脑,装的是FreeBSD,进入BIOS修改虚拟化配置(其后可能是误设置了安全开机),保存退出后系统无法启动,显示:secure boot failed ,把自己惊出一身冷汗,因为这台笔记本刚好还没开始做备份.....根据错误提示,到bios里面去找相关配置,在Security里面找到了Secure Boot选项,发现果然被设置为Enabled,将其修改为Disabled ,再开机,终于正常启动了。_安装完系统提示secureboot failure

C++如何做字符串分割(5种方法)_c++ 字符串分割-程序员宅基地

文章浏览阅读10w+次,点赞93次,收藏352次。1、用strtok函数进行字符串分割原型: char *strtok(char *str, const char *delim);功能:分解字符串为一组字符串。参数说明:str为要分解的字符串,delim为分隔符字符串。返回值:从str开头开始的一个个被分割的串。当没有被分割的串时则返回NULL。其它:strtok函数线程不安全,可以使用strtok_r替代。示例://借助strtok实现split#include <string.h>#include <stdio.h&_c++ 字符串分割

2013第四届蓝桥杯 C/C++本科A组 真题答案解析_2013年第四届c a组蓝桥杯省赛真题解答-程序员宅基地

文章浏览阅读2.3k次。1 .高斯日记 大数学家高斯有个好习惯:无论如何都要记日记。他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?高斯出生于:1777年4月30日。在高斯发现的一个重要定理的日记_2013年第四届c a组蓝桥杯省赛真题解答

基于供需算法优化的核极限学习机(KELM)分类算法-程序员宅基地

文章浏览阅读851次,点赞17次,收藏22次。摘要:本文利用供需算法对核极限学习机(KELM)进行优化,并用于分类。

metasploitable2渗透测试_metasploitable2怎么进入-程序员宅基地

文章浏览阅读1.1k次。一、系统弱密码登录1、在kali上执行命令行telnet 192.168.26.1292、Login和password都输入msfadmin3、登录成功,进入系统4、测试如下:二、MySQL弱密码登录:1、在kali上执行mysql –h 192.168.26.129 –u root2、登录成功,进入MySQL系统3、测试效果:三、PostgreSQL弱密码登录1、在Kali上执行psql -h 192.168.26.129 –U post..._metasploitable2怎么进入

Python学习之路:从入门到精通的指南_python人工智能开发从入门到精通pdf-程序员宅基地

文章浏览阅读257次。本文将为初学者提供Python学习的详细指南,从Python的历史、基础语法和数据类型到面向对象编程、模块和库的使用。通过本文,您将能够掌握Python编程的核心概念,为今后的编程学习和实践打下坚实基础。_python人工智能开发从入门到精通pdf