%matplotlib inline
from matplotlib import pyplot as plt
import numpy as np
from scipy.stats import multivariate_normal
from scipy.stats import multinomial
def generator():
z= multinomial.rvs(1,[0.2,0.4,0.4])
z=np.where(z==1)[0]# サイコロを振る
# サイコロの目に対応するガウス分布からサンプルを得る
if z==0:
x = multivariate_normal.rvs([1,2],[[0.5,0],[0,0.5]])
if z==1:
x = multivariate_normal.rvs([3,0],[[1,0],[0,1]])
if z==2:
x = multivariate_normal.rvs([-2,1],[[1,0.5],[0.5,1]])
return (z,x)
# こんな書き方したら笑われちゃいますが・・・。
out=generator()
print('ガウス分布の番号:',out[0],'位置:',out[1])
ガウス分布の番号: [1] 位置: [1.68965966 0.05432921]
samples=[generator() for i in range(500)]
for index in range(3):
plt.plot([i[1][0] for i in samples if i[0]==index],[i[1][1] for i in samples if i[0]==index],'x')
plt.show()
xだけが観測できるとき、混合ガウスから生成されると仮定、
を推定するのがGaussian Mixture Modelingの問題設定。
対数尤度 $log p(x|\Theta)$を最大化する$\Theta=[\alpha, \mu, \Sigma]$を求める (EMアルゴリズムで)。 また、副次的に$p(z_i|x_i)$(それぞれのx_iに対するz_iの事後確率)も求められる。
とりあえず上2つさえ押さえておけば使える。