一.先验概率和后验概率理解

先验:统计层次上的经验而知当下发生的概率;

后验:当下由因及果的概率;

举例:

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

朴素贝叶斯以及它的三个模型相关推荐

  1. NB朴素贝叶斯理论推导与三种常见模型

    转自:http://www.tuicool.com/articles/zEJzIbR 朴素贝叶斯(Naive Bayes)是一种简单的分类算法,它的经典应用案例为人所熟知:文本分类(如垃圾邮件过滤). ...

  2. 朴素贝叶斯理论推导与三种常见模型

    朴素贝叶斯(Naive Bayes)是一种简单的分类算法,它的经典应用案例为人所熟知:文本分类(如垃圾邮件过滤).很多教材都从这些案例出发,本文就不重复这些内容了,而把重点放在理论推导(其实很浅显,别 ...

  3. 大数据分析案例-基于朴素贝叶斯算法构建微博谣言检测模型

  4. [机器学习] 分类 --- Naive Bayes(朴素贝叶斯)

    一.概率知识点复习 (1)条件概率 就是事件A在另外一个事件B已经发生条件下的发生概率.条件概率表示为P(A|B),读作"在B条件下A的概率". (2)联合概率 可以简单的理解为事 ...

  5. 机器学习算法总结--朴素贝叶斯

    这次需要总结的是朴素贝叶斯算法,参考文章: <统计学习方法> 机器学习常见算法个人总结(面试用) 朴素贝叶斯理论推导与三种常见模型 朴素贝叶斯的三个常用模型:高斯.多项式.伯努利 简介 朴 ...

  6. python推荐系统算法朴素贝叶斯_机器学习经典算法之朴素贝叶斯分类

    很多人都听说过贝叶斯原理,在哪听说过?基本上是在学概率统计的时候知道的.有些人可能会说,我记不住这些概率论的公式,没关系,我尽量用通俗易懂的语言进行讲解. 贝叶斯原理是英国数学家托马斯·贝叶斯提出的. ...

  7. 机器学习监督学习之分类算法---朴素贝叶斯代码实践

    目录 1. 言论过滤器 1.1 项目描述 1.2 朴素贝叶斯 工作原理: 1.2.1 词条向量 1.3 开发流程: 1.4 代码实现 1.4.1 创建样本 1.4.2 构建词汇表,用于建立词集向量 1 ...

  8. 基于朴素贝叶斯分类器的西瓜数据集 2.0 预测分类_第十章:利用Python实现朴素贝叶斯模型

    免责声明:本文是通过网络收集并结合自身学习等途径合法获取,仅作为学习交流使用,其版权归出版社或者原创作者所有,并不对涉及的版权问题负责.若原创作者或者出版社认为侵权,请联系及时联系,我将立即删除文章, ...

  9. 贝叶斯(朴素贝叶斯,正太贝叶斯)及OpenCV源码分析

    一.原理 OpenCV实现的贝叶斯分类器不是我们所熟悉的朴素贝叶斯分类器(Naïve Bayes Classifier),而是正态贝叶斯分类器(Normal Bayes Classifier),两者虽 ...

最新文章

  1. SAP MM 采购报表中Delivery Date的显示
  2. Android中AES256加密的实现
  3. 推荐 19 个 github 超牛逼项目!
  4. linux端口对外开放
  5. html5 svg 拖拽,SVG拖动
  6. 关于 epoch、 iteration和batchsize的区别
  7. 我和大象的十年往事 - 感恩、感谢、加油、腾飞
  8. html css模仿实例,HTML+CSS模仿大学网站主页
  9. 自动化的NSX网络交付
  10. C语言SetConsoleCursorPosition()函数来定位光标位置
  11. 【C++】将(数组)数据写入csv文件
  12. 一个应届计算机毕业生的2012求职之路
  13. Tkinter登陆界面设计
  14. ERROR: 错误 1406。未能将值 写入项 \Software\Classes\CLSID\{4B75FA16-56AF-4DC4-941D-F84B279DDB15}\LocalServer3
  15. SAP供应商主数据中税号1-5的用途
  16. 快速傅里叶变换(FFT)和逆快速傅里叶变换(IFFT)
  17. 权限控制-Shiro
  18. 计算机组成原理——CPU功能结构 指令周期 数据通路 控制器 流水线
  19. Unity实现弹幕功能
  20. 人脸考勤机是如何工作的?人脸考勤机有哪些优缺点?

热门文章

  1. 小黄图升级了,接入更加强大的鉴黄功能
  2. 【JVM · GC】垃圾回收器
  3. python123判断火车票座位号分布图_面向回家编程!GitHub标星两万的Python抢票教程”,我们先帮你跑了一遍...
  4. java里面出生日期_java出生日期格式
  5. 微信公众平台开发培训
  6. python三原色组合白色_为何色光三原色三三相加得到白色,这其中加色原理是如何起作用的?...
  7. box-shadow单边
  8. 安装pyqt5时报错Preparing metadata (pyproject.toml) ... error
  9. twitter视频下载php,Twitter推特红心点赞H5动画按钮特效
  10. 未来5年可能必备的IT技术