Почему scipy.optimize.curve_fit () работает лучше с определенным количеством аргументов в функции подбора? - PullRequest
1 голос
/ 11 февраля 2020

Я пытаюсь подогнать полиномиальную функцию произвольной длины к некоторым данным частиц, и я заметил, что curve_fit () работает намного лучше, когда аргументы функции подгонки указаны явно, а не неопределенное количество передаваемых аргументов, то есть

import scipy.optimize as optimize


def fit(x, a, b):
    return a + b*x

my_fit = optimize.curve_fit(fit, x_data, y_data)

работает намного лучше, чем

import scipy.optimize as optimize
import numpy as np


def fit(x, *args):
    return np.sum([arg * x**i for i, arg in enumerate(args)])

my_fit = optimize.curve_fit(fit, x_data, y_data, p0=[1, 1])

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

Подгонка с * аргументами и явное сравнение коэффициентов

Есть ли у кого-нибудь объяснение этому поведению?

1 Ответ

0 голосов
/ 11 февраля 2020

Работает фактически так же, проблема в том, что второе определение соответствия не работает для numpy массивов, так как np.sum всегда будет приводить к одному числу. Просто укажите ось, и она будет работать:

import scipy.optimize as optimize

def fit(x, a, b):
    return a + b*x

def fit2(x, *args):
    return np.sum([arg * x**i for i, arg in enumerate(args)], axis=0)


x_data = np.linspace(-0.3, 0.3, 200)
y_data = x_data * 1000 + np.random.normal(size=x_data.shape[0], scale=20)

my_fit = optimize.curve_fit(fit, x_data, y_data, p0=[1, 1])
my_fit2 = optimize.curve_fit(fit2, x_data, y_data, p0=[1, 1])

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 5))
ax1.scatter(x_data, y_data, alpha=0.5, color='red')
ax1.plot(x_data, fit(x_data, my_fit[0][0], my_fit[0][1]), color='k')
ax2.scatter(x_data, y_data, alpha=0.5, color='red')
ax2.plot(x_data, fit2(x_data, my_fit2[0][0], my_fit2[0][1]), color='k')

enter image description here

...