文章目录

  • 朴素贝叶斯法概述
    • 1. 定理及公式推导
      • 1.1 定理:
      • 1.2 朴素贝叶斯
      • 1.3 条件独立的假设是:
      • 1.4 先验概率后验概率
      • 1.5 极大似然估计
    • 2. python实现

朴素贝叶斯法概述

朴素贝叶斯(naive Bayes)法是基于贝叶斯定理与特征条件独立假设的分类方法。

1. 定理及公式推导

1.1 定理:

设试验E的样本空间为 Ω \Omega Ω,A为事件 B 1 , B 2 , . . . , B i B_{1},B_{2},...,B_{i} B1​,B2​,...,Bi​.为 Ω \Omega Ω的一个划分,且 P ( A ) , P ( B i ) > 0 P(A),P(B_{i})>0 P(A),P(Bi​)>0,则
P ( B i ∣ A ) = P ( A ∣ B i ) P ( B i ) ∑ j = 1 n P ( A ∣ B j ) P ( B j ) ⋯ i = 1 , 2 , … , n P\left(B_{\mathrm{i}} \mid A\right)=\frac{P\left(A \mid B_{i}\right) P\left(B_{i}\right)}{\sum_{j=1}^{n} P\left(A \mid B_{j}\right) P\left(B_{j}\right)} \cdots i=1,2, \ldots, n P(Bi​∣A)=∑j=1n​P(A∣Bj​)P(Bj​)P(A∣Bi​)P(Bi​)​⋯i=1,2,…,n

1.2 朴素贝叶斯

其朴素的含义是:对条件概率分布作了条件独立的假设,用于分类的特征,在类确定的情况下都会条件独立的。

1.3 条件独立的假设是:

P ( X = x ∣ Y = c k ) = P ( X ( 1 ) = x ( 1 ) , … , X ( n ) = x ( n ) ∣ Y = c k ) = ∏ j = 1 n P ( X ( j ) = x ( j ) ∣ Y = c k ) P\left(X=x \mid Y=c_{k}\right)=P\left(X^{(1)}=x^{(1)}, \ldots, X^{(n)}=x^{(n)} \mid Y=c_{k}\right)=\prod_{j=1}^{n} P\left(X^{(j)}=x^{(j)} \mid Y=c_{k}\right) P(X=x∣Y=ck​)=P(X(1)=x(1),…,X(n)=x(n)∣Y=ck​)=j=1∏n​P(X(j)=x(j)∣Y=ck​)
朴素贝叶斯法分类时,对给定的输入 x x x,通过学习到的模型计算后验概率分布 P ( Y = c k ∣ X = x ) P\left(Y=c_{k} \mid X=x\right) P(Y=ck​∣X=x),将后验概率最大的类作为 x x x的类输出。

1.4 先验概率后验概率

所谓后验概率,即根据结果推原因,以课堂上是否打网球例子来说,在知道某人没有去打网球的情况,推算今天的风是weak的概率。
先验概率,即根据原因推结果,还是以打网球为例,在知道今天的风是strong,推算某人去打网球的概率。
贝叶斯算法,学习意味着估计 P ( Y = c k ) P(Y=c_{k} ) P(Y=ck​)和 P ( X ( j ) = x ( j ) ∣ Y = c k ) P\left(X^{(j)}=x^{(j)} \mid Y=c_{k}\right) P(X(j)=x(j)∣Y=ck​)。

1.5 极大似然估计

