У меня возникли некоторые проблемы с подгонкой кривой к некоторым данным, но я не могу понять, в чем я ошибаюсь.
Раньше я делал это с помощью numpy.linalg.lstsq для экспоненциальных функций и scipy.optimize.curve_fit для сигмоидных функций. На этот раз я хотел создать сценарий, который позволил бы мне определять различные функции, определять параметры и проверять их соответствие данным. При этом я заметил, что Scipy leastsq
и Numpy lstsq
, похоже, дают разные ответы для одного и того же набора данных и одной и той же функции. Функция просто y = e^(l*x)
и ограничена таким образом, что y=1
на x=0
.
Линия тренда Excel согласуется с результатом Numpy lstsq
, но, поскольку Scipy leastsq
может выполнять любую функцию, было бы хорошо выяснить, в чем проблема.
import scipy.optimize as optimize
import numpy as np
import matplotlib.pyplot as plt
## Sampled data
x = np.array([0, 14, 37, 975, 2013, 2095, 2147])
y = np.array([1.0, 0.764317544, 0.647136491, 0.070803763, 0.003630962, 0.001485394, 0.000495131])
# function
fp = lambda p, x: np.exp(p*x)
# error function
e = lambda p, x, y: (fp(p, x) - y)
# using scipy least squares
l1, s = optimize.leastsq(e, -0.004, args=(x,y))
print l1
# [-0.0132281]
# using numpy least squares
l2 = np.linalg.lstsq(np.vstack([x, np.zeros(len(x))]).T,np.log(y))[0][0]
print l2
# -0.00313461628963 (same answer as Excel trend line)
# smooth x for plotting
x_ = np.arange(0, x[-1], 0.2)
plt.figure()
plt.plot(x, y, 'rx', x_, fp(l1, x_), 'b-', x_, fp(l2, x_), 'g-')
plt.show()
Редактировать - дополнительная информация
MWE выше включает небольшую выборку набора данных. При подборе фактических данных кривая scipy.optimize.curve_fit представляет R ^ 2, равное 0,82, а кривая numpy.linalg.lstsq, которая совпадает с рассчитанной по Excel, R ^ 2 составляет 0,41.