朴素贝叶斯估计

介绍来自李航《统计学习方法》

朴素贝叶斯(naïve Bayes)法是基于贝叶斯定理与特征条件独立假设的分类方法[1]。对于给定的训练数据集,首先基于特征条件独立假设学习输入/输出的联合概率分布;然后基于此模型,对给定的输入x,利用贝叶斯定理求出后验概率最大的输出y。朴素贝叶斯法实现简单,学习与预测的效率都很高,是一种常用的方法。

4.2 朴素贝叶斯法的参数估计

4.2.1 极大似然估计

在朴素贝叶斯法中,学习意味着估计P(Y=ck)和P(X(j)=x(j)|Y=ck)。可以应用极大似然估计法估计相应的概率。先验概率P(Y=ck)的极大似然估计是

alt

设第j个特征x(j)可能取值的集合为{aj1,aj2,…,ajSj},条件概率P(x(j)=ajl|Y=ck)的极大似然估计是

alt

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

4.2.2 学习与分类算法

下面给出朴素贝叶斯法的学习与分类算法。

算法4.1(朴素贝叶斯算法(naïve Bayes algorithm))

输入:训练数据T={(x1,y1),(x2,y2),…,(xN,yN)},其中altalt是第i个样本的第j个特征,alt∊{aj1,aj2,…,ajSj},ajl是第j个特征可能取的第l个值,j=1,2,…,n,l=1,2,…,Sj,yi∊{c1,c2,…,cK};实例x;

输出:实例x的分类。

(1)计算先验概率及条件概率

alt

(2)对于给定的实例x=(x(1),x(2),…,x(n))T,计算

alt

(3)确定实例x的类

alt

测试数据采用第5章的例子。

 1 # coding:utf8
 2 
 3 def NBM(x,y,goal):
 4     n=len(y)
 5     def getList(x):
 6         kx=[]
 7         xlist=[]
 8         for i in range(1 if type(x[0])!=list else len(x[0])):
 9             xlist.append(list(set([a if type(a)!=list else a[i] for a in x ])))
10             kx.append(len(xlist[i]))
11         return xlist,kx
12     xlist,kx= getList(x)
13     ylist,ky= getList(y)
14     ycount= [y.count(i) for i in ylist[0]]
15     xindex=[[xlist[i].index( goal[i])] for i in  range(len(goal))]
16     #print xlist,kx,ylist,ky,ycount,xindex  #[[1, 2, 3], ['s', 'm', 'l']] [3, 3] [[1, -1]] [2] [9, 6] [[1], [0]]
17     t=[]
18     p=[]
19     for m in range(ky[0]):
20         for j in range(len(kx)):
21             for i in range(kx[j]):
22                 t.append(sum([1 for a in range(n) if xlist[j][i] in x[a] and y[a]==ylist[0][m]]))
23             p.append(t)
24             t=[]
25     #print p #[[2, 3, 4], [1, 4, 4], [3, 2, 1], [3, 2, 1]]
26     px=[]
27     t=1
28     m=0
29     for j in range(ky[0]):
30          for i in range(len(xindex)):
31              t*=(p[m][xindex[i][0]]+1.0)/(ycount[j]+kx[i])
32              m=m+1
33          px.append(t*(ycount[j]+1.0)/(n+ky[0]))
34          t=1
35     return ylist[0][px.index(max(px))]
36 
37 x1 = [[1,'s'],[1,'m'],[1,'m'],[1,'s'],[1,'s'],[2,'s'],[2,'m'],[2,'m'],[2,'l'],[2,'l'],[3,'l'],[3,'m'],[3,'m'],[3,'l'],[3,'l']]
38 y1 = [-1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1]
39 goal1 = [2,'s']
40 x = [["青年", "", "", "一般"],
41     ["青年", "", "", ""],
42     ["青年", "", "", ""],
43     ["青年", "", "", "一般"],
44     ["青年", "", "", "一般"],
45     ["中年", "", "", "一般"],
46     ["中年", "", "", ""],
47     ["中年", "", "", ""],
48     ["中年", "", "", "非常好"],
49     ["中年", "", "", "非常好"],
50     ["老年", "", "", "非常好"],
51     ["老年", "", "", ""],
52     ["老年", "", "", ""],
53     ["老年", "", "", "非常好"],
54     ["老年", "", "", "一般"],]
55 y = ["拒绝","拒绝","同意","同意","拒绝","拒绝","拒绝","同意","同意","同意","同意","同意","同意","同意","拒绝"]
56 goal = ["老年", "", "", ""]
57 print NBM(x,y,goal)  #同意
58 print NBM(x1,y1,goal1)  #-1
原文地址:https://www.cnblogs.com/qw12/p/5664862.html