先验概率的极大似然估计:
P ( Y = c k ) = ∑ i = 1 N I ( y i = c k ) N ⋯ k = 1 , 2 , … , K P\left(Y=c_{k}\right)=\frac{\sum_{i=1}^{N} I\left(y_{i}=c_{k}\right)}{N} \cdots k=1,2, \ldots, K P(Y=ck​)=N∑i=1N​I(yi​=ck​)​⋯k=1,2,…,K
条件概率的极大似然估计:
P ( X ( j ) = a j l ∣ Y = c k ) = ∑ i = 1 N I ( x ( j ) = a j l , y i = c k ) ∑ i = 1 N I ( y i = c k ) P\left(X^{(j)}=a_{j l} \mid Y=c_{k}\right)=\frac{\sum_{i=1}^{N} I\left(x^{(j)}=a_{j l}, y_{i}=c_{k}\right)}{\sum_{i=1}^{N} I\left(y_{i}=c_{k}\right)} P(X(j)=ajl​∣Y=ck​)=∑i=1N​I(yi​=ck​)∑i=1N​I(x(j)=ajl​,yi​=ck​)​
j = 1 , 2 , … , n ; ⋅ l = 1 , 2 , … , S j ⋯ ; k = 1 , 2 , … , K j=1,2, \ldots, n ; \cdot l=1,2, \ldots, S_{j} \cdots ; k=1,2, \ldots, K j=1,2,…,n;⋅l=1,2,…,Sj​⋯;k=1,2,…,K
其中 x ( j ) x^{(j)} x(j)是第 j j j个样本的第个特征; a j l a_{jl} ajl​是第 j j j个特征可能取的第 l l l个值; I I I为指示函数。
在实际训练中,会出现训练集实例少,分类类别较多,可能会出现类别中没有训练集实例的情况,这时候,用极大似然估计可能会出现所要估计的概率值为0的情况,这时,会影响到后验概率的计算,使分类产生偏差。通常采用贝叶斯估计:
P λ ( X ( j ) = a j l ∣ Y = c k ) = ∑ i = 1 N I ( x ( j ) = a j l , y i = c k ) + λ ∑ i = 1 N I ( y i = c k ) + S j λ ⋅ , 其中  λ ≥ 0 P_{\lambda}\left(X^{(j)}=a_{j l} \mid Y=c_{k}\right)=\frac{\sum_{i=1}^{N} I\left(x^{(j)}=a_{j l}, y_{i}=c_{k}\right)+\lambda}{\sum_{i=1}^{N} I\left(y_{i}=c_{k}\right)+S_{j} \lambda} \cdot \text {, 其中 } \lambda \geq 0 Pλ​(X(j)=ajl​∣Y=ck​)=∑i=1N​I(yi​=ck​)+Sj​λ∑i=1N​I(x(j)=ajl​,yi​=ck​)+λ​⋅, 其中 λ≥0

朴素贝叶斯法高效易于实现,但存在着条件独立这个很强的假设,在实际的样本中往往不成立,实际数据样本特别是样本数量多且样本属性之间关联较强时,朴素贝叶斯法的分类效果不好。

2. python实现

程序代码:环境python3.7

import numpy as np
from collections import Counter
data=[[1,'S',-1],[1,'M',-1],[1,'M',1],[1,'S',1],[1,'S',-1],[2,'S',-1],[2,'M',-1],[2,'M',1],[2,'L',1],[2,'L',1],[3,'L',1],[3,'L',1],[3,'M',1],[3,'M',1],[3,'L',-1]]
data_new=np.array(data)
x=[]
count_x=[]
x_num=[]
x_elem=[]
lam=1
for i in range(len(data_new[0,:])-1):x.append(data_new[:,i])count_x.append(Counter(x[i]))x_num.append(len(count_x[i]))#对应特征可能取值数[3,3]x_elem.append(list(count_x[i]))#特征中的元素[['1', '2', '3'], ['S', 'M', 'L']]
y=data_new[:,-1]
count_y=Counter(y) #标签元素及对应的个数 Counter({'1': 9, '-1': 6})
y_num=len(count_y) #y的类别数  2
y_elem=list(count_y)#标签中的元素[-1,1]
p_y=[]
p_x_y=[]
for i in range(y_num):p_y.append((count_y[y_elem[i]]+lam)/(len(y)+y_num*lam))print('此时先验概率P(Y={})={}'.format(y_elem[i],p_y[i]))for i in range(len(x)):p_xi_j=[]for j in range(x_num[i]):p_xj_y=[]for k in range(y_num):x_val = np.where(x[i] == x_elem[i][j])[0] #np.where(condiction )输出满足条件的元素坐标y_val = np.where(y == y_elem[k])[0]intersect_x_y = list(set(y_val).intersection(set(x_val))) #set创建一个无序不重复的元素集 y-val与x_val的交集p_temp = (len(intersect_x_y)+lam) /( count_y[y_elem[k]]+x_num[i]*lam) #条件概率print('条件概率P(X{}={}|Y={})={}'.format(i+1,x_elem[i][j],y_elem[k],p_temp))p_xj_y.append(p_temp)p_xi_j.append(p_xj_y)p_x_y.append(p_xi_j)data_pred=[2,'S']
def predict(data_pred,p_x_y,p_y,x_elem,y_elem):x_num=len(p_x_y)x=[]x_index=[]x_elem=np.array(x_elem)for i in range(x_num):x.append(str(data_pred[i]))x_index.append(np.where(x_elem[i]==x[i])[0])p_y_pred=[]p_y_max=0index=1000for i in range(len(p_y)):p=p_y[i]for j in range(x_num):p*=p_x_y[j][x_index[j][0]][i]p_y_pred.append(p)print('y={}的概率为:{}'.format(y_elem[i],p))if p>p_y_max:p_y_max=pindex=ireturn index
index=predict(data_pred,p_x_y,p_y,x_elem,y_elem)
print('此时测试集数据所属类别为:',y_elem[index])

运行结果

