Scikit学习,将高斯拟合到直方图中

2024-04-25 08:29:59 发布

您现在位置:Python中文网/ 问答频道 /正文

在scikit中,使用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()

Tags: 数据importforsignalascountnpplt
1条回答
网友
1楼 · 发布于 2024-04-25 08:29:59

也许你混淆了从一组数据点优化统计模型和通过一组数据点拟合曲线的概念。在

上面引用的一些scikit学习代码试图从一组数据点优化统计模型。换言之,在这种情况下,您试图估计可能生成数据点集的源的概率分布参数。有关这方面的更多信息,您可能需要浏览this article中的“原则”部分。这些信息呈现给观众的方式是一个完全独立的主题。例如,可以从数据点恢复高斯参数(即平均值和标准差),然后在数据直方图上覆盖高斯曲线。有关详细信息,请参见this link。在

当你只有直方图数据时,即数据集中每个数据项出现的频率,那么你就有了一对数据点,形式是[(x0,y0),(x1,y1),(x2,y2),…,(xn,yn)]。在这种情况下,你试图通过这些特定的数据点拟合曲线,你可以用最小二乘法这样做。有关此的详细信息,请参见thisthisthis链接。在

因此,要从数据集中优化高斯概率密度函数,可以使用sklearn的GMM模型并直接将数据集馈送给它(也就是说,将直方图基于的原始数据馈送给它)

如果已经有了直方图的数据,那么您将看到像curve_fit这样的函数。这里只需要稍微注意一下:由于您正在尝试拟合一个概率分布函数,您的数据(即直方图数据的Y分量)必须标准化才能得到1.0的和。为此,只需将每个频率计数除以所有频率计数之和。在

有关详细信息,您可能需要检查thisthis和{a9}链接。在

希望这有帮助。在

相关问题 更多 >