在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()
答案 0 :(得分:4)
也许您会混淆从一组数据点优化统计模型并通过一组数据点拟合曲线的概念。
上面引用的一些scikit-learn代码试图从一组数据点优化统计模型。换句话说,在这种情况下,您正在尝试估计可能已生成数据点集的源的概率分布参数。有关此问题的更多信息,您可能需要查看https://codex.wordpress.org/Function_Reference/remove_action中的“原则”部分。然后将该信息呈现给观看者的方式是完全独立的主题。例如,您可以从数据点恢复高斯参数(即平均值和标准偏差),然后在数据直方图上叠加高斯曲线。有关详细信息,请参阅this article。
如果您拥有直方图数据,即数据集中每个数据项的出现频率,那么您就拥有[(x0,y0),(x1,y1)形式的数据点对,( x2,y2),...,(xn,yn)]。在这种情况下,您尝试通过这些特定数据点拟合CURVE,并且可以使用最小二乘法等方法来完成此操作。有关详情,请参阅this link,this和this链接。
因此,要从数据集优化高斯概率密度函数,您可以使用sklearn的GMM模型并直接将其提供给您的数据集(即,将直方图所基于的原始数据提供给它)
如果您已经拥有直方图的数据,那么您将查看this等函数。稍微注意一下:由于您正在尝试拟合概率分布函数,因此您的数据(即HISTOGRAM数据的Y分量)必须进行标准化才能得到1.0的总和。为此,只需将每个频率计数除以所有频率计数的总和。
有关详细信息,您可能需要查看curve_fit,this和this链接。
希望这有帮助。