机器学习之概率分布2

机器学习-概率分布-多项式分布

上面介绍了伯努利分布,下面接着介绍一种更为复杂的情况。本质上伯努利分布描述的是抛硬币的过程,现在我们考虑掷骰子的情况。骰子有六面,每一面的点数分别为:1,2,3,4,5,6。一般情况下,我们投骰子每一面的概率都是一样的——都是16。但也有特殊的情况,曾经有段时间,香港电影流行赌博主题的电影(《赌神》,不小心暴露的年龄…),里面有一个很low的老千,在骰子上做了手脚,使得某一面出现的概率增大。言归正传,我们假设每一面的出现的概率是不一样的。这一类型的概率分布充为多项式分布

这里我们引入一种one-hot的表示形式。设xK维向量,其中只有一个维度的值为1,其余为0。设xk表示向量x的第k维,比如只有第三维的值x31,那么x=(0,0,1,0,0,0)T。对应掷骰子的情况。(1,0,0,0,0,0)T表示第1面,(0,1,0,0,0,0)T表示第2面,…,依次类推。设每一面出现的概率为ukuk满足0uk1,Kk=1uk=1。那么投掷一次骰子,变量x的概率为:

p(x|u)=k=1Kuxkk

设有N个服从该分布的样本D={x1,x2,,xN},那么概率似然为:

p(D|μ)=n=1Np(xn|u)=n=1Nk=1Kuxnkk=k=1KuNn=1xnkk

上式中,xnk表示xn的第k维。
同样的,通过最大化对数似然lnp(D|u)可以求得参数u。当然由于u需满足Kk=1uk=1,因此可以引入拉格朗日乘子。
k=1K(n=1Nxnk)lnuk+λ(k=1Kuk1)

上式对uk求导,并令其为0,可得:
uk=Nn=1xnkλ

考虑到约束Kk=1uk=1,可得到:
λ=n=1Nk=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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值