我正在尝试使用scipy.optimize.leastsq安装步进功能.考虑以下示例:
import numpy as np
from scipy.optimize import leastsq
def fitfunc(p, x):
y = np.zeros(x.shape)
y[x < p[0]] = p[1]
y[p[0] < x] = p[2]
return y
errfunc = lambda p, x, y: fitfunc(p, x) - y # Distance to the target function
x = np.arange(1000)
y = np.random.random(1000)
y[x < 250.] -= 10
p0 = [500.,0.,0.]
p1, success = leastsq(errfunc, p0, args=(x, y))
print p1
参数是台阶的位置和两侧的水平.奇怪的是,第一个free参数永远不会改变,如果您运行scipy会得到
[ 5.00000000e+02 -4.49410173e+00 4.88624449e-01]
当第一个参数设置为250且第二个参数设置为-10时最佳.
是否有人对为什么这种方法不起作用以及如何使其起作用有任何见解?
如果我跑步
print np.sum(errfunc(p1, x, y)**2.)
print np.sum(errfunc([250.,-10.,0.], x, y)**2.)
我发现:
12547.1054663
320.679545235
其中第一个数字是Minimumsq所找到的,第二个数字是它应该找到的实际最佳函数的值.
解决方法:
事实证明,如果我将epsfcn =参数添加到minimumsq,则拟合会更好:
p1, success = leastsq(errfunc, p0, args=(x, y), epsfcn=10.)
结果是
[ 248.00000146 -8.8273455 0.40818216]
我的基本理解是,第一个*参数的移动量必须大于相邻点之间的间距,才能影响残差的平方,并且epsfcn与查找梯度所需的步长有关,或者类似的事情.