作者:桂。

时间: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

统计学习方法:朴素贝叶斯相关推荐

  1. 统计学习方法|朴素贝叶斯原理剖析及实现

    欢迎直接到我的博客查看最近文章:www.pkudodo.com.更新会比较快,评论回复我也能比较快看见,排版也会更好一点. 原始blog链接: http://www.pkudodo.com/2018/ ...

  2. matlab贝叶斯判别后验概率,统计学习方法——朴素贝叶斯法、先验概率、后验概率(示例代码)...

    朴素贝叶斯法,就是使用贝叶斯公式的学习方法,朴素就是它假设输入变量(向量)的各个分量之间是相互独立的.所以对于分量之间不独立的分布,如果使用它学习和预测效果就不会很好. 简化策略 它是目标是通过训练数 ...

  3. 统计学习方法——朴素贝叶斯

    0.写在前面 朴素贝叶斯实际上是非常简单的一种机器学习方法,我们在之前的很多地方都讲过了,所以这里我们不再阐述具体的原理,可以移步:朴素贝叶斯. 但是,对于讨论班里,争论最多的就是课后的2个习题,因此 ...

  4. 李航统计学习方法-朴素贝叶斯

    朴素贝叶斯法 朴素贝叶斯(naïve Bayes)法是基于贝叶斯定理与特征条件独立假设的分类方法[1]. 对于给定的训练数据集,首先基于特征条件独立假设学习输入/输出的联合概率分布:然 后基于此模型, ...

  5. 复习04统计学习方法(朴素贝叶斯算法Naive Bayes)---图片版

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

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

  7. matlab 朴素贝叶斯模型 代码及其案例

    简介 朴素贝叶斯分类器(Naive Bayes Classifier 或 NBC)发源于古典数学理论,有着坚实的数学基础,以及稳定的分类效率.同时,NBC模型所需估计的参数很少,对缺失数据不太敏感,算 ...

  8. 【统计学习方法】朴素贝叶斯对鸢尾花(iris)数据集进行训练预测

    本文摘要 · 理论来源:[统计学习方法]第三四章 朴素贝叶斯 · 技术支持:pandas(读csv).numpy.sklearn.naive_bayes.GaussianNB(高斯朴素贝叶斯模型).s ...

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

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

最新文章

  1. 示波器上mode选择开关上的norm和auto是什么意思?
  2. Asp.Net_Mvc_IgnoreRoute
  3. win10无法显示的AppData文件夹,以及隐藏的python安装
  4. ELK学习9_ELK数据流传输过程_问题总结2
  5. 停止从域服务器同步文件,域控制器不同步处理办法
  6. 大数据挑战赛(大佬篇)
  7. 查看mysql状态常用命令
  8. SpringMVC自学日志04(Controller 及 RestFul风格 )
  9. DSDV的问题(Problems of DSDV)
  10. android中间隔执行程序,Android:在SeekBar中设置间隔
  11. 使用Ext Designer 设计简单计算器
  12. Rancher Labs联手NeuVector,提供容器管理与安全解决方案
  13. idea exclude from compile 再加回来
  14. PreScan第三课:Sensors Model
  15. 计算机的硬件软件组成
  16. 学校校园学生寝室管理查寝打分系统 毕业设计毕设源码毕业论文开题报告参考(3)宿舍管理员功能
  17. 使用计算机正确坐姿,如何保持正确坐姿?(多图)
  18. 打包一沓开源的 C/C++ 包管理工具送给你!
  19. 基于语义分割的身份证部件解析和文字检测
  20. loopback 搭建

热门文章

  1. maven 多环境打包
  2. 要立刷金组flag了T_T
  3. 重置 microsoft visual studio窗口
  4. freemarker基本语法及实例
  5. 实验七 访问列表配置
  6. oracle9i.rar下载
  7. [WPF] UserControl vs CustomControl
  8. Spring Cloud - Feign调用问题
  9. 【bzoj1251】序列终结者(伸展树)
  10. STL笔记(5)条款49:学习破解有关STL的编译器诊断信息