朴素贝叶斯法及python实现相关推荐

  1. python朴素贝叶斯分布对数据的要求_统计学习方法与Python实现(三)——朴素贝叶斯法...

    统计学习方法与Python实现(三)--朴素贝叶斯法 1.定义 朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法. 对于给定的训练数据集,首先基于特征条件独立假设学习输入输出的联合概率分布.然 ...

  2. 朴素贝叶斯法的参数估计——贝叶斯估计及其Python实现

    统计学习方法--朴素贝叶斯法原理 1. 贝叶斯估计 1.1 为什么要用贝叶斯估计(极大似然的缺点) 1.2 贝叶斯估计原理 贝叶斯估计的算法过程合极大似然估计的算法过程一模一样,代码也几乎一模一样,只 ...

  3. 朴素贝叶斯法分类器的Python3 实现

    本篇文章是我在读了李航的<统计学习方法>后手写的算法实现之一 原理请参考统计学习方法第四章朴素贝叶斯法-李航 代码如下: # - * - coding: utf - 8 -*- # # 作 ...

  4. 朴素贝叶斯法(Naive Bayes,NB)

    文章目录 1. 朴素贝叶斯法的学习与分类 1.1 基本方法 2. 参数估计 2.1 极大似然估计 2.2 学习与分类算法 2.2.1 例题 2.2.2 例题代码 2.3 贝叶斯估计(平滑) 2.3.1 ...

  5. 朴素贝叶斯法 - 垃圾邮件分类

    本文基于朴素贝叶斯构建一个分类垃圾邮件的模型,研究对象是英文的垃圾邮件. 邮件内容保存在txt文件中,其中分为训练样本train和测试样本test. 在训练样本中正常邮件命名为:pos:垃圾邮件命名为 ...

  6. 线性分类(五)-- 朴素贝叶斯法

    贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类.贝叶斯分类法是统计学分类方法,它可以预测类隶属关系的概率,如一个给定元组属于一个特定类的概率.而朴素贝叶斯分类是贝叶斯 ...

  7. 朴素贝叶斯python代码_朴素贝叶斯模型及python实现

    1 朴素贝叶斯模型 朴素贝叶斯法是基于贝叶斯定理.特征条件独立假设的分类方法.在预测时,对输入x,找出对应后验概率最大的 y 作为预测. NB模型: 输入: 先验概率分布:P(Y=ck),k=1,2, ...

  8. 朴素贝叶斯法(二)——基本方法

    朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法 基本方法 总论 朴素贝叶斯法是典型的生成学习方法.生成方法由训练数据学习联合概率分布P(X,Y),然后得到后验概率P(Y|X).即: 一)利用 ...

  9. 统计学习方法笔记(三)-朴素贝叶斯原理及python实现

    朴素贝叶斯 条件概率 特征条件独立假设 朴素贝叶分类器 朴素贝叶斯分类算法原理 学习与分类算法 朴素贝叶斯算法原理 模型 多项式模型 高斯模型 伯努利模型 多项式模型的朴素贝叶斯分类器实现代码 高斯模 ...

最新文章

  1. Python - 移除List中重复项的五种常用方法
  2. stl的nth_element
  3. linux stdin shell,关于shell:如何在Alpine Linux中修复“因为stdin不是终端而不会分配伪终端”?...
  4. 【Java】利用for循环打印心型
  5. go 写文件_GO 文档笔记
  6. SAP License:GL显示行项目
  7. sql XML处理,sp_xml_preparedocument,openxml
  8. 禁止选择,右键菜单,拷贝,拖拽
  9. 中国输配电设备产业需求形势及运行战略规划建议报告2021年版
  10. java短信_java发送短信的实现步骤
  11. Maya2011下载 (破解正式版)
  12. 一路向往有光亮的地方-2015年终总结
  13. linux获取本机ip地址函数,Linux编程获取本机IP地址
  14. 给UI/UX设计师推荐5个国外网站
  15. 安卓iccid_普通人也可以做码农?安卓手机上这些代码你也可以用
  16. 内部总线(双向数据总线)
  17. java 连接不上数据库
  18. CRT的快捷键 不会的快....
  19. Java定时任务手工触发-使用Arthas
  20. 无人值守称重解决方案自动称重应用方法

热门文章

  1. AbpVnext 微服务 内部网关服务通讯 动态API客户端
  2. python爬虫爬取东方财富网股票走势+一些信息
  3. FileReader的使用方法
  4. 尾部相关性尾部风险价圣分
  5. 2022/1/23(每周总结)
  6. IEEE754标准: 浮点数在内存中的存储方式
  7. python 字典的学习
  8. 怎样学习人工智能呢?
  9. css vue 内联_vue 内联样式style中的background
  10. 转型编程的小伙们们快来拿 python 入门证书!