Scipy optimise.curve_fit иногда не сходится

Я пытаюсь использовать numpy.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: оптимальные параметры не найдены: как фактическое, так и прогнозируемое относительное уменьшение суммы квадратов не превышает 0,000000, а относительная ошибка между двумя последовательными итерациями не превышает 0,000000.

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


person Agos    schedule 12.10.2010    source источник


Ответы (1)


Я пробовал обе строки данных, которые вы предоставили, и обе работали для меня просто отлично. Я использую Scipy 0.8.0rc3. Какую версию ты используешь? Еще одна вещь, которая может помочь, — установить фиксированные значения c и d, поскольку они действительно должны быть одинаковыми каждый раз. Я установил c на 0,6311786 и d на 0,5. Вы также можете использовать БПФ с заполнением нулями и квадратичной подгонкой вокруг пика, чтобы найти частоту, если вам нужен другой метод. На самом деле применим любой метод оценки основного тона, поскольку вы ищете основную частоту.

person Justin Peel    schedule 12.10.2010
comment
Я использую Scipy 0.8.0b1. Ваш ответ, кажется, работает правильно (и я чувствую себя довольно глупо :), я просто еще немного протестирую его, а затем приму его. - person Agos; 15.10.2010