当前位置: 首页 > 编程日记 > 正文

统计学习方法:朴素贝叶斯

作者:桂。

时间:2017-04-20  18:31:37

链接:http://www.cnblogs.com/xingshansi/p/6740308.html 


前言

本文为《统计学习方法》第四章:朴素贝叶斯(naive bayes),主要是借助先验知识+统计估计,本文主要论述其分类的思路。全文包括:

1)模型描述

2)算法求解

3)理论应用

内容为自己的学习记录,其中参考他人的地方,最后一并给出链接。

一、模型描述

  A-理论框架

日常生活中,总会这么表达:“我觉得吧....”,“以我的经验来看,.....”,虽然有时候不靠谱,但它至少说明了一个认知上的问题:历史经验(数据)是有价值的。比如这样一个场景:

在我观念里,不同地区的人是这样的:

欧美人:鼻子-高,眼睛-蓝,表情-爱笑,饮食-喜欢西餐。

亚洲人:鼻子-低,眼睛-棕,表情-严肃,饮食-喜欢烧烤。

今天我在电视上又看到一个人:鼻子高高的,眼睛棕色的,表情是严肃的,我觉得吧...她可能是亚洲人

可这里边的理论依据是什么呢?

对于训练数据集:

其中为输入的特征向量,为对应的类别。通过数据集可以获取一些先验知识(通常由统计得到):

例如,类别信息:人群中亚洲人、欧美人的比例:

以及对应的条件概率,不同类别的特征信息:如欧美人中,高鼻子、爱笑、喜欢西餐....的概率:

但这样的组合数太多了,给比如N个样本,每个10个特征,就是N10种可能(有点大),而且另一方面,欧美人鼻子高不高,与他喜不喜欢西餐、爱不爱笑,很可能是相互独立的,所以Bayes作了一个比较强的假设——条件分布独立性假设

这个时候的计算量为10*N,小了很多,而且条件概率也更容易借助统计得出。借助已有信息得出的类别信息、不同类别的特征信息,就是我们的经验。

回到开始的问题:来了一个人,鼻子高高的,眼睛棕色的,表情是严肃的,这是哪里人呢?朴素贝叶斯不像昨天说的最近邻KNN(KNN的观点:不是亚洲人就是欧美人),朴素贝叶斯的说法是:这个人更可能是**人,这个可能就是概率,对应就是贝叶斯概率估计:

上面的公式直观理解就是:在给定特征下,Y不同类别的概率,特征不就是鼻子、微笑、饮食这些么,是已知的,Y对应类别,也就是欧美/亚洲人,这就完成了依靠经验的判断

观察到上面的公式可以进一步简化:

由于分母都是不变的,求解问题进一步变为:

求解概率最大的类别,就是最终结果,至此完成了朴素贝叶斯的分类问题。

  B-概率最大化与误差最小化的等价性

对于0-1风险函数:

其中是分类决策函数,可以得出:

这与朴素贝叶斯原始问题是一致的,即概率最大化(贝叶斯估计)与误差(0-1风险函数)最小化具有等价性。

  C-参数估计

这个其实上文已经提到了,就是利用已有的训练数据进行统计,得到的频率估计就当作概率估计,对应也可通过最大似然估计得出,直接给出公式(类别信息):

以及条件概率(不同类别下的特征信息):

其中是第i个样本第j个特征,是第j个特征可能取的第l个值,I为指示函数。

至此完成了参数估计。

  D-参数修正

再回顾朴素贝叶斯的准则函数:

表达式有概率的连乘,一个小的数*一个大的数,结果可能大、可能小,但0*一个大的数=0,这样一巴掌拍死是不合适的,因此希望对估计的参数修正一下,用的是additive smoothing方法,直接给出wikipedia的内容:

对应上面的最大似然估计,参数修正为:

类别信息

不同类别的特征信息

容易验证,它们仍然是一种概率存在,至此完成参数修正(不是唯一修正方法哦~)。

二、算法求解

  A-算法步骤

直接给出算法步骤:

  B-算法步骤细说

书中给出了两个例子:参数未修正参数修正,两种场景的估计,都是三步走,一样的套路。

问题描述:

参数未修正

第一步:类别信息

第二步:不同类别的特征信息

第三步:不同类别概率估计

参数修正:这里

第一步:类别信息

第二步:不同类别的特征信息

第三步:不同类别概率估计

三、理论应用

介绍一个简单的小应用:恶意留言过滤。

原始数据集:

首先载入数据集,数据集一般爬取并切割分词得到:

from numpy import *def loadDataSet():postingList=[['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'],['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'],['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'],['stop', 'posting', 'stupid', 'worthless', 'garbage'],['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'],['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']]classVec = [0,1,0,1,0,1]    #1 is abusive, 0 notreturn postingList,classVec

这里类别为两类,1-恶意留言;0-非恶意留言。

因为是通过关键词判断,因此进一步简化数据集:利用 | 以及 set 将数据集重复部分删除,构建vocabulary list:

def createVocabList(dataSet):vocabSet = set([])  #create empty setfor document in dataSet:vocabSet = vocabSet | set(document) #union of the two setsreturn list(vocabSet)

有了数据集,还是文本信息,需要将其转换成数字信息,这样才可以进行统计。

def setOfWords2Vec(vocabList, inputSet):returnVec = [0]*len(vocabList)for word in inputSet:if word in vocabList:returnVec[vocabList.index(word)] = 1else: print "the word: %s is not in my Vocabulary!" % wordreturn returnVec

三步走就可以走两步了第一步:计算类别信息,第二步:计算不同类别的特征信息。在计算之前,有两点小trick:

  • If any of these numbers are 0, then when we multiply them together we get 0. To lessen the impact of this, we’ll initialize all of our occurrence counts to 1, and we’ll initialize the denominators to 2. 因为在set 和 | 操作中,不免删除了一些单词,导致一些概率为0,这是不希望看到的,考虑到是两类,初始时 各类进行1次累加,总的进行2次累加;

  • 为了防止数值溢出,采用Log(.)变换;即:

前两步走对应的code:

def trainNB0(trainMatrix,trainCategory):numTrainDocs = len(trainMatrix)numWords = len(trainMatrix[0])pAbusive = sum(trainCategory)/float(numTrainDocs)p0Num = ones(numWords); p1Num = ones(numWords)      #change to ones() p0Denom = 2.0; p1Denom = 2.0                        #change to 2.0for i in range(numTrainDocs):if trainCategory[i] == 1:p1Num += trainMatrix[i]p1Denom += sum(trainMatrix[i])else:p0Num += trainMatrix[i]p0Denom += sum(trainMatrix[i])p1Vect = log(p1Num/p1Denom)          #change to log()p0Vect = log(p0Num/p0Denom)          #change to log()return p0Vect,p1Vect,pAbusive

对应调用上面的函数就是:

import bayes
listOPosts,listClasses = bayes.loadDataSet()
myVocabList = bayes.createVocabList(listOPosts)
trainMat=[]
for postinDoc in listOPosts:trainMat.append(bayes.setOfWords2Vec(myVocabList, postinDoc))p0V,p1V,pAb=bayes.trainNB0(trainMat,listClasses) #Step1 Step2

测试数据集:

同样首先对文本预处理,与训练数据处理类似,文本转换为数字:

testEntry = ['stupid', 'garbage']
thisDoc = array(bayes.setOfWords2Vec(myVocabList, testEntry))

预处理完之后,下面就是第三步了:利用测试数据的特征,进行类别概率的计算

def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):p1 = sum(vec2Classify * p1Vec) + log(pClass1)    #element-wise multp0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1)if p1 > p0:return 1else: return 0

哪家概率大,就判给哪个类别。对应测试code:

print testEntry,'classified as: ',bayes.classifyNB(thisDoc,p0V,p1V,pAb)

测试结果为:1,即恶意留言,stupid/garbage 这与实际也是相符的。

参考:

  • additive smoothing:https://en.wikipedia.org/wiki/Additive_smoothing
  • Peter.《machine learning in action》
  • 李航《统计学习方法》

转载于:https://www.cnblogs.com/xingshansi/p/6740308.html

相关文章:

Windows自动启动程序的十大藏身之所(转载)

Windows自动启动程序的十大藏身之所 Windows启动时通常会有一大堆程序自动启动。不要以为管好了“开始→程序→启动”菜单就万事大吉,实际上,在Windows XP/2K中,让Windows自动启动程序的办法很多,下文告诉你最重要的两个文件夹和八…

警惕!银行风控模型或将“摇身一变”,成为风险缔造者

作者 | 祝世虎来源 | 现代金融风险管理头图 | CSDN下载自视觉中国2011年,美联储发布了《模型风险管理监督指南(SR11-7)》(《SRLetter 11-7: Supervisory Guidance on Model Risk Management》),该指南逐步成…

Spring注解注入

