拟合阶跃函数

2024-06-25 22:54:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用scipy.optimize.leatsq拟合一个步骤函数。请考虑以下示例:

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

参数是台阶的位置和两边的标高。奇怪的是,如果运行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

其中第一个数字是leatsq正在寻找的,第二个是它应该寻找的实际最优函数的值。


Tags: 函数import参数nprandomscipyoptimizeprint