统计学习方法之朴素贝叶斯1.概述2.基础知识3.基本方法4.参数估计5.简单实现
时间:2022-05-08
本文章向大家介绍统计学习方法之朴素贝叶斯1.概述2.基础知识3.基本方法4.参数估计5.简单实现,主要内容包括1.概述、2.基础知识、3.基本方法、4.参数估计、5.简单实现、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
1.概述
- 朴素贝叶斯分类是贝叶斯分类器的一种,贝叶斯分类算法是统计学的一种分类方法,利用概率统计知识进行分类,其分类原理就是利用贝叶斯公式根据某对象的先验概率计算出其后验概率(即该对象属于某一类的概率),然后选择具有最大后验概率的类作为该对象所属的类。
- 总的来说:当样本特征个数较多或者特征之间相关性较大时,朴素贝叶斯分类效率比不上决策树模型;当各特征相关性较小时,朴素贝叶斯分类性能最为良好。另外朴素贝叶斯的计算过程类条件概率等计算彼此是独立的,因此特别适于分布式计算。
- 朴素:特征条件独立 贝叶斯:基于贝叶斯定理
- 贝叶斯定理: P(A|B) = P(B|A) P(A) / P(B)
2.基础知识
条件概率是朴素贝叶斯模型的基础
- 概率(Probability)——0和1之间的一个数字,表示一个特定结果发生的可能性。比如投资硬币,“正面朝上”这个特定结果发生的可能性为0.5,这个0.5就是概率。换一种说法,计算样本数据中出现该结果次数的百分比。即你投一百次硬币,正面朝上的次数基本上是50次。
- 几率(Odds)——某一特定结果发生与不发生的概率比。如果你明天电梯上遇上你暗恋的女孩的概率是0.1,那么遇不上她的概率就是0.9,那么遇上暗恋女孩的几率就是1/9,几率的取值范围是0到无穷大。
- 似然(Likelihood)——两个相关的条件概率之比,即给定B发生的情况下,某一特定结果A发生的概率和给定B不发生的情况下A发生的概率之比。另一种表达方式是,给定B的情况下A发生的几率和A的整体几率之比。两个计算方式是等价的。
A事件与B事件同时发生的概率表示为P(A∩B)。 A不发生的概率为1-P(A),写为P(~A),即矩形中除了圆圈A以外的其他部分。 A或者B至少有一个发生的概率表示为P(A∪B),即圆圈A与圆圈B共同覆盖的区域。
3.基本方法
设输入空间是一个n维向量的集合,输出空间是类标记集合,输入为特征向量x,输出为类标记y,X是定义在输入空间的随机向量,Y是定义在输出空间的随机变量。P(X,Y)是X和Y的联合概率分布。 朴素贝叶斯法通过训练数据集学习联合概率分布。 具体的学习先验概率分布和条件概率分布。 先验概率分布:
条件概率分布:
朴素贝叶斯对条件概率分布做了条件独立性的假设,具体的:
条件独立假设等于是说用于分类的特征在类确定的条件下都是条件独立的。 朴素贝叶斯分类时,对给定的输入x,通过学习到的模型计算后验概率P(y=c|X=x),将后验概率最大的类作为x的类输出。 后验概率根据贝叶斯定理进行:
即
所以贝叶斯分类器可以表示为:
注意到,对于所有的ck,分母都是一样的,所以有:
4.参数估计
4.1极大似然估计
用极大似然估计相应的概率:P(Y),P(X|Y)
先验概率的极大似然估计
条件概率的极大似然估计
4.2贝叶斯估计
用极大似然估计可能会出现所要估计的概率值为0的情况,这会影响到后验概率的计算结果,使得分类偏差,解决这一问题的方法就是使用贝叶斯估计。
先验概率的贝叶斯估计
条件概率的贝叶斯估计
其中lamda>=0。等价于在随机变量各个取值的频数上赋予一个正数。lambda=0,就是极大似然估计;取lamda=1,称为拉普拉斯平滑( Laplace smoothing)。
5.简单实现
# -*- coding: utf-8 -*-
"""
Created on Sun Dec 10 17:33:38 2017
@author: jasonhaven
"""
import numpy as np
import operator
def createFeatureSpace(datas):
xvectors_len=len(datas[0])
xvectors_feature=[]
for i in range(xvectors_len):
xvectors_feature.append([])
for x in datas:
for i in range(xvectors_len):
if x[i] not in xvectors_feature[i]:
xvectors_feature[i].append(x[i])
return xvectors_feature
def trainNB(datas,labels,feature):
#计算先验概率
prior_probability=np.zeros(len(set(labels))) #初始化先验概率
positive_count = 0 #统计正类
negative_count = 0 #统计负类
labels_len=len(labels)
for i in range(labels_len):
if labels[i]==1:
positive_count+=1
else:
negative_count+=1
prior_probability[0] = positive_count / labels_len #求得正类的先验概率
prior_probability[1] = negative_count / labels_len #求得负类的先验概率
#计算条件概率
condition_probability={}
#print(condition_probability)
for i,x in enumerate(feature):
for j in range(len(x)):
for y in set(labels):
key=(x[j],y)
sigma_jy=0
sigma_y=0
for k in range(len(datas)):
if labels[k]==y:
sigma_y+=1
if datas[k][i]==x[j] and labels[k]==y:
sigma_jy+=1
condition_probability[key]=sigma_jy/sigma_y
return prior_probability,condition_probability
def classify(instance,labels,prior_probability,condition_probability,feature):
result=[]
for i,y in enumerate(set(labels)):
multi=prior_probability[i]
for xi in instance:
key=(xi,y)
p_xy=condition_probability.get(key)
multi*=p_xy
result.append({str(y):multi})
return result
def main():
datas=[[1, 'S'], [1, 'M'], [1, 'M'], [1, 'S'], [1, 'S'],
[2, 'S'], [2, 'M'], [2, 'M'], [2, 'L'], [2, 'L'],
[3, 'L'], [3, 'M'], [3, 'M'], [3, 'L'], [3, 'L']]
labels=[-1, -1, 1, 1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1]
#构造特征向量表
feature=createFeatureSpace(datas)
prior_probability,condition_probability=trainNB(datas,labels,feature)
instance=[2,'S']
result=classify(instance,labels,prior_probability,condition_probability,feature)
print(result)
if __name__ == '__main__':
main()
- 腾讯社区开放平台.NET SDK在Mono下运行
- Redis Web界面管理工具
- [信息安全] 3.HTTPS工作流程
- 初探css3
- QQ互联OAuth2.0 .NET SDK 发布以及网站QQ登陆示例代码
- 如何找出被黑客攻击后篡改的WordPress 文件?
- 移动设备HTML5页面布局
- Foundation:高级的响应式前端框架
- [信息安全] 2.密码工具箱(续)
- 脑科学发展的助推器
- BFIThumb:WordPress 中替代TimThumb 进行裁图的选择
- jquery 操作ajax 相关方法
- SQL SERVER 2008 Hierarchyid数据类型
- Html5 学习利器 Web Standards Update for Microsoft Visual Studio 2010 SP1
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Webpack5 跨应用代码共享 - Module Federation
- 【Rust日报】2020-09-16 - Rust 2021 规划
- 精讲响应式WebClient第3篇-POST、DELETE、PUT方法使用
- C++的黑魔法: 用四种方式实现add!
- 精讲响应式WebClient第2篇-GET请求阻塞与非阻塞调用方法详解
- 算法篇:位运算异或的使用(一)
- 精讲响应式webclient第1篇-响应式非阻塞IO与基础用法
- k8s 二进制集群平滑升级 1.15.2升级至1.16.4
- 使用Java API进行tar.gz文件及文件夹压缩解压缩
- 动画 | 一文掌握 Flex 布局
- 精讲响应式WebClient第6篇-请求失败自动重试机制
- 算法篇:位运算基本操作
- Vue 项目中各种痛点问题及方案
- 算法篇:位运算进阶(二)
- 算法篇:摩尔投票法的使用