簡體   English   中英

在Python中單獨混合高斯人

[英]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]
  • 我們必須提前猜測高斯分布的數量(如果要求混合2,它將不會計算出4的混合)。
  • 我們不得不對分布進行一些初步估計。 如果您進行遠程合理的猜測,它應該收斂到正確的估計值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM