我正在使用Python 2.7。我想知道为什么当目标是高频正弦波时,SciPy的优化函数不会收敛到正确的函数。
import numpy as np
from scipy import optimize
test_func = lambda x: 5*np.sin(15*x+3)+1
t = linspace(0,25,100000)
y_t = test_func(t)
plot(t,y_t)
fitfunc = lambda p, x: p[0]*np.sin(p[1]*x+p[2])+p[3]
errfunc = lambda p, x, y: fitfunc(p, x) - y
p0 = [max(y_t),10,2,0]
p1, success = optimize.leastsq(errfunc, p0, args=(t,y_t))
plot(t,fitfunc(p1,t))
可以清楚地看到最终解决方案明显偏离目标。难道我做错了什么 ?这里的错误功能是否适用?
感谢任何输入
答案 0 :(得分:3)
你的问题是你的残差函数中存在大量的局部最小值,因为相位和频率相对于它们的真实值而变化;没有对阶段和频率进行真正良好的初步猜测,你将会融入一个而不是陷入更深层次的全局最小值:
如果您没有关于相位和频率的更多信息,您可以从数据的FFT估计它们或重写您的公式
Asin(bx + phi)+ d = Acos(phi)sin(bx)+ Asin(phi)cos(bx)+ d
只有一个非线性参数(b):你可以使用网格搜索b和更快更可靠的线性最小二乘拟合(a1 = Acos(phi),a2 = Asin(phi)和d)。
这是有效值残差图,频率b
变化,显示各种最小值: