[英]Separate mixture of gaussians in Python
有一些物理實驗的結果,可以表示為直方圖[i, amount_of(i)]
。 我想結果可以通過4-6個高斯函數的混合來估計。
Python中是否有一個包,它以直方圖作為輸入,並返回混合分布中每個高斯分布的均值和方差?
原始數據,例如:
這是高斯的混合 ,可以使用期望最大化方法估計(基本上,它在估計它們如何混合在一起的同時找到分布的中心和均值)。
這是在PyMix包中實現的。 下面我生成一個法線混合的例子,並使用PyMix為它們擬合混合模型,包括找出你感興趣的東西,這是子群體的大小:
# requires numpy and PyMix (matplotlib is just for making a histogram)
import random
import numpy as np
from matplotlib import pyplot as plt
import mixture
random.seed(010713) # to make it reproducible
# create a mixture of normals:
# 1000 from N(0, 1)
# 2000 from N(6, 2)
mix = np.concatenate([np.random.normal(0, 1, [1000]),
np.random.normal(6, 2, [2000])])
# histogram:
plt.hist(mix, bins=20)
plt.savefig("mixture.pdf")
以上所有代碼都生成並繪制混合物。 它看起來像這樣:
現在實際使用PyMix來確定百分比是多少:
data = mixture.DataSet()
data.fromArray(mix)
# start them off with something arbitrary (probably based on a guess from the figure)
n1 = mixture.NormalDistribution(-1,1)
n2 = mixture.NormalDistribution(1,1)
m = mixture.MixtureModel(2,[0.5,0.5], [n1,n2])
# perform expectation maximization
m.EM(data, 40, .1)
print m
這個輸出模型是:
G = 2
p = 1
pi =[ 0.33307859 0.66692141]
compFix = [0, 0]
Component 0:
ProductDist:
Normal: [0.0360178848449, 1.03018725918]
Component 1:
ProductDist:
Normal: [5.86848468319, 2.0158608802]
注意它發現兩個法線非常正確(一個N(0, 1)
和一個N(6, 2)
,大約)。 它還估計了pi
,這是兩個發行版中每一個的分數(你在評論中提到的是你最感興趣的內容)。 我們在第一個發行版中有1000個,在第二個發行版中有2000個,它得到的部門幾乎完全正確: [ 0.33307859 0.66692141]
。 如果要直接獲取此值,請執行m.pi
幾點說明:
[(1.4, 2), (2.6, 3)]
轉換為[1.4, 1.4, 2.6, 2.6, 2.6]
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.