极大似然原理和贝叶斯分类器

匿名 (未验证) 提交于 2019-12-02 22:56:40

贝叶斯分类器:

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

经典的贝叶斯公式:

:类条件概率,表示在某种类别前提下,某事发生的概率;而为后验概率,表示某事发生了,并且它属于某一类别的概率,有了这个后验概率,我们就可以对样本进行分类。后验概率越大,说明某事物属于这个类别的可能性越大,我们越有理由把它归到这个类别下。

已知:在夏季,某公园男性穿凉鞋的概率为1/2,女性穿凉鞋的概率为2/3,并且该公园中男女比例通常为2:1,问题:若你在公园中随机遇到一个穿凉鞋的人,请问他的性别为男性或女性的概率分别为多少?

(若只考虑分类问题,只需要比较后验概率的大小,的取值并不重要)。

问题引出

和类条件概率(各类的总体分布)都是未知的。根据仅有的样本数据进行分类时,一种可行的办法是我们需要先对先验概率和类条件概率进行估计,然后再套用贝叶斯分类器。

先验概率的估计较简单,1、每个样本所属的自然状态都是已知的(有监督学习);2、依靠经验;3、用训练样本中各类出现的频率估计

类条件概率的估计(非常难),原因包括:概率密度函数包含了一个随机变量的全部信息;样本数据可能不多;特征向量x的维度可能很大等等。总之要直接估计类条件概率的密度函数很难。解决的办法就是,把估计完全未知的概率密度转化为估计参数。这里就将概率密度估计问题转化为参数估计问题,极大似然估计就是一种参数估计方法。当然了,概率密度函数的选取很重要,模型正确,在样本区域无穷时,我们会得到较准确的估计值,如果模型都错了,那估计半天的参数,肯定也没啥意义了。模型的选取:一般而言对于连续的变量我们可以用正态分布(关于为什么可以看成正态分布 中心极限定理有过证明)的模型进行估计(有的时候也可以先取对数在用正态估计 在估计之前可以先将数据可视化再对模型参数进行选择)对于离散的我们一般直接算概率值当作频率

重要前提:

极大似然估计

称为相对于的θ的似然函数。

是参数空间中能使似然函数最大的θ值,则应该是“最可能”的参数值,那么就是θ的极大似然估计量。它是样本集的函数,记作:

求解极大似然函数

极大似然估计的例子

,则似然函数为:

:,而且它一定是最大值点,这是因为当时,非负函数。于是U和的极大似然估计为

,否则,L(a,b)=0。类似地a不能大过,因此,a和b的极大似然估计:

求最大似然估计量的一般步骤:

贝叶斯算法:

再扩展一下,假如在街上看到一个黑人讲英语,那我们是怎么去判断他来自于哪里?

提取特征:

黑色人种来自于美国的概率: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、计算各类别(好评、差评)中,各特征的条件概率

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 | 好评) = 单词1在样本好评中出现的总次数/样本好评句子中总的单词数

P(好评) = 样本好评的条数/样本的总条数

同理:

P(差评 | 单词1,单词2,单词3) = P(单词1,单词2,单词3 | 差评) * P(差评) / P(单词1,单词2,单词3)

    因为分母都相同,所以只用比较分子即可--->P(单词1,单词2,单词3 | 差评) P(差评)

  1 #!/usr/bin/python  2 # coding=utf-8  3 from numpy import *  4   5 # 过滤网站的恶意留言  侮辱性:1     非侮辱性:0  6 # 创建一个实验样本  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()

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!