2010-10-12 5 views
1

Я пытаюсь использовать numpy.optimize.curve_fit для оценки частоты и фазы последовательности включения/выключения. Это код, я использую:Scipy optimize.curve_fit иногда не сходится

from numpy import * 
from scipy import optimize 

row = array([0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0,]) 

def fit_func(x, a, b, c, d): 
    return c * sin (a * x + b) + d 

p0 = [(pi/10.0), 5.0, row.std(), row.mean()] 
result = optimize.curve_fit(fit_func, arange(len(row)), row, p0) 
print result 

Это работает. Но на некоторых строках, хотя они кажутся совершенно нормально, он терпит неудачу. Пример неисправного строки:

row = array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,]) 

Ошибка:

RuntimeError: Optimal parameters not found: Both actual and predicted relative reductions in the sum of squares are at most 0.000000 and the relative error between two consecutive iterates is at most 0.000000

Который говорит мне, очень мало о том, что случилось. Быстрый тест показывает, что изменение параметров в p0 приведет к тому, что эта строка будет успешной ... и другие проваливаются. Почему это?

ответ

2

Я пробовал обе строки данных, которые вы предоставили, и оба работали для меня очень хорошо. Я использую Scipy 0.8.0rc3. Какую версию ты используешь? Еще одна вещь, которая может помочь, - установить c и d на фиксированные значения, так как они действительно должны быть одинаковыми каждый раз. Я установил c в 0.6311786 и d в .5. Вы также можете использовать fft с нулевым заполнением и квадратичной установкой вокруг пика, чтобы найти частоту, если хотите другой метод. Действительно, любой метод оценки шага применим, так как вы ищете основную частоту.

+0

Я использую Scipy 0.8.0b1. Ваш ответ, кажется, работает правильно (и я чувствую себя довольно глупым :), я просто проверю его немного больше, а затем приму его – Agos