일부 데이터에 곡선을 맞추는 데 약간의 문제가 있지만 잘못 가고있는 부분을 해결할 수 없습니다. numpy 및 scipy의 지수 감쇠 곡선 피팅
는 과거에 나는 지수 함수에 대한 numpy.linalg.lstsq와 시그 모이 드 함수 scipy.optimize.curve_fit으로 이런 짓을했는지. 이번에는 다양한 기능을 지정하고 매개 변수를 결정하며 데이터에 대한 적합성을 테스트 할 수있는 스크립트를 만들고 싶습니다. 이 일을하는 동안 Scipyleastsq
과 Numpy
lstsq
이 동일한 데이터 집합과 동일한 기능에 대해 서로 다른 대답을 제공하는 것으로 나타났습니다. 이 함수는 간단히
y = e^(l*x)
이며
y=1
이
x=0
인 것으로 제한됩니다.
Excel 추세선은 Numpy lstsq
결과와 일치하지만 Scipey 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 인 반면 Excel에서 계산 한 것과 동일한 numpy.linalg.lstsq 커브는 R^2가 0.41입니다 .
감사합니다. @Jaime - 좋은 답변입니다!불행히도 내 수학 지식은 그렇게 크지 않습니다. 쓰기가 잘못되었거나 잘못되었거나 (위의 편집 참조), 아니면 근본적으로 다른가 ... ...? 예를 들어 Sigmoid 또는 Gompertz 곡선을 동일한 데이터에 맞춰 테스트하려는 경우와 같이 다른 함수에 어떤 영향이 있습니까? – StacyR
@StacyR 질문에 올바르게 답변 할 지식이 없지만'np.linalg.lstsq'로했던 것처럼 기하 급수적으로 피팅하는 것이 계산이 쉽지 않은 빠른 트릭입니다. 오류가 제대로 발생했습니다. 여기에 몇 가지 논의가 있습니다 (열심히 따라야 함). http://mathworld.wolfram.com/LeastSquaresFittingExponential.html이 자료에 깊이 들어가기를 원하지 않는다면, 나는 모든 것을 위해 scipy의 방법을 사용합니다. 더 나은 적합을 제공해야하며 결과는 모든 기능에 일관 될 것입니다. – Jaime
다시 한 번 감사드립니다! 나는 이것에 대해 좀 더 연구를 해본 바있다. 앞에서 언급했듯이,'np.linalg.lstsq' 메쏘드는 낮은 x 값에서 y- 오류를 지나치게 가중시킨다. 공유 한 링크와 내가 찾은 다른 리소스를 통해 하나의 다른 분석 방법을 얻을 수있었습니다 (까다로운 문제는 제약 조건입니다. 모든 책에서 y = a * e^b * x에 대한 방법을 설명합니다). y = e^b * x보다 큼), 그러나 이것은 또한 반복적 인'scipy.optimize.leastsq'보다 나쁜 피팅 커브를 생성합니다. – StacyR