gpt4 book ai didi

python - 在 Python 中分离高斯混合

转载 作者:太空狗 更新时间:2023-10-29 18:25:48 31 4
gpt4 key购买 nike

有一些物理实验的结果,可以表示为直方图[i, amount_of(i)]。我想这个结果可以通过混合使用 4 - 6 个高斯函数来估计。

Python中有没有一个包,以直方图为输入,返回混合分布中每个高斯分布的均值和方差?

原始数据,例如:

Sample data

最佳答案

这是一个 mixture of gaussians ,并且可以使用 expectation maximization 进行估算方法(基本上,它在估计它们如何混合在一起的同时找到分布的中心和均值)。

这是在 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")

以上代码所做的只是生成和绘制混合物。它看起来像这样:

enter image description here

现在实际使用 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)。
  • 我们必须对分布进行一些初步估计。即使您做出合理的猜测,它也应该会收敛到正确的估计值。

关于python - 在 Python 中分离高斯混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14189937/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com