朴素贝叶斯以及它的三个模型
一.先验概率和后验概率理解:
先验:统计层次上的经验而知当下发生的概率;
后验:当下由因及果的概率;
举例:
1)先验——根据若干年的统计(经验)或者气候(常识),某地方下雨的概率;
2)似然——下雨(果)的时候有乌云(因)的概率,即已经有了果,对证据发生的可能性描述;
3)后验——根据天上有乌云(原因),下雨(结果)的概率;
后验 ~ 先验*似然 : 存在下雨的可能(先验),下雨之前会有乌云(似然)~ 通过现在有乌云推断下雨概率(后验);
先验分布:根据一般的经验认为随机变量应该满足的分布
后验分布:通过当前训练数据修正的随机变量的分布,比先验分布更符合当前数据
似然估计:已知训练数据,给定了模型,通过让似然性极大化估计模型参数的一种方法
后验分布往往是基于先验分布和极大似然估计计算出来的。
二.朴素贝叶斯方法:
1. 朴素贝叶斯方法要求各特征之间是独立的;朴素贝叶斯是有监督学习算法;朴素贝叶斯要求y的取值是离散的。
2.根据贝叶斯公式可以得到
在X=x条件下,求得每一个y取值的概率(后验概率),然后取其中最大的一个的值,作为X的预测值;
模型公式为
三.朴素贝叶斯原理:
假设模型损失函数选择0-1损失函数
期望风险函数如下
推导如下:
即选择后验概率最大的预测值,使得损失函数最小;
三.算法流程:
1.计算先验概率和条件概率:
这个应该是构建模型是完成
条件概率,应该是构造这样的一个数组:
x0 | x1 | x2 | |
y0 | dict | dict | |
y1 |
每个dict为{ value0:0.2, value1:0.8 }这样,同一列字典key一致;
2.给定实例X,计算
、
3.确定实例的类别:
四.三种常见的模型及编程实现
1 多项式模型
当特征是离散的时候,使用多项式模型。多项式模型在计算先验概率P(yk)P(yk)和条件概率P(xi|yk)P(xi|yk)时,会做一些平滑处理,具体公式为:
P(yk)=Nyk+αN+kα
N是总的样本个数,k是总的类别个数,NykNyk是类别为ykyk的样本个数,αα是平滑值。
P(xi|yk)=Nyk,xi+αNyk+nα
NykNyk是类别为yk的样本个数,n是特征的维数,Nyk,xi是类别为ykyk的样本中,第i维特征的值是xi的样本个数,α是平滑值。
当α=1时,称作Laplace平滑,当0<α<1时,称作Lidstone平滑,α=0时不做平滑。
如果不做平滑,当某一维特征的值xixi没在训练样本中出现过时,会导致P(xi|yk)=0P(xi|yk)=0,从而导致后验概率为0。加上平滑就可以克服这个问题。
python代码实现
import numpy as np
import pandas as pdclass MultinomialNB(object):def __init__(self,alpha=1.0,fit_prior=True,class_prior=None):self.alpha = alphaself.fit_prior = fit_prior self.class_prior = class_prior #先验self.classes = None #y值self.conditional_prob = None #条件概率def fit(self,X,y):self.classes = np.unique(y) if self.class_prior == None:class_num = len(self.classes)if not self.fit_prior:self.class_prior = [1.0/class_num for _ in range(class_num)] #uniform priorelse:self.class_prior = []sample_num = float(len(y))for c in self.classes:c_num = np.sum(np.equal(y,c))self.class_prior.append((c_num+self.alpha)/(sample_num+class_num*self.alpha))features = range(len(X.loc[0]))#calculate Conditional Probability: P( xj | y=ck )self.conditional_prob = pd.DataFrame(index=self.classes,columns=features) for i in features: #for each featurevalues = np.unique(X[i]) #特征的几个取值for c in self.classes: # for each classconditional_list = X[np.equal(y,c)][i] #当前x|y的listdict0 = {}for v in values: dict0[v] = ((np.sum(np.equal(conditional_list,v))+self.alpha)/(len(conditional_list)+len(values)*self.alpha)) self.conditional_prob.loc[c][i] = dict0return self#predict a single sample based on (class_prior,conditional_prob)def _predict_single_sample(self,x):label = -1max_posterior_prob = 0#for each category, calculate its posterior probability: class_prior * conditional_probfor c_index in range(len(self.classes)):current_class_prior = self.class_prior[self.classes[c_index]]current_conditional_prob = 1.0for feature_i in range(len(self.conditional_prob.loc[0])):dict0 = self.conditional_prob.loc[c_index][feature_i]current_conditional_prob *= dict0[x[feature_i]]#compare posterior probability and update max_posterior_prob, labelif current_class_prior * current_conditional_prob > max_posterior_prob:max_posterior_prob = current_class_prior * current_conditional_problabel = self.classes[c_index]return label#predict samples (also single sample) def predict(self,X):#TODO1:check and raise NoFitError #ToDO2:check Xif len(X[0]) == 1:return self._predict_single_sample(X)else:#classify each sample labels = []for i in range(X.shape[0]):label = self._predict_single_sample(X.loc[i])labels.append(label)return labelsdef score(self,X,Y):y_predict = self.predict(X)sum0 = 0for i in range(len(Y)):if Y[i] == y_predict[i]:sum0 += 1return sum0/len(Y)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
2 高斯模型
高斯模型假设每一维特征都服从高斯分布,且xi|yk也是服从高斯分布的;
现实生活中大部分连续性数据,都是服从高斯分布的;
计算方式:
P(xi|yk)=12πσ2yk,i√e−(xi−μyk,i)22σ2yk,iP(xi|yk)=12πσyk,i2e−(xi−μyk,i)22σyk,i2
μyk,i表示类别为yk的样本中,第i维特征的均值。
σ2yk,i表示类别为yk的样本中,第i维特征的方差。
分别计算xi|yk的均值和方差,保存到上面的条件概率dataFrame中,即可
代码和多项式差不多,故省略;
提问:x服从高斯分布,为什么x|y也是服从高斯分布呢?
3 伯努利模型
与多项式模型一样,伯努利模型适用于离散特征的情况,所不同的是,伯努利模型中每个特征的取值只能是1和0
条件概率P(xi|yk)P(xi|yk)的计算方式是:
当特征值xi为1时,P(xi|yk)=P(xi=1|yk);
当特征值xi为0时,P(xi|yk)=1−P(xi=1|yk);
BernoulliNB需要定义一个二值化的方法,该方法会接受一个阈值并将输入的特征二值化(1,0)
参考:
https://blog.csdn.net/fjssharpsword/article/details/72356277
<统计学习方法> 李航
http://blog.csdn.net/u012162613/article/details/48323777
朴素贝叶斯以及它的三个模型相关推荐
- NB朴素贝叶斯理论推导与三种常见模型
转自:http://www.tuicool.com/articles/zEJzIbR 朴素贝叶斯(Naive Bayes)是一种简单的分类算法,它的经典应用案例为人所熟知:文本分类(如垃圾邮件过滤). ...
- 朴素贝叶斯理论推导与三种常见模型
朴素贝叶斯(Naive Bayes)是一种简单的分类算法,它的经典应用案例为人所熟知:文本分类(如垃圾邮件过滤).很多教材都从这些案例出发,本文就不重复这些内容了,而把重点放在理论推导(其实很浅显,别 ...
- 大数据分析案例-基于朴素贝叶斯算法构建微博谣言检测模型
- [机器学习] 分类 --- Naive Bayes(朴素贝叶斯)
一.概率知识点复习 (1)条件概率 就是事件A在另外一个事件B已经发生条件下的发生概率.条件概率表示为P(A|B),读作"在B条件下A的概率". (2)联合概率 可以简单的理解为事 ...
- 机器学习算法总结--朴素贝叶斯
这次需要总结的是朴素贝叶斯算法,参考文章: <统计学习方法> 机器学习常见算法个人总结(面试用) 朴素贝叶斯理论推导与三种常见模型 朴素贝叶斯的三个常用模型:高斯.多项式.伯努利 简介 朴 ...
- python推荐系统算法朴素贝叶斯_机器学习经典算法之朴素贝叶斯分类
很多人都听说过贝叶斯原理,在哪听说过?基本上是在学概率统计的时候知道的.有些人可能会说,我记不住这些概率论的公式,没关系,我尽量用通俗易懂的语言进行讲解. 贝叶斯原理是英国数学家托马斯·贝叶斯提出的. ...
- 机器学习监督学习之分类算法---朴素贝叶斯代码实践
目录 1. 言论过滤器 1.1 项目描述 1.2 朴素贝叶斯 工作原理: 1.2.1 词条向量 1.3 开发流程: 1.4 代码实现 1.4.1 创建样本 1.4.2 构建词汇表,用于建立词集向量 1 ...
- 基于朴素贝叶斯分类器的西瓜数据集 2.0 预测分类_第十章:利用Python实现朴素贝叶斯模型
免责声明:本文是通过网络收集并结合自身学习等途径合法获取,仅作为学习交流使用,其版权归出版社或者原创作者所有,并不对涉及的版权问题负责.若原创作者或者出版社认为侵权,请联系及时联系,我将立即删除文章, ...
- 贝叶斯(朴素贝叶斯,正太贝叶斯)及OpenCV源码分析
一.原理 OpenCV实现的贝叶斯分类器不是我们所熟悉的朴素贝叶斯分类器(Naïve Bayes Classifier),而是正态贝叶斯分类器(Normal Bayes Classifier),两者虽 ...
最新文章
- SAP MM 采购报表中Delivery Date的显示
- Android中AES256加密的实现
- 推荐 19 个 github 超牛逼项目!
- linux端口对外开放
- html5 svg 拖拽,SVG拖动
- 关于 epoch、 iteration和batchsize的区别
- 我和大象的十年往事 - 感恩、感谢、加油、腾飞
- html css模仿实例,HTML+CSS模仿大学网站主页
- 自动化的NSX网络交付
- C语言SetConsoleCursorPosition()函数来定位光标位置
- 【C++】将(数组)数据写入csv文件
- 一个应届计算机毕业生的2012求职之路
- Tkinter登陆界面设计
- ERROR: 错误 1406。未能将值 写入项 \Software\Classes\CLSID\{4B75FA16-56AF-4DC4-941D-F84B279DDB15}\LocalServer3
- SAP供应商主数据中税号1-5的用途
- 快速傅里叶变换(FFT)和逆快速傅里叶变换(IFFT)
- 权限控制-Shiro
- 计算机组成原理——CPU功能结构 指令周期 数据通路 控制器 流水线
- Unity实现弹幕功能
- 人脸考勤机是如何工作的?人脸考勤机有哪些优缺点?
热门文章
- 小黄图升级了,接入更加强大的鉴黄功能
- 【JVM · GC】垃圾回收器
- python123判断火车票座位号分布图_面向回家编程!GitHub标星两万的Python抢票教程”,我们先帮你跑了一遍...
- java里面出生日期_java出生日期格式
- 微信公众平台开发培训
- python三原色组合白色_为何色光三原色三三相加得到白色,这其中加色原理是如何起作用的?...
- box-shadow单边
- 安装pyqt5时报错Preparing metadata (pyproject.toml) ... error
- twitter视频下载php,Twitter推特红心点赞H5动画按钮特效
- 未来5年可能必备的IT技术