2013-01-16 2 views
6

일부 데이터에 곡선을 맞추는 데 약간의 문제가 있지만 잘못 가고있는 부분을 해결할 수 없습니다. numpy 및 scipy의 지수 감쇠 곡선 피팅

는 과거에 나는 지수 함수에 대한 numpy.linalg.lstsq와 시그 모이 드 함수 scipy.optimize.curve_fit으로 이런 짓을했는지. 이번에는 다양한 기능을 지정하고 매개 변수를 결정하며 데이터에 대한 적합성을 테스트 할 수있는 스크립트를 만들고 싶습니다. 이 일을하는 동안 Scipy leastsq과 Numpy lstsq이 동일한 데이터 집합과 동일한 기능에 대해 서로 다른 대답을 제공하는 것으로 나타났습니다. 이 함수는 간단히 y = e^(l*x)이며 y=1x=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입니다 .

답변

4

다른 오류 기능을 최소화하고 있습니다. 만약 numpy.linalg.lstsq 사용할 때

최소화되는 에러 함수 scipy.optimize.leastsq

np.sum((y - np.exp(p * x))**2) 

첫번째 경우는 독립 변수와 종속 변수 사이의 선형 의존성을 필요로하는 기능을 최소화하면서

np.sum((np.log(y) - p * x)**2) 

이지만 솔루션은 분석적으로 알려져 있지만 두 번째는 종속성을 처리 할 수 ​​있지만 반복적 인 방법을 사용합니다.

l2 = np.linalg.lstsq(x[:, None], np.log(y))[0][0] 
+0

감사합니다. @Jaime - 좋은 답변입니다!불행히도 내 수학 지식은 그렇게 크지 않습니다. 쓰기가 잘못되었거나 잘못되었거나 (위의 편집 참조), 아니면 근본적으로 다른가 ... ...? 예를 들어 Sigmoid 또는 Gompertz 곡선을 동일한 데이터에 맞춰 테스트하려는 경우와 같이 다른 함수에 어떤 영향이 있습니까? – StacyR

+0

@StacyR 질문에 올바르게 답변 할 지식이 없지만'np.linalg.lstsq'로했던 것처럼 기하 급수적으로 피팅하는 것이 계산이 쉽지 않은 빠른 트릭입니다. 오류가 제대로 발생했습니다. 여기에 몇 가지 논의가 있습니다 (열심히 따라야 함). http://mathworld.wolfram.com/LeastSquaresFittingExponential.html이 자료에 깊이 들어가기를 원하지 않는다면, 나는 모든 것을 위해 scipy의 방법을 사용합니다. 더 나은 적합을 제공해야하며 결과는 모든 기능에 일관 될 것입니다. – Jaime

+0

다시 한 번 감사드립니다! 나는 이것에 대해 좀 더 연구를 해본 바있다. 앞에서 언급했듯이,'np.linalg.lstsq' 메쏘드는 낮은 x 값에서 y- 오류를 지나치게 가중시킨다. 공유 한 링크와 내가 찾은 다른 리소스를 통해 하나의 다른 분석 방법을 얻을 수있었습니다 (까다로운 문제는 제약 조건입니다. 모든 책에서 y = a * e^b * x에 대한 방법을 설명합니다). y = e^b * x보다 큼), 그러나 이것은 또한 반복적 인'scipy.optimize.leastsq'보다 나쁜 피팅 커브를 생성합니다. – StacyR

1

에 : numpy.linalg.lstsq를 사용하는 경우

별도의 노트에

, 난 당신이 다음 작품뿐만 아니라 vstack에 제로의 행을 필요가 없습니다, 지금 테스트,하지만 수 없습니다 Jaime의 관점에서 약간 설명하면 데이터의 비선형 변환은 다른 오류 함수로 이어져 다른 솔루션으로 이어질 것입니다. 이것들은 피팅 파라미터에 대한 다른 신뢰 구간으로 이어질 것입니다. 따라서 결정을 내리는 데 사용할 수있는 세 가지 기준이 있습니다. 어떤 오류를 최소화하고 싶은지, 어떤 매개 변수를 더 신뢰하고 싶은지, 마지막으로 피팅을 사용하여 일부 값을 예측하는 경우 어떤 방법으로 오류가 덜 생기는 지 확인할 수 있습니다 예측 값. 분석적으로나 Excel에서 약간 놀아 보면 데이터의 다양한 종류의 노이즈 (예 : 노이즈 함수가 진폭을 조정하고 시간 상수에 영향을 주거나 가산되는 경우)가 다양한 솔루션 선택을 유도합니다.

또한이 트릭이 0으로 지수 감소 할 때 "작동"하는 반면, 감쇠 지수 (상승 또는 하강)의 일반적인 경우 (일반적 일 수는 없음)에는 사용할 수 없습니다 0으로 가정합니다.

관련 문제