贝叶斯分类器:

分类原理:通过某对象的先验概率,利用贝叶斯公式计算出其后验概率,即该对象属于某一类的概率,选择具有最大后验概率的类作为该对象所属的类。

经典的贝叶斯公式:

其中: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()

运行结果:

这篇文章是从多个博客中整理得到的,应该能把极大似然估计和贝叶斯分类器说清楚,主要是为了以后自己学习方便,有错误请大家指正。

极大似然原理和贝叶斯分类器相关推荐

  1. 朴素贝叶斯(Naive Bayes)原理+编程实现拉普拉斯修正的朴素贝叶斯分类器

    贝叶斯方法与朴素贝叶斯 1.生成模型与判别模型 2.贝叶斯 2.1贝叶斯公式 2.2贝叶斯方法 3朴素贝叶斯 3.1条件独立性假设 3.2朴素贝叶斯Naive在何处? 3.3朴素贝叶斯的三种模型 3. ...

  2. 第九课.朴素贝叶斯分类器

    目录 朴素贝叶斯算法原理 朴素贝叶斯参数估计 极大似然估计 贝叶斯估计 朴素贝叶斯算法流程 实验:Numpy实现朴素贝叶斯分类器 朴素贝叶斯算法原理 若P(X)P(X)P(X)表示事件XXX发生的概率 ...

  3. 【贝叶斯分类2】朴素贝叶斯分类器

    文章目录 1. 贝叶斯决策论回顾 1.1 分类原理 1.2 贝叶斯分类器 1.3 P(c|x) 1.4 计算公式 1.5 极大似然估计 2. 朴素贝叶斯分类器学习笔记 2.1 引言 2.2 知识卡片 ...

  4. 机器学习之用Python从零实现贝叶斯分类器

    机器学习之用Python从零实现贝叶斯分类器 2015/02/06 · 系列教程 · 13 评论 · 机器学习 分享到:27 本文由 伯乐在线 - Halal 翻译,toolate 校稿.未经许可,禁 ...

  5. 面试前抢救一下--朴素贝叶斯分类器

    写在最前 朴素贝叶斯分类器,实际上也是对人们常识做的一个算法的完善.其以一种更为精准的量化来判断分类,使用的方法是后验概率.本文从与决策树的比较出发,介绍先验概率和后验概率的关系,再详细介绍一下朴素贝 ...

  6. 西瓜书笔记7:贝叶斯分类器

    目录 相关概率知识 贝叶斯-全概率公式 先验概率.后验概率.似然概率 7.1 贝叶斯决策论 7.2 极大似然估计 极大似然估计公式 均值方差估计公式推导 概率知识复习 高斯分布 最大似然估计 7.3 ...

  7. 机器学习-朴素贝叶斯分类器

    机器学习-朴素贝叶斯分类器 概述 定义 贝叶斯方法 朴素贝叶斯算法 算法原理 优缺点 优点 缺点 应用 文本分类 其他 概述 朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法. 朴素贝叶斯分类 ...

  8. 【周志华机器学习】七、贝叶斯分类器

    文章目录 参考资料 1. 基本概念 1.1 贝叶斯公式 1.2 贝叶斯决策论 1.2.1 判别式模型 and 生成式模型 1.3 极大似然法 2. 朴素贝叶斯分类器 3. 半朴素贝叶斯分类器 4. E ...

  9. Python小案例:朴素贝叶斯分类器

    朴素贝叶斯分类器是一个以贝叶斯定理为基础,广泛应用于情感分类领域的优美分类器.本文我们尝试使用该分类器来解决上一篇文章中影评态度分类. 1.贝叶斯定理 假设对于某个数据集,随机变量C表示样本为C类的概 ...

最新文章

  1. PCL采样一致性算法
  2. JupyterLab Server 搭建与使用笔记
  3. MongoDB管理: 使用killOp干掉Long Running Operation
  4. 今晚19:30直播 | 这些国家为何今年扎堆去火星?航天专家庞之浩揭秘
  5. 如何理解写文档这件事情 ?
  6. iphone发送邮件html,iPhone使用smtp服务器发送电子邮件?
  7. 基于java的作业管理系统_基于java的作业管理系统
  8. 最新微信公众平台js sdk整合PHP版
  9. P1131-[ZJOI2007]时态同步【树形dp】
  10. 标记偏见_分析师的偏见
  11. Linux内核用户权限的实现,Linux内核设计与实现(6)---系统调用
  12. java显示参数,Java中的隐式参数和显示参数实例详解
  13. [转]vc6如何设置Unicode字符集
  14. debian添加快捷启动方式
  15. 【Tensorflow】基础概念epoch,batch_size辨析
  16. Atitti v5住宿服务部后勤部建设指引指南.docx
  17. ThinkPHP自定义404页面
  18. poi 读取word内容转html在线预览
  19. httpwatch使用_使用JavaScript的HTTPWatch自动化
  20. 雷霆战机android代码,雷霆战机代码

热门文章

  1. 什么是市盈率,它和股票价格有什么关系?
  2. 西工大计算机学院保研人数,陕西多所大学保研率超20%,西北工业大学27%,推免999人...
  3. Juju and Binary String(前缀和)
  4. 《计算机科学与探索》期刊 从投稿到以为录用,再到拒稿过程
  5. Linux中的高级网络控制
  6. 一小时构建 IoT 音视频应用,声网发布灵隼物联网云平台
  7. 为什么ad域打开失败_【AD】域环境常见错误集
  8. 7-9 7-10 sdut-C语言实验- 排序
  9. 小米5 android版本,小米 5 迎来 MIUI9.6.1.0 稳定版更新,将升级安卓 8.0 支持 LDAC
  10. Linux设置虚拟内存