我试图适应的正弦波曲线这个数据分布,但由于某些原因,适合的才是不正确的:Python的 - 曲线拟合产生不正确配合
import matplotlib.pyplot as plt
import numpy as np
import scipy as sp
from scipy.optimize import curve_fit
#=======================
#====== Analysis =======
#=======================
# sine curve fit
def fit_Sin(t, A, b, C):
return A* np.sin(t*b) + C
## The Data extraciton
t,y,y1 = np.loadtxt("new10_CoCore_5to20_BL.txt", unpack=True)
xdata = t
popt, pcov = curve_fit(fit_Sin, t, y)
print "A = %s , b = %s, C = %s" % (popt[0], popt[1], popt[2])
#=======================
#====== Plotting =======
#=======================
fig1 = plt.figure()
ax1 = fig1.add_subplot(111)
ax1.plot(t, y, ".")
ax1.plot(t, fit_Sin(t, *popt))
plt.show()
在此配合使数据极度低估。任何想法,为什么这是?
这里是这里提供的数据:https://www.dropbox.com/sh/72jnpkkk0jf3sjg/AAAb17JSPbqhQOWnI68xK7sMa?dl=0
知道为什么这是生产呢?
我已经有一些成功的使用遗传算法来提供初始参数估计,但我的经验是,你的#1建议似乎最佳。请注意,此处“C”的初始参数估计值只是数据的平均值。 –
@JamesPhillips。对于足够棘手的数据(我已经看过例子),最好首先估计幅度,然后取峰值之间的一半距离。但说实话,除了频率,相移是唯一偶尔需要2次或3次迭代'curve_fit'才能确定的参数。 –
我的计划是做一个愚蠢的KDE来获得比FFT更可靠的频率 –