极大似然原理和贝叶斯分类器
贝叶斯分类器:
分类原理:通过某对象的先验概率,利用贝叶斯公式计算出其后验概率,即该对象属于某一类的概率,选择具有最大后验概率的类作为该对象所属的类。
经典的贝叶斯公式:
其中:x:为属性或特征,w:为类别,p(w):为先验概率,表示每种类别分布的概率;:类条件概率,表示在某种类别前提下,某事发生的概率;而
为后验概率,表示某事发生了,并且它属于某一类别的概率,有了这个后验概率,我们就可以对样本进行分类。后验概率越大,说明某事物属于这个类别的可能性越大,我们越有理由把它归到这个类别下。
我们来看一个直观的例子:已知:在夏季,某公园男性穿凉鞋的概率为1/2,女性穿凉鞋的概率为2/3,并且该公园中男女比例通常为2:1,问题:若你在公园中随机遇到一个穿凉鞋的人,请问他的性别为男性或女性的概率分别为多少?
从问题看,就是上面讲的,某事发生了,它属于某一类别的概率是多少?即后验概率。
设:
由已知可得:
男性和女性穿凉鞋相互独立,所以
(若只考虑分类问题,只需要比较后验概率的大小,的取值并不重要)。
由贝叶斯公式算出
问题引出
但是在实际问题中并不都是这样幸运的,我们能获得的数据可能只有有限数目的样本数据,而先验概率和类条件概率(各类的总体分布)
都是未知的。根据仅有的样本数据进行分类时,一种可行的办法是我们需要先对先验概率和类条件概率进行估计,然后再套用贝叶斯分类器。
先验概率的估计较简单,1、每个样本所属的自然状态都是已知的(有监督学习);2、依靠经验;3、用训练样本中各类出现的频率估计。
类条件概率的估计(非常难),原因包括:概率密度函数包含了一个随机变量的全部信息;样本数据可能不多;特征向量x的维度可能很大等等。总之要直接估计类条件概率的密度函数很难。解决的办法就是,把估计完全未知的概率密度转化为估计参数。这里就将概率密度估计问题转化为参数估计问题,极大似然估计就是一种参数估计方法。当然了,概率密度函数的选取很重要,模型正确,在样本区域无穷时,我们会得到较准确的估计值,如果模型都错了,那估计半天的参数,肯定也没啥意义了。模型的选取:一般而言对于连续的变量我们可以用正态分布(关于为什么可以看成正态分布 中心极限定理有过证明)的模型进行估计(有的时候也可以先取对数在用正态估计 在估计之前可以先将数据可视化再对模型参数进行选择)对于离散的我们一般直接算概率值当作频率
重要前提:训练样本的分布能代表样本的真实分布。每个样本集中的样本都是所谓独立同分布的随机变量 (iid条件),且有充分的训练样本。
极大似然估计
极大似然估计的原理,用一张图片来说明,如下图所示:
总结起来,最大似然估计的目的就是:利用已知的样本结果,反推最有可能(最大概率)导致这样结果的参数值。
原理:极大似然估计是建立在极大似然原理的基础上的一个统计方法,是概率论在统计学中的应用。极大似然估计提供了一种给定观察数据来评估模型参数的方法,即:“模型已定,参数未知”。通过若干次试验,观察其结果,利用试验结果得到某个参数值能够使样本出现的概率为最大,则称为极大似然估计。
由于样本集中的样本都是独立同分布,可以只考虑一类样本集D,来估计参数向量θ。记已知的样本集为:
似然函数(linkehood function):联合概率密度函数称为相对于
的θ的似然函数。
如果是参数空间中能使似然函数
最大的θ值,则
应该是“最可能”的参数值,那么
就是θ的极大似然估计量。它是样本集的函数,记作:
求解极大似然函数
ML估计:求使得出现该组样本的概率最大的θ值。
实际中为了便于分析,定义了对数似然函数:
1. 未知参数只有一个(θ为标量)
在似然函数满足连续、可微的正则条件下,极大似然估计量是下面微分方程的解:
2.未知参数有多个(θ为向量)
则θ可表示为具有S个分量的未知向量:
记梯度算子:
若似然函数满足连续可导的条件,则最大似然估计量就是如下方程的解。
方程的解只是一个估计值,只有在样本数趋于无限多的时候,它才会接近于真实值。
极大似然估计的例子
例1:设样本服从正态分布,则似然函数为:
它的对数:
求导,得方程组:
联合解得:
似然方程有唯一解:,而且它一定是最大值点,这是因为当
或
时,非负函数
。于是U和
的极大似然估计为
。
例2:设样本服从均匀分布[a, b]。则X的概率密度函数:
对样本:
很显然,L(a,b)作为a和b的二元函数是不连续的,这时不能用导数来求解。而必须从极大似然估计的定义出发,求L(a,b)的最大值,为使L(a,b)达到最大,b-a应该尽可能地小,但b又不能小于,否则,L(a,b)=0。类似地a不能大过
,因此,a和b的极大似然估计:
求最大似然估计量的一般步骤:
(1)写出似然函数;
(2)对似然函数取对数,并整理;
(3)求导数;
(4)解似然方程
贝叶斯算法:
再扩展一下,假如在街上看到一个黑人讲英语,那我们是怎么去判断他来自于哪里?
提取特征:
肤色: 黑
语言: 英语
黑色人种来自非洲的概率: 80%
黑色人种来自于美国的概率:20%
讲英语的人来自于非洲的概率:10%
讲英语的人来自于美国的概率:90%
在我们的自然思维方式中,就会这样判断:
这个人来自非洲的概率:80% * 10% = 0.08
这个人来自美国的概率:20% * 90% =0.18
我们的判断结果就是:此人来自美国!
其蕴含的数学原理如下:
p(A|xy)=p(Axy)/p(xy)=p(Axy)/p(x)p(y)=p(A)/p(x)*p(A)/p(y)* p(xy)/p(xy)=p(A|x)p(A|y)
P(类别 | 特征)=P(特征 | 类别)*P(类别) / P(特征)
算法步骤
1、分解各类先验样本数据中的特征
2、计算各类数据中,各特征的条件概率
(比如:特征1出现的情况下,属于A类的概率p(A|特征1),属于B类的概率p(B|特征1),属于C类的概率p(C|特征1)......)
3、分解待分类数据中的特征(特征1、特征2、特征3、特征4......)
4、计算各特征的各条件概率的乘积,如下所示:
判断为A类的概率:p(A|特征1)*p(A|特征2)*p(A|特征3)*p(A|特征4).....
判断为B类的概率:p(B|特征1)*p(B|特征2)*p(B|特征3)*p(B|特征4).....
判断为C类的概率:p(C|特征1)*p(C|特征2)*p(C|特征3)*p(C|特征4).....
......
5、结果中的最大值就是该样本所属的类别
算法应用举例
大众点评、淘宝等电商上都会有大量的用户评论,比如:
1、衣服质量太差了!!!!颜色根本不纯!!! 2、我有一有种上当受骗的感觉!!!! 3、质量太差,衣服拿到手感觉像旧货!!! 4、上身漂亮,合身,很帅,给卖家点赞 5、穿上衣服帅呆了,给点一万个赞 6、我在他家买了三件衣服!!!!质量都很差! |
0 0 0 1 1 0 |
其中1/2/3/6是差评,4/5是好评
现在需要使用朴素贝叶斯分类算法来自动分类其他的评论,比如:
a、这么差的衣服以后再也不买了 b、帅,有逼格 …… |
1.5、算法应用流程
1、分解出先验数据中的各特征
(即分词,比如“衣服”“质量太差”“差”“不纯”“帅”“漂亮”,“赞”……)
2、计算各类别(好评、差评)中,各特征的条件概率
(比如 p(“衣服”|差评)、p(“衣服”|好评)、p(“差”|好评) 、p(“差”|差评)……)
3、分解出待分类样本的各特征
(比如分解a: “差” “衣服” ……)
4、计算类别概率
P(好评) = p(好评|“差”) *p(好评|“衣服”)*……
P(差评) = p(差评|“差”) *p(差评|“衣服”)*……
5、显然P(差评)的结果值更大,因此a被判别为“差评”
1.6、朴素贝叶斯分类算法案例
大体计算方法:
P(好评 | 单词1,单词2,单词3) = P(单词1,单词2,单词3 | 好评) * P(好评) / P(单词1,单词2,单词3)
因为分母都相同,所以只用比较分子即可--->P(单词1,单词2,单词3 | 好评) P(好评)
每个单词之间都是相互独立的---->P(单词1 | 好评)P(单词2 | 好评)P(单词3 | 好评)*P(好评)
P(单词1 | 好评) = 单词1在样本好评中出现的总次数/样本好评句子中总的单词数
P(好评) = 样本好评的条数/样本的总条数
同理:
P(差评 | 单词1,单词2,单词3) = P(单词1,单词2,单词3 | 差评) * P(差评) / P(单词1,单词2,单词3)
因为分母都相同,所以只用比较分子即可--->P(单词1,单词2,单词3 | 差评) P(差评)
每个单词之间都是相互独立的---->P(单词1 | 差评)P(单词2 | 差评)P(单词3 | 差评)*P(差评)
1 #!/usr/bin/python2 # coding=utf-83 from numpy import *4 5 # 过滤网站的恶意留言 侮辱性:1 非侮辱性:06 # 创建一个实验样本7 def loadDataSet():8 postingList = [['my','dog','has','flea','problems','help','please'],9 ['maybe','not','take','him','to','dog','park','stupid'],
10 ['my','dalmation','is','so','cute','I','love','him'],
11 ['stop','posting','stupid','worthless','garbage'],
12 ['mr','licks','ate','my','steak','how','to','stop','him'],
13 ['quit','buying','worthless','dog','food','stupid']]
14 classVec = [0,1,0,1,0,1]
15 return postingList, classVec
16
17 # 创建一个包含在所有文档中出现的不重复词的列表
18 def createVocabList(dataSet):
19 vocabSet = set([]) # 创建一个空集
20 for document in dataSet:
21 vocabSet = vocabSet | set(document) # 创建两个集合的并集
22 return list(vocabSet)
23
24 # 将文档词条转换成词向量
25 def setOfWords2Vec(vocabList, inputSet):
26 returnVec = [0]*len(vocabList) # 创建一个其中所含元素都为0的向量
27 for word in inputSet:
28 if word in vocabList:
29 # returnVec[vocabList.index(word)] = 1 # index函数在字符串里找到字符第一次出现的位置 词集模型
30 returnVec[vocabList.index(word)] += 1 # 文档的词袋模型 每个单词可以出现多次
31 else: print "the word: %s is not in my Vocabulary!" % word
32 return returnVec
33
34 # 朴素贝叶斯分类器训练函数 从词向量计算概率
35 def trainNB0(trainMatrix, trainCategory):
36 numTrainDocs = len(trainMatrix)
37 numWords = len(trainMatrix[0])
38 pAbusive = sum(trainCategory)/float(numTrainDocs)
39 # p0Num = zeros(numWords); p1Num = zeros(numWords)
40 # p0Denom = 0.0; p1Denom = 0.0
41 p0Num = ones(numWords); # 避免一个概率值为0,最后的乘积也为0
42 p1Num = ones(numWords); # 用来统计两类数据中,各词的词频
43 p0Denom = 2.0; # 用于统计0类中的总数
44 p1Denom = 2.0 # 用于统计1类中的总数
45 for i in range(numTrainDocs):
46 if trainCategory[i] == 1:
47 p1Num += trainMatrix[i]
48 p1Denom += sum(trainMatrix[i])
49 else:
50 p0Num += trainMatrix[i]
51 p0Denom += sum(trainMatrix[i])
52 # p1Vect = p1Num / p1Denom
53 # p0Vect = p0Num / p0Denom
54 p1Vect = log(p1Num / p1Denom) # 在类1中,每个次的发生概率
55 p0Vect = log(p0Num / p0Denom) # 避免下溢出或者浮点数舍入导致的错误 下溢出是由太多很小的数相乘得到的
56 return p0Vect, p1Vect, pAbusive
57
58 # 朴素贝叶斯分类器
59 def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):
60 p1 = sum(vec2Classify*p1Vec) + log(pClass1)
61 p0 = sum(vec2Classify*p0Vec) + log(1.0-pClass1)
62 if p1 > p0:
63 return 1
64 else:
65 return 0
66
67 def testingNB():
68 listOPosts, listClasses = loadDataSet()
69 myVocabList = createVocabList(listOPosts)
70 trainMat = []
71 for postinDoc in listOPosts:
72 trainMat.append(setOfWords2Vec(myVocabList, postinDoc))
73 p0V, p1V, pAb = trainNB0(array(trainMat), array(listClasses))
74 testEntry = ['love','my','dalmation']
75 thisDoc = array(setOfWords2Vec(myVocabList, testEntry))
76 print testEntry, 'classified as: ', classifyNB(thisDoc, p0V, p1V, pAb)
77 testEntry = ['stupid','garbage']
78 thisDoc = array(setOfWords2Vec(myVocabList, testEntry))
79 print testEntry, 'classified as: ', classifyNB(thisDoc, p0V, p1V, pAb)
80
81 # 调用测试方法----------------------------------------------------------------------
82 testingNB()
运行结果:
这篇文章是从多个博客中整理得到的,应该能把极大似然估计和贝叶斯分类器说清楚,主要是为了以后自己学习方便,有错误请大家指正。
极大似然原理和贝叶斯分类器相关推荐
- 朴素贝叶斯(Naive Bayes)原理+编程实现拉普拉斯修正的朴素贝叶斯分类器
贝叶斯方法与朴素贝叶斯 1.生成模型与判别模型 2.贝叶斯 2.1贝叶斯公式 2.2贝叶斯方法 3朴素贝叶斯 3.1条件独立性假设 3.2朴素贝叶斯Naive在何处? 3.3朴素贝叶斯的三种模型 3. ...
- 第九课.朴素贝叶斯分类器
目录 朴素贝叶斯算法原理 朴素贝叶斯参数估计 极大似然估计 贝叶斯估计 朴素贝叶斯算法流程 实验:Numpy实现朴素贝叶斯分类器 朴素贝叶斯算法原理 若P(X)P(X)P(X)表示事件XXX发生的概率 ...
- 【贝叶斯分类2】朴素贝叶斯分类器
文章目录 1. 贝叶斯决策论回顾 1.1 分类原理 1.2 贝叶斯分类器 1.3 P(c|x) 1.4 计算公式 1.5 极大似然估计 2. 朴素贝叶斯分类器学习笔记 2.1 引言 2.2 知识卡片 ...
- 机器学习之用Python从零实现贝叶斯分类器
机器学习之用Python从零实现贝叶斯分类器 2015/02/06 · 系列教程 · 13 评论 · 机器学习 分享到:27 本文由 伯乐在线 - Halal 翻译,toolate 校稿.未经许可,禁 ...
- 面试前抢救一下--朴素贝叶斯分类器
写在最前 朴素贝叶斯分类器,实际上也是对人们常识做的一个算法的完善.其以一种更为精准的量化来判断分类,使用的方法是后验概率.本文从与决策树的比较出发,介绍先验概率和后验概率的关系,再详细介绍一下朴素贝 ...
- 西瓜书笔记7:贝叶斯分类器
目录 相关概率知识 贝叶斯-全概率公式 先验概率.后验概率.似然概率 7.1 贝叶斯决策论 7.2 极大似然估计 极大似然估计公式 均值方差估计公式推导 概率知识复习 高斯分布 最大似然估计 7.3 ...
- 机器学习-朴素贝叶斯分类器
机器学习-朴素贝叶斯分类器 概述 定义 贝叶斯方法 朴素贝叶斯算法 算法原理 优缺点 优点 缺点 应用 文本分类 其他 概述 朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法. 朴素贝叶斯分类 ...
- 【周志华机器学习】七、贝叶斯分类器
文章目录 参考资料 1. 基本概念 1.1 贝叶斯公式 1.2 贝叶斯决策论 1.2.1 判别式模型 and 生成式模型 1.3 极大似然法 2. 朴素贝叶斯分类器 3. 半朴素贝叶斯分类器 4. E ...
- Python小案例:朴素贝叶斯分类器
朴素贝叶斯分类器是一个以贝叶斯定理为基础,广泛应用于情感分类领域的优美分类器.本文我们尝试使用该分类器来解决上一篇文章中影评态度分类. 1.贝叶斯定理 假设对于某个数据集,随机变量C表示样本为C类的概 ...
最新文章
- PCL采样一致性算法
- JupyterLab Server 搭建与使用笔记
- MongoDB管理: 使用killOp干掉Long Running Operation
- 今晚19:30直播 | 这些国家为何今年扎堆去火星?航天专家庞之浩揭秘
- 如何理解写文档这件事情 ?
- iphone发送邮件html,iPhone使用smtp服务器发送电子邮件?
- 基于java的作业管理系统_基于java的作业管理系统
- 最新微信公众平台js sdk整合PHP版
- P1131-[ZJOI2007]时态同步【树形dp】
- 标记偏见_分析师的偏见
- Linux内核用户权限的实现,Linux内核设计与实现(6)---系统调用
- java显示参数,Java中的隐式参数和显示参数实例详解
- [转]vc6如何设置Unicode字符集
- debian添加快捷启动方式
- 【Tensorflow】基础概念epoch,batch_size辨析
- Atitti v5住宿服务部后勤部建设指引指南.docx
- ThinkPHP自定义404页面
- poi 读取word内容转html在线预览
- httpwatch使用_使用JavaScript的HTTPWatch自动化
- 雷霆战机android代码,雷霆战机代码
热门文章
- 什么是市盈率,它和股票价格有什么关系?
- 西工大计算机学院保研人数,陕西多所大学保研率超20%,西北工业大学27%,推免999人...
- Juju and Binary String(前缀和)
- 《计算机科学与探索》期刊 从投稿到以为录用,再到拒稿过程
- Linux中的高级网络控制
- 一小时构建 IoT 音视频应用,声网发布灵隼物联网云平台
- 为什么ad域打开失败_【AD】域环境常见错误集
- 7-9 7-10 sdut-C语言实验- 排序
- 小米5 android版本,小米 5 迎来 MIUI9.6.1.0 稳定版更新,将升级安卓 8.0 支持 LDAC
- Linux设置虚拟内存