Scipy optimize.curve_fit иногда не сходится - PullRequest
1 голос
/ 12 октября 2010

Я пытаюсь использовать 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 приведет к успешному выполнению этой строки ... и к ошибкам других. Почему это?

1 Ответ

2 голосов
/ 12 октября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...