将两个高斯拟合在较少表达的双峰数据上

时间:2017-11-04 11:32:22

标签: python python-3.x scipy scikit-learn curve-fitting

我试图让两个高斯人适合双峰分布data,但大多数优化者总是根据开始猜测给出错误的结果,如下所示

我还尝试了来自GMM的{​​{1}},这对我们没什么帮助。我想知道我可能做错了什么以及什么是更好的方法,以便我们可以测试和拟合双峰数据。使用scikit-learndata的示例代码之一如下

curve_fit

1 个答案:

答案 0 :(得分:5)

您可以尝试skewed Gaussian。使用参数alpha->0,这将成为正态高斯,允许稍微进行比较:

import matplotlib.pyplot as plt
import numpy as np
from scipy.special import erf
from scipy.optimize import minimize,leastsq, curve_fit


def gauss(x):
    return np.exp( -0.5 * x**2 / np.sqrt( 2 * np.pi ) )


def Phi(x):
    return ( 0.5 * ( 1. + erf(x/np.sqrt(2) ) ) )


def skewed(x, x0, s, a):
    return 2./s * gauss( ( x - x0 ) / s ) * Phi( a * ( x - x0 ) / s)


def my_double_peak(x, A0, x0, s0, a, A1, x1, s1):
    return A0 * skewed( x, x0, s0, a ) + A1 / s1 * gauss( ( x - x1 ) / s1 )

data = np.loadtxt("data.csv", skiprows=1, delimiter=',')
xData = range(len(data))

fitResult, ier = curve_fit( my_double_peak, xData, data[:,1], p0=(45e3, 400., 60,4. ,15e3, 700., 30 )  ) 
print fitResult
bestFit = [my_double_peak(x, *fitResult ) for x in range(len(data)) ]


fig1=plt.figure(1)
ax= fig1.add_subplot( 1, 1, 1 )
ax.plot( data[:,1] )
ax.plot( bestFit )

plt.show()

提供了:

>>> [  6.77971459e+04   3.48661227e+02   8.60938473e+01   
       8.43422033e+00   3.86660495e+03   7.22528635e+02   
       2.49055201e+01]

Fit with skewed gaussian