Я пытаюсь соответствовать синусоиде волны этого распределение данных, но по какой-то причине, подгонка неправилен: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', чтобы пригнуться. –
Мой план состоял в том, чтобы сделать Dumbed KDE, чтобы получить более надежную частоту, чем FFT –