美文网首页
机器学习----朴素贝叶斯分类器

机器学习----朴素贝叶斯分类器

作者: strive鱼 | 来源:发表于2018-11-12 23:33 被阅读0次

在讲解之前,首先来了解两个概念 即先验概率和后验概率

  • 先验概率
    通俗的讲就是一个袋子里面装有3个红球,4个黑球,取出的球是红球的概率是多少? 答案为1/2,是不是有点惊讶,这明显错误吧,原因是没有考虑变量的个数,则取出的球要么是黑球,要么是白球,这就是先验概率的简单理解

  • 后验概率
    还是上述的例子,得到红球的概率为3/7,这就是考虑到了变量的个数,这就是后验概率的简单介绍

一、为什么要使用贝叶斯分类器

举个简单的例子,有时候你想要知道富有某些特征的事物是否属于某一类别,也就是分类,但是现实生活当中,往往这样的命题很难解答,但是把这个问题反过来想,如果你知道某一个事物属于哪一类,让你说出该事物的所有特征,是不是很简单,这就是贝叶斯分类器的主要分类思想

二、贝叶斯分类器的核心公式

将上述图片进行转化

三、例子分析

现在我们的命题是,如果一对男女朋友,男生向女生求婚,男生的四个特点分别是不帅,性格不好,身高矮,不上进,请你判断一下女生是嫁还是不嫁?

将上述的这个问题转化为贝叶斯分类问题



那么只需要求出上式等号右边的分子和分母即可解答

这就需要引入朴素贝叶斯的概念了

  • 我们设定 p(不帅、性格不好、身高矮、不上进|嫁) = p(不帅|嫁)p(性格不好|嫁)p(身高矮|嫁)*p(不上进|嫁)
  • p(不帅、性格不好、身高矮、不上进) = p(不帅)p(性格不好)p(身高矮)*p(不上进)

上述的式子是不是存在一些问题?对的,如果等号左边和等号右边相等,则各个条件必须是相互独立的,互不干扰的,这也就是"朴素"二字的由来

那么为什么要假定各个特征之间相互独立呢? 其实很好理解,如果各个特征之间不独立,而相互关联,那么必然会存在交叉,这样如果有3中不同的特征,每个特征有两个相反的特征值,这样交叉就会有2 * 2 * 2=8中可能性,而如果特征之间相互独立,那么就会仅有3种,现实生活中的特征相当之多,指定相互独立可以大大减少计算机的负担,提高分析效率

四、拉普拉斯修正

测试集的样本如下:


首先为什么要进行拉普拉斯修正


由上面的式子可以知道,加入在样本当中DC=0,这个时候P(C)也就为零,上面所提到的朴素贝叶斯计算公式的分子也为0,但是真的对吗?不见得,万一某一种分类刚好没有出现在样本集中呢?但是不代表其为0,不如上述表格中的例子,有大、一般(否),会不会有中呢,采集的样本集没有,不代表D(中)的概率就一定为0,这样就需要拉普拉斯修正,修正公式如下

这样一来,先验概率 P(c) ,注意DC、N的指代

P(c = 好果)= (4+1) / (10+2) = 5/12

P(c = 一般) = (6+1) / (10+2) = 7/12

类的,条件概率P(x | c) 的计算公式由:

被拉普拉斯修正为:

image

P(大小=大 | c=好果,形状=圆形) = (2+1)/(3+2) = 3/5

P(颜色=青色 | c=好果) = (0+1)/(4+2) = 1/6

P(形状=圆形 | c=好果,大小=大) = (2+1) / (3+2) = 3/5

P(大小=大 | c=一般,形状=圆形) = (1+1) /( 2+2) = 2/4

P(颜色=青色 | c=一般) = (5+1)/(6+2) = 6/8

P(形状=圆形 | c=一般,大小=大) = (1+1)/(3+2) = 2/5

半朴素贝叶斯分类器

朴素贝叶斯分类器的一个重要假定:分类对应的各个属性间是相互独立的,然而在现实应用中,这个往往难以做到,那怎么办呢?
很简单,适当考虑一部分属性间的相互依赖关系,这种放松后的分类称为半朴素贝叶斯分类,其中最常用的策略:假定每个属性仅依赖于其他最多一个属性,称其依赖的这个属性为其超父属性,这种关系称为:独依赖估计(ODE)。

属性相互独立时候,朴素贝叶斯公式为


半朴素贝叶斯的公式为



其中,pai为其超父属性,比如上述例子中的大>=圆形)

利用下面的公式来计算半朴素贝叶斯


