2012-10-08 2 views
3

데이터 세트 (X, Y, Yerr)에 최소 자승 다항식 적합성을 적용하고 적합 매개 변수의 공분산 행렬을 얻고 싶습니다. 또한 많은 데이터 세트가 있기 때문에 CPU 시간이 문제이므로 분석적인 (즉, 빠른) 솔루션을 찾고 있습니다.공분산을 반환하는 파이썬 다항식 적합 함수가 필요합니다.

numpy.polyfit 다음과 같은 (이상적이지 않은) 옵션이 있음을 발견했습니다. 그러나 Yerr 오류는 고려하지 않으며 공분산을 반환하지 않습니다.

numpy.polynomial.polynomial.polyfit은 Yerr을 입력으로 허용 (가중치 형식)하지만 공분산도 반환하지 않습니다. 반복적 인 방법 - -

scipy.optimize.curve_fitscipy.optimize.leastsq는 다항식 맞 및 공분산 행렬을 반환 이에 맞출 수 이들은 (분석 용액을 얻었다)에 polyfit 루틴보다 훨씬 더 느리다;

파이썬은 적합 매개 변수의 공분산을 반환하는 분석 다항식 적합 루틴을 제공합니까 (또는 직접 작성해야합니까 :-)?

업데이트 : 지금 NumPy와 1.7.0, numpy.polyfit 무게를 받아 들일뿐만 아니라 계수의 공분산 행렬 ...를 반환 그래서 않습니다, 문제가 해결되지 나타납니다! :-)

+0

봐를 사용하고 있습니다. http://www.astro.rug.nl/software/kapteyn/kmpfit.html – reptilicus

+0

링크에 따르면, 이것은 다른 (일반적인) 반복 솔버입니다. 속도 때문에, 나는 다항식에 대해 완벽하게 가능한 분석적 (비 반복적) 해법을 찾고있다. –

+4

통계 모델이 무엇입니까? https://groups.google.com/forum/?fromgroups=#!topic/pystatsmodels/paCNa5sXbOo http : // statsmodels.sourceforge.net/devel/generated/statsmodels.regression.linear_model.OLS.html – joris

답변

0

추가 오버 헤드없이 공분산 행렬을 반환하는 빠른 가중치 최소 제곱 모델을 원하십니까? 일반적으로, 올바른 공분산 행렬은 데이터 생성 프로세스 (DGP)에 따라 달라질 수 있는데, 이는 DGP (오류의 역 불확실성)가 매개 변수 추정의 다른 분포를 암시하기 때문입니다 (화이트 대 OLS 표준 오류를 생각해보십시오). 그러나 WLS가 올바른 방법이라고 가정 할 수 있다면 WLS (1/n X'V^-1X)^- 1에 대한 베타에 대한 점근선 분산 추정을 사용할 것입니다. 여기서 V는 가중치 행렬입니다. Yerrs에서 만들었습니다. numpy.polynomial.polynomial.polyfit이 효과가 있다면 꽤 간단한 공식입니다.

온라인 참조를 찾았지만 찾을 수 없습니다. 그러나 Fumio Hayashi의 Ecomometrics, 2000, Princeton University press, p. 133 - 137. 파생과 토론.

업데이트 12/4/12 : 가깝게 다른 스택 오버플로 질문이 있습니다 : 당신이 원하는 것을 할 scikits.statsmodels을 사용하는 방법 (코드)가 좋은 설명을 가지고 numpy.polyfit has no keyword 'cov'. 난 당신이 라인을 교체 할 수 있습니다 믿습니다

result = sm.OLS(Y,reg_x_data).fit() 

당신이 numpy.polynomial.polynomial.polyfit와 이전과 Yerr의 함수로 무게를 정의

result = sm.WLS(Y,reg_x_data, weights).fit() 

에. 에서 WLS와 함께 통계 모델을 사용하는 방법에 대해 자세히 알아보십시오. 여기

+0

Thnx, 계산식을 알고 있습니다. 해당 코드가 이미 Python/Numpy로 구현 되었기를 바랐습니다. -이 경우가 아닌 것 같습니다 :-( –

0

는 scipy.linalg.lstsq에게 mpfit 또는 kmpfit에

import numpy as np,numpy.random, scipy.linalg 
#generate the test data 
N = 100 
xs = np.random.uniform(size=N) 
errs = np.random.uniform(0, 0.1, size=N) # errors 
ys = 1 + 2 * xs + 3 * xs ** 2 + errs * np.random.normal(size=N) 

# do the fit 
polydeg = 2 
A = np.vstack([1/errs] + [xs ** _/errs for _ in range(1, polydeg + 1)]).T 
result = scipy.linalg.lstsq(A, (ys/errs))[0] 
covar = np.matrix(np.dot(A.T, A)).I 
print result, '\n', covar 

>> [ 0.99991811 2.00009834 3.00195187] 
[[ 4.82718910e-07 -2.82097554e-06 3.80331414e-06] 
[ -2.82097554e-06 1.77361434e-05 -2.60150367e-05] 
[ 3.80331414e-06 -2.60150367e-05 4.22541049e-05]] 
+0

고맙습니다. 단일 데이터 세트 또는 심지어 각 세트에서 에러가 같은 한 여러 세트 일 수도 있지만, 일반적으로 에러는 서로 다른 세트에 대해 다를 수 있으며 각각의 경우에 서로 다른 행렬 A를 산출합니다. 'linalg.lstsq' 알고리즘 (계산 속도 때문에) 내가 원하지 않는 것은 바로 이것입니다. 또한이 일반적인 경우에는 하나의 거대한 배열 연산으로 솔루션을 계산할 수 있습니다. 이는 대단히 속도를 높입니다. 내가 알기로는 그러한 함수가 존재하지 않는다는 것을 안다. (아직 : - 나 자신을 만들려고하기 때문에) –

+0

다른 데이터 세트를 가지면, 다시 매트릭스를 만들어야한다 (어쨌든 매우 가벼운 연산 임). 그럴싸한 다시 줄기. 다른 방법은 없습니다. 행렬 계산의 성능은 ~ N^2가 될 것이기 때문에 서로 다른 카이 제곱 문제를 하나의 큰 문제로 결합 할 수있는 이득이 없다고 생각합니다. 따라서 여러 개의 작은 문제를 하나의 큰 문제보다 더 잘 풀 수 있습니다. 많은 매개 변수들. –

+0

당신은 맞습니다. 그러나 다른 카이 제곱 문제를 하나의 큰 문제로 결합하는 것은 제가 의미했던 것이 아닙니다. 저는 3 차원을 따라 다른 데이터 세트를 사용하여 하나의 3D 배열 작업에서 개별 문제를 병렬로 해결하는 것을 목표로 삼고 있습니다. 나는 이것을 '빠르고 더러웠다'고 시도했고, 나의 경우 (2 백만개의 데이터 세트)는 개별 데이터 세트를 반복하는 것보다 500 배 빠릅니다! –

관련 문제