Python Scipy optimize.curve#u fit有时获胜';t收敛

Python Scipy optimize.curve#u fit有时获胜';t收敛,python,numpy,scipy,curve-fitting,numerical-methods,Python,Numpy,Scipy,Curve Fitting,Numerical Methods,我尝试使用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.

我尝试使用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,])
错误是:

运行时错误:未找到最佳参数:平方和的实际和预测相对减少量最多为0.000000,两次连续迭代之间的相对误差最多为0.000000

这让我对所发生的事情知之甚少。
快速测试表明,改变p0中的参数将导致该行成功。。。其他人也会失败。为什么会这样?

我尝试了您提供的两行数据,两行数据对我都很有用。我使用的是Scipy 0.8.0rc3。你用的是什么版本?另一个可能有用的方法是将c和d设置为固定值,因为它们每次都应该是相同的。我将c设置为0.6311786,将d设置为0.5。如果需要另一种方法,还可以使用带零填充的fft和峰值周围的二次拟合来查找频率。实际上,任何基音估计方法都适用,因为您正在寻找基频。

我使用的是Scipy 0.8.0b1。你的答案似乎是正确的(我觉得自己很傻:),我只需要再测试一下,然后接受它