以上就是贝叶斯分类器西瓜书的知识通俗总结,下一章无监督学习--聚类

sklearn关于朴素贝叶斯的使用

sklearn 中朴素贝叶斯提供了四种算法,GaussianNB(高斯朴素贝叶斯)、MultinomialNB(多项式朴素贝叶斯)、BernoulliNB(伯努利朴素贝叶斯),Out-of-core naive Bayes model fitting ( 超核的朴素贝叶斯模型拟合 ),本文主要介绍前两种算法

1.GaussianNB(高斯朴素贝叶斯)

官方文档的介绍如下

#高斯贝叶斯
"""
主要的参数 为
priors,每一种分类的先验概率,为一个数组array的类型,一般设定为None
var_smoothing defaukt=1e-9   所有特征中的最大稳定方差


属性
class_prior array ,shape   每一类的先验概率
class_count_    array  shape   训练样本中,每一类的样本数量,返回的是一个array
theta_  每一类当中,某一个属性的值的平均数,返回的是一个array
sigma_   每一类中某一个属性的值方差  返回的是 array


方法:
1.fit(x,y) 训练样本
2.get_params(deep=True) 当为True 的时候,会返回priors
3.partial_fit(x,y,classes=None,sample_weight=None)对于这个方法的介绍如下,其中参数是每一个样本出现的概率,理论上和应该为1
增量式训练,当训练数据集数据量非常大,不能一次性全部载入内存时,可以将数据集划分若干份,
重复调用partial_fit在线学习模型参数,在第一次调用partial_fit函数时,
必须制定classes参数,在随后的调用可以忽略
4.predict_proba(X)

5. 该方法比较重要, predeict_proba(X)   输出测试样本划分到各类标签中的可能性也就是概率大小

6.predict_log_proba(X):上述方法5,概率大小的对数值

7.score(x,y)  Returns the mean accuracy on the given test data and labels.
"""

简单的实例demo

import numpy as np
from sklearn.naive_bayes import GaussianNB
x=np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
y=np.array([1, 1, 1, 2, 2, 2])
clf=GaussianNB([0.25,0.75]) #实例化高斯贝叶斯
#clf.fit(x,y)
#print (clf.epsilon_)
#print (clf.get_params(deep=True))
clf.partial_fit(x,y,np.unique(y))#unique对标签进行去重
print (clf.predict([[-0.8,-1]]))
print (clf.score(x,y))
print (clf.score([[-6,1],[-4,-3],[-2,-4],[1,5]],[1,1,2,2]))
2.MultinomialNB(多项式朴素贝叶斯)

官方文档介绍如下

"""
关于多项式朴素贝叶斯的方法method,与上述高斯方法一样,不再赘述
参数 
alpha    浮点型  Additive (Laplace/Lidstone) smoothing parameter (0 for no smoothing).  添加拉普拉斯修正参数
fit_prior  布尔型     表示是否学习先验概率,参数为False表示所有类标记具有相同的先验概率
class_prior  Prior probabilities of the classes. If specified the priors are not adjusted according to the data.
指定先验概率,如果指定,则不会在根据数据的司机情况改变


属性

1.class_log_prior_:  各类标记的平滑先验概率对数值,其取值会受fit_prior和class_prior参数的影响
若指定了class_prior参数,不管fit_prior为True或False,class_log_prior_取值是class_prior转换成log后的结果
若fit_prior参数为False,class_prior=None,则各类标记的先验概率相同等于类标记总个数N分之一
若fit_prior参数为True,class_prior=None,则各类标记的先验概率相同等于各类标记个数除以各类标记个数之和

2.intercept_:将多项式朴素贝叶斯解释的class_log_prior_映射为线性模型,其值和class_log_prior相同

3.feature_log_prob_:指定类的各特征概率(条件概率)对数值,返回数组, 比如  p(帅|好人)


4.class_count_:训练样本中各类别对应的样本数,按类的顺序排序输

5.feature_count_:各类别各个特征出现的次数,返回形状为数组

6.coef_:将多项式朴素贝叶斯解释feature_log_prob_映射成线性模型,其值和feature_log_prob相同
"""

官方的demo 实例

import numpy as np
from sklearn.naive_bayes import MultinomialNB
x=np.random.randint(5,size=(6,100))#randint 0-5的樟树
#print (x)
y=np.array([1,2,3,4,5,6])
clf=MultinomialNB()
clf.fit(x,y)
print (clf.predict(x[2:3]))

相关文章

网友评论

      本文标题:机器学习----朴素贝叶斯分类器

      本文链接:https://www.haomeiwen.com/subject/luehfqtx.html