拟合部分高斯

时间:2017-01-29 19:10:34

标签: numpy scipy scikit-learn curve-fitting gaussian

我试图使用scikit-learn来适应一群高斯人,因为scikit-learn GaussianMixture似乎比使用curve_fit更强大。

问题:在拟合一个高斯峰的截断部分方面做得不好:

from sklearn import mixture
import matplotlib.pyplot
import matplotlib.mlab
import numpy as np

clf = mixture.GaussianMixture(n_components=1, covariance_type='full')
data = np.random.randn(10000)
data = [[x] for x in data]
clf.fit(data)
data = [item for sublist in data for item in sublist]
rangeMin = int(np.floor(np.min(data)))
rangeMax = int(np.ceil(np.max(data)))
h = matplotlib.pyplot.hist(data, range=(rangeMin, rangeMax), normed=True);
plt.plot(np.linspace(rangeMin, rangeMax),
         mlab.normpdf(np.linspace(rangeMin, rangeMax),
                      clf.means_, np.sqrt(clf.covariances_[0]))[0])

给出 enter image description here 现在将data = [[x] for x in data]更改为data = [[x] for x in data if x <0]以截断分配回报 enter image description here 任何想法如何正确拟合截断?

注意:发布不必在中间截断,可能会有50%到100%的完整发行版留下。

如果有人能指出我的替代套餐,我也会很高兴。我只尝试过curve_fit,但只要涉及两个以上的峰值,我就无法做任何有用的事情。

2 个答案:

答案 0 :(得分:2)

有点野蛮,但简单的解决方案是将曲线分成两半(data = [[x] for x in data if x < 0]),镜像左侧部分(data.append([-data[d][0]])),然后进行常规高斯拟合。

import numpy as np
from sklearn import mixture
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab

np.random.seed(seed=42)
n = 10000

clf = mixture.GaussianMixture(n_components=1, covariance_type='full')

#split the data and mirror it
data = np.random.randn(n)
data = [[x] for x in data if x < 0]
n = len(data)
for d in range(n):
    data.append([-data[d][0]])

clf.fit(data)
data = [item for sublist in data for item in sublist]
rangeMin = int(np.floor(np.min(data)))
rangeMax = int(np.ceil(np.max(data)))
h = plt.hist(data[0:n], bins=20, range=(rangeMin, rangeMax), normed=True);
plt.plot(np.linspace(rangeMin, rangeMax),
         mlab.normpdf(np.linspace(rangeMin, rangeMax),
                      clf.means_, np.sqrt(clf.covariances_[0]))[0] * 2)

plt.show()

enter image description here

答案 1 :(得分:0)

lhcgeneva问题是,一旦您获得的数据中不包含曲线的最大值,那么越来越多的高斯拟合就可以了:

Black point represent the data, red points the fitted Gaussian

在图中,黑点表示拟合曲线的数据,红点表示拟合结果。通过使用A Simple Algorithm for Fitting a Gaussian Function

获得了此结果