kez*_*zos 3 python scikit-learn
在 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()
Run Code Online (Sandbox Code Playgroud)
也许您混淆了从一组数据点优化统计模型和通过一组数据点拟合曲线的概念。
上面引用的一些 scikit-learn 代码试图从一组数据点优化统计模型。换句话说,在这种情况下,您正在尝试估计可以生成数据点集的源的概率分布的参数。有关更多信息,你可能要经历从“原则”部分这篇文章。然后将这些信息呈现给观众的方式是一个完全独立的主题。例如,您可以从数据点恢复高斯参数(即均值和标准差),然后在数据直方图上叠加高斯曲线。有关这方面的更多信息,请参阅此链接。
如果您拥有的只是直方图数据,即数据集中每个数据项的出现频率,那么您就有了形式为 [(x0,y0), (x1,y1), (x2,y2 ), ..., (xn,yn)]。在这种情况下,您正在尝试通过这些特定数据点拟合曲线,并且您可以使用最小二乘法之类的方法来实现。有关这方面的更多信息,请参阅此、此和此链接。
因此,要从数据集中优化您的高斯概率密度函数,您可以使用 sklearn 的 GMM 模型并将您的数据集直接提供给它(即,将直方图所基于的原始数据提供给它)
如果您已经拥有直方图的数据,那么您将查看诸如curve_fit 之类的函数。这里有一点需要注意:由于您正在尝试拟合概率分布函数,因此您的数据(即 HISTOGRAM 数据的 Y 分量)必须进行归一化,以便总和为 1.0。为此,只需将每个频率计数除以所有频率计数的总和。
希望这可以帮助。
| 归档时间: |
|
| 查看次数: |
3201 次 |
| 最近记录: |