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

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

  • 先验概率
    通俗的讲就是一个袋子里面装有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]))
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容