Я пытаюсь подобрать ступенчатую функцию, используя 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
параметрами являются расположение ступени и уровень с любой стороны. Что странно, так это то, что первый свободный параметр никогда не меняется, если вы запустите, что 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
где первое число — это то, что находит наименьший квадрат, а второе — значение фактической оптимальной функции, которую он должен найти.
[250, whatever, -10]
, которое вы бы предпочли получить? - person Alex Martelli   schedule 03.10.2009