spring注入方式-----注解注入(1)操作:首先在要注入的类前面加上:Component(与后面三个是等价的)Repository(持久层),Service业务层,Controller和控制层应为不能自动识别某个类是否是持久层,业务…

zip 的压缩原理与实现

http://www.blueidea.com/bbs/newsdetail.asp?id1819267&page2&posts&Daysprune5&lp1无损数据压缩是一件奇妙的事情,想一想,一串任意的数据能够根据一定的规则转换成只有原来 1/2 - 1/5 长度的数据,并且能够按照相应的规则还…

上海交大发布 MedMNIST 医学图像分析数据集 新基准

来源 | HyperAI超神经责编 | 晋兆雨头图 | 付费下载于视觉中国内容概要:医学图像分析是一个非常复杂的跨学科领域,近日上海交通大学发布了 MedMNIST 数据集,有望促进医学图像分析的发展。关键词:医学图像分析 公开数据集令人头秃…

VS 2010中对WPF4有哪些多点触摸支持?

随着多点触摸输入和操作处理支持的引进, WPF 4提供了一个极棒的方式,可在Windows 7中使你的客户端应用大放光彩,新的特性包括:UIElement上的多点触摸操作、惯性(漫游(Pan)、缩放(Zoo…

业务组件架构的思考

在iOS开发中,我们接触比较多的是MVC架构,下面我们先来分析一下MVC架构。 1.MVC MVC是一种软件架构模式,在1978年由Trygve Reenskaug提出,它把软件系统分为三个基本部分:模型(Model)、视图&#…

强化学习:10种真实的奖励与惩罚应用

作者 | Patrycja翻译 | Katie,责编 | 晋兆雨出品 | AI科技大本营头图 | 付费下载于视觉中国在强化学习(Reinforcement Learning)中,对代理进行奖励和惩罚机制的培训。代理的正确行为会得到奖励,而错误的行为会受到惩罚…

PHP feof() 函数读文件的使用

(PHP 4, PHP 5) feof — 测试文件指针是否到了文件结束的位置 如果服务器没有关闭由 fsockopen() 所打开的连接,feof() 会一直等待直到超时而返回TRUE。默认的超时限制是 60 秒,可以使用 stream_set_timeout() 来改变这个值。 文件指针必须是有效的&a…

批处理解决“易语言难题”

为什么80%的码农都做不了架构师?>>> 发现还没有Win批处理的,也就是DOS,我来凑个热闹,哈哈~ maxos 汇总贴 APPLEUFO 原题链接 不罗嗦,上代码啦: echo off set c_title批处理…

\r与\n有何差别,编码的时候应该怎样使用

差别: \r: 全称:carriage return (carriage是“字车”的意思。打印机上的一个部件)简称:return缩写:rASCII码:13作用:把光标移动到当前行的最左边\n: 全称:new line别名…

深度学习中的注意力机制(一)

作者 | 蘑菇先生来源 | NewBeeNLP头图 | CSDN下载自视觉中国目前深度学习中热点之一就是注意力机制(Attention Mechanisms)。Attention源于人类视觉系统,当人类观察外界事物的时候,一般不会把事物当成一个整体去看,往往…

Hibernate 异常org.hibernate.LazyInitializationException: could not initialize prox

Hibernate的Lazy初始化1:n关系时,必须保证是在同一个Session内部使用这个关系集合,不然Hiernate将抛出异常。 两种处理方法: 一、这是延时加载的问题,把有关联的所有pojo类,在hibernate.cfg.xml文件中。一般在many-to-…

XHTML基础问答

作者:阿捷 2004-6-26 1:43:36本文是2002年为硅谷动力网站翻译的稿件。当时xhtml1.0刚刚开始被设计师所接触,所以有下面这个基础问答。 HTML语言是我们建立网页的工具,从它出现发展到现在,规范不断完善,功能越来越强。…

958毕业,苦学Java,竟被二本毕业生吊打!网友:确实厉害!

最近收到一位中型公司 HR 的反馈,她说,我推荐的一个普通本二毕业生在校招面试中表现非凡,当时两个人争抢一个名额,他竟然完胜另一位 985 毕业生。普通本二毕业生对公司的技术提问对答如流,曾在小公司实习,做…

css布局中的居中问题

css布局中的居中问题 作者:阿捷 2004-7-5 14:35:49#sample{HEIGHT:240px;WIDTH:400px;BACKGROUND: url(http://www.w3cn.org/style/001/logo_w3cn_194x79.gif) #CCC no-repeat center;} 如何使DIV居中 主要的样式定义如下: body {TEXT-ALIGN: center;…

领域驱动设计_软件核心复杂性应对之道

领域驱动设计_软件核心复杂性应对之道转载于:https://www.cnblogs.com/MarvinGeng/archive/2013/02/21/2920968.html

谈谈Boost网络编程(2)—— 新系统的设计

写文章之前。我们一般会想要採用何种方式,是“开门见山”,还是”疑问式开头“。写代码也有些类似。在编码之前我们须要考虑系统总体方案,这也就是各种设计文档的作用。在设计新系统之初,我基本的目的是:保证高效率&…

64岁Python之父退休失败,正式加入微软搞开源

来源 | CSDN今天,64岁的Python 之父 Guido van Rossum 在 Twitter 上正式宣布,退休太无聊,如今加入了微软开发者部门。Guido van Rossum 去年宣布退出 Python 核心决策层事实上,近几年来,随着人工智能的飞速发展&#…

Java实现HTTP文件下载(转)

文章出自: http://www.360doc.com/content/12/1218/17/2718300_254818081.shtml 本人用这种方法解决了工作中遇到的问题,再次谢谢文章的作者. 序言 许多用户可能会遇到这样的情况:在网站上发现一个很好的资源,但是这个资源是分成了很多个文件存放的&…

初学web标准的几个误区

初学web标准的几个误区作者:阿捷 2004-7-7 11:37:11非常高兴地看到很多设计师开始关注和尝试使用web标准制作网页。但从网友们的问题和制作中发现几个问题,在这里特别提醒一下: 1.不是为了通过校验才标准化。 web标准的本意是实现内容(结构…

nginx系列:nginx反向缓存代理详解

小生博客:http://xsboke.blog.51cto.com如果有疑问,请点击此处,然后发表评论交流,作者会及时回复。-------谢谢您的参考,如有疑问,欢迎交流一、 代理和nginx相关概念1. 代理类型正向代理:代理局域网对internet的连接请求反向代理&…

编辑PDF文档,Word 2013可以是您的选择

题外话:记得刚进公司的时候,几乎所有的培训文档都是PDF、标准文档,公司使用的软件是Adobe Acrobat 5.0(不知道多少钱,呵呵),软件当然是购买正版的;去年,公司购买了新版本…

中国人工智能学会2020年度优秀科技成果出炉,百度文心ERNIE入选

11月14日,由中国人工智能学会(CAAI)主办的2020第十届中国智能产业高峰论坛(CIIS 2020)正式开幕,CAAI理事长戴琼海院士、何积丰院士、何友院士、王恩东院士、陆军院士等多位中外院士、专家齐聚嘉兴南湖&…

web标准,我们去向何方?一些想法...

web标准,我们去向何方?一些想法...作者:阿捷 2004-7-5 0:52:42原文作者:Veerle 原文出处:veerle.duoh.com 原文发表时间:2004年6月14日 译者注:本文是"你应该关注web标准的真正原因"…

事件源ES的优势

多年来,开发人员实现持久性使用传统的创建、读取、更新、删除(CRUD)模式。正如前面介绍的,如果采购模型实现持久性存储状态更改为历史事件捕获业务活动发生之前写的数据存储。这将事件存储机制,允许他们被聚合,或者放在一个组与逻辑边界。事件采购的模式之一,使并发、分布式系统…

你应该关注web标准的真正原因

你应该关注web标准的真正原因作者:阿捷 2004-7-4 2:28:39原文作者:Andrei Herasimchuk 原文出处:designbyfire.com 原文发表时间:2004年6月11日 译者前言:这是一篇让人震惊的文章。作者的分析深刻,文笔犀…

为什么我们需要开源的系统芯片?

作者 | bunnie译者 | 弯月,编辑 | 杨碧玉来源 | CSDN(ID:CSDNnews)现代的小型电子产品往往基于某个高度集成的芯片构建,这种芯片称为“系统芯片”(System on aChip,缩写:SoC&#xf…

InnoDB和MyISAM区别

MySQL作为当前最为流行的免费数据库服务引擎,已经风靡了很长一段时间,不过也许也有人对于MySQL的内部环境不很了解,尤其那些针对并发性处理的机制。今天,我们先了解一下MySQL中数据表的分类,以及它们的一些简单性质。 …

图书管理系统5W1H

Who 图书管理员 When 图书管理员在图书馆借阅期间管理用户的借书还书,非借阅时间管理后台图书、管理用户信息 Where 借书台、办公室 What 一个图书管理系统,能实现图书的借书还书操作、管理后台图书信息、管理用户信息 Why 能够方便快捷的实现图…