Кривая подгонки scipy не работает с синусом?

Я не понимаю, что не так с этой подгонкой данных:

from scipy.optimize import curve_fit
def sin_fit(x, *p):
    a,b,c,d= p
    return a + b*np.sin(c*x+ d)

# p0 is the initial guess for the fitting coefficients
p0 = [0.1, 1., 1., 0.1]

coeff, var_matrix = curve_fit(sin_fit, t, data, p0=p0)

Я предполагаю, что либо что-то явно не так, чего мне не хватает в данный момент, либо я не могу использовать кривую, подходящую от scipy для этой проблемы. Любые идеи?

Не подходит


person varantir    schedule 13.10.2014    source источник
comment
кажется, вы делаете это правильно... и у меня это сработало в игрушечном примере, заполнив входные данные data = 10 + 3*np.sin(t + 1.)   -  person Saullo G. P. Castro    schedule 13.10.2014


Ответы (2)


Похоже, это проблема с вашим первоначальным предположением, в частности, выбранная вами частота слишком далека. При вашем текущем исходном предположении p0, curve_fit недостаточно быстро сходятся к хорошему ответу, поэтому вам нужно выбрать лучший p0. Вот пример того, что я имею в виду:

t = np.linspace(0,50,1000)
data = 0.275 * (np.random.rand(len(t)) * 0.2 + 1.) * np.sin(2. * np.pi / 15. * t - 7.5)
p0 = [0.2, 0.5, 1.5 * np.pi / 14, 0.]

coeff, var_matrix = curve_fit(sin_fit, t, data, p0=p0)

plt.plot(t, data, 'bo')
plt.plot(t, sin_fit(t, *p0), 'g-')
plt.plot(t, sin_fit(t, *coeff), 'r-')

Ниже вы можете видеть, что при более близком начальном предположении (зеленая кривая) curve_fit лучше подходит (красная кривая): example  цифра

person pseudocubic    schedule 13.10.2014

Все работает и алгоритм нашел локальный минимум, как и должно быть. Ваше первоначальное предположение о частоте просто далеко от реальности.

Хорошая подгонка зависит не только от правильной модели, но и от хороших начальных значений. Специально для периодических кривых высшие гармоники могут образовывать локальный минимум.

Вот почему подгонка никогда не является черным ящиком, как механизм ввода данных -> результат вывода. Вмешательство пользователя почти всегда необходимо. Если это неблагоприятно, и у вас есть такие данные, лучше используйте анализ Фурье, чтобы получить нужную информацию.

person dnalow    schedule 13.10.2014