Scikit learn,拟合直方图的高斯分布

3
在scikit-learn中,使用GMM拟合高斯峰似乎适用于离散的数据点。是否有一种方法可以使用已经分箱或聚合成直方图的数据进行GMM处理?
例如,以下代码是一种解决方法,它将分箱数据转换为离散数据点进行拟合:
import numpy as np
import matplotlib.pyplot as plt
from sklearn import mixture

def fit_one_peak(x, linspace):
    gmm = mixture.GMM(n_components=1) # gmm for one components
    gmm.fit(x) # train it!
    m1 = gmm.means_
    w1 = gmm.weights_
    return np.exp(gmm.score_samples(linspace)[0]), m1[0][0], w1[0]

def convert_to_signal(d, s):
    c = []
    count = 0
    for i in s:
        for j in range(int(d[count])):  # No floats!
            c.append(i)
        count += 1
    return c

d = [0.5, 2, 5, 3, 1, 0.5]  # y data, which is already binned
s = [0, 1, 2, 3, 4, 5]  # x data

signal = convert_to_signal(d, s)
linspace = np.linspace(s[0], s[-1], len(s))
l, mean, weight = fit_one_peak(signal, linspace)
l = l*(np.max(d)/ np.max(l))  # Normalize the fitted y

fig = plt.figure()
plt.plot(s, d, label='Original')
plt.plot(linspace, l, label='Fitted')
plt.hist(signal, label='Re-binned')
plt.legend()
1个回答

5
也许您混淆了从一组数据点优化统计模型和通过一组数据点拟合曲线的概念。
上面引用的一些scikit-learn代码试图从一组数据点中优化统计模型。换句话说,在这种情况下,您正在尝试估计可能生成数据点集的源的概率分布的参数。有关此信息的更多信息,请参阅此文章中的“原则”部分。然后将此信息呈现给观众是完全独立的主题。例如,您可以从数据点中恢复高斯的参数(即平均值和标准偏差),然后在数据直方图上叠加高斯曲线。有关此内容的更多信息,请参见此链接
当您只有直方图数据时,即数据集中每个数据项出现的频率时,您就有了形式为[(x0,y0),(x1,y1),(x2,y2),...,(xn,yn)]的数据点对。在这种情况下,您正在尝试通过这些特定数据点拟合曲线,可以使用最小二乘之类的方法来实现。有关此内容的更多信息,请参见链接。
因此,要从数据集优化高斯概率密度函数,可以使用sklearn的GMM模型并直接将原始数据集馈送给它(即将其基于的原始数据馈送给它)。
如果您已经拥有直方图的数据,则可能会查看curve_fit之类的函数。这里只需稍微注意一下:由于您正在尝试拟合概率分布函数,因此您的数据(即直方图数据的Y分量)必须归一化以使总和为1.0。要做到这一点,只需将每个频率计数除以所有频率计数的总和即可。
更多信息,请查看这个这个这个链接。希望对你有所帮助。

谢谢,这对我帮助很大。 - kezzos
不客气,很高兴听到这是有帮助的回复。 - A_A

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接