机器学习-概率分布-多项式分布
上面介绍了伯努利分布,下面接着介绍一种更为复杂的情况。本质上伯努利分布描述的是抛硬币的过程,现在我们考虑掷骰子的情况。骰子有六面,每一面的点数分别为:1,2,3,4,5,6。一般情况下,我们投骰子每一面的概率都是一样的——都是16。但也有特殊的情况,曾经有段时间,香港电影流行赌博主题的电影(《赌神》,不小心暴露的年龄…),里面有一个很low的老千,在骰子上做了手脚,使得某一面出现的概率增大。言归正传,我们假设每一面的出现的概率是不一样的。这一类型的概率分布充为多项式分布
这里我们引入一种one-hot的表示形式。设x为K维向量,其中只有一个维度的值为
p(x|u)=∏k=1Kuxkk
设有N个服从该分布的样本
p(D|μ)=∏n=1Np(xn|u)=∏n=1N∏k=1Kuxnkk=∏k=1Ku∑Nn=1xnkk
上式中,xnk表示xn的第k维。
同样的,通过最大化对数似然
∑k=1K(∑n=1Nxnk)lnuk+λ(∑k=1Kuk−1)
上式对uk求导,并令其为0,可得:
uk=−∑Nn=1xnkλ
考虑到约束∑Kk=1uk=1,可得到:
λ=−∑n=1N∑k=1Kxnk=−N
所以:
uk=∑Nn=1xnkN
用python来实现上述的参数估计过程,用scipy包中的multinomial分布来生成样本,再根据这些样本估计multinomial分布的参数。实现起来还是非常容易的。
代码
估计伯努利分布的参数:
from scipy.stats import multinomial
import numpy
X=multinomial.rvs(n=1,p=[0.4,0.5,0.1],size=100000) #根据伯努利分布来生成样本#
u = numpy.mean(X,axis=0);#用样本来估计参数#
print(u)