Подгонка к кусочной функции с использованием Python - PullRequest
2 голосов
/ 18 ноября 2011

Я пытаюсь согласовать кусочную функцию с абсолютными значениями, используя Numpy.

Математическая функция

x

x> = p [1]: y = 1 + p [0] * abs ((x - p [1]) / размер - размер / 2)

Вот моя функция Python:

fitfunc = lambda p, x: \
    x < p[1] and\
    1 + p[0] * abs((data['n1'].size + x - p[1]) / data['n1'].size - data['n1'].size / 2) or\
    1 + p[0] * abs((x - p[1]) / data['n1'].size - data['n1'].size / 2)

Хотя я получаю сообщение об ошибке:

The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Однако любой и все оценивают весь список в одно логическое значение.

Дополнительная информация:

Я использовал лямбды для подгонки данных к синусоиде с помощью следующего:

fitfunc = lambda p, x: 1 + p[0] * sin(pi * x / data['n1'].size + p[1])
errfunc = lambda p, x, y: fitfunc(p, x) - y # Distance to the target function

Затем в цикле:

data = np.genfromtxt(dataFileName, names=('n1', 'n2'))
xAxisSeries = scipy.linspace(0., data['n1'].max(), data['n1'].size)

p0 = [489., 123.] # Initial guess for the parameters
p1, success = scipy.optimize.leastsq(errfunc, p0[:], args=(xAxisSeries, data['n2']))

#time says which points from the sine wave will be plotted
time = scipy.linspace(0., data['n1'].max(), 100)
pylab.plot(time, fitfunc(p1, time), 'r-')

Я пытаюсь использовать лямбда-функцию, потому что optimize.leastsq требует ее. Я использую точно такой же код, за исключением изменения fitfunc.

Ответы [ 3 ]

2 голосов
/ 18 ноября 2011

Приведенный выше код не выглядит идиоматичным и усложняет жизнь.:)

Если вы пытаетесь определить функцию и дать ей имя одновременно, традиционный подход заключается в использовании def , а не lambda .

fitfunc = lambda p, x: ...  ## you're making a named function, so just do...

def fitfunc(p, x): ...

И когда у вас это есть, вам не нужно имитировать короткозамкнутые ветви с помощью 'и' и 'или': вы можете просто использовать , если .Вы попадаете в беду, пытаясь симулировать , если .

0 голосов
/ 18 ноября 2011

Используйте def и scipy.optimize.curve_fit ().

import scipy.optimize as so

def fitfunc(p, x):
    '''Define fit function'''
    if x < p[1]:
        return 1 + p[0] * abs((data['n1'].size + x - p[1]) / data['n1'].size - data['n1'].size / 2)
    else:
        return 1 + p[0] * abs((x - p[1]) / data['n1'].size - data['n1'].size / 2)

popt, pcov = so.curve_fit(fitfunc, x, y)
0 голосов
/ 18 ноября 2011

По правде говоря, не ясно, что вы пытаетесь сделать с помощью своей лямбда-функции.Но, возможно, это время дня на моей стороне земного шара ...

В любом случае, обратите внимание, что any (somelist) и np.array (). Any () одинаковы, номожет вызываться по-разному.

In [2]: a=np.ones(4)

In [3]: a
Out[3]: array([ 1.,  1.,  1.,  1.])
In [4]: a.any()
Out[4]: True

In [8]: a[1]=0

In [9]: a.all()
Out[9]: False

In [11]: somelist=["1","1","a","3"]

In [12]: any(somelist)
Out[12]: True

Обратите внимание также на комментарий, как вы вызываете эту функцию?Можете ли вы опубликовать больше кода?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...