2016-10-09 7 views
0

데이터 포인트의 x 좌표와 y 좌표에 오류가있는 데이터 포인트가 있습니다. 따라서 파이썬의 ODR 도구를 사용하여 가장 적합한 경사와이 경사면의 오차를 계산하려고합니다. 나는 나의 실제 데이터를 위해 그것을 시도했지만 좋은 결과를 찾지 못한다.ODR (Orthogonal Distance Regression)에 대한 간단한 이해

import numpy as np 
import matplotlib.pyplot as plt 
from scipy.odr import * 

def linear_func(B, x): 
    return B[0]*x+B[1] 

x_data=np.array([0.0, 1.0, 2.0, 3.0]) 
y_data=np.array([0.0, 1.0, 2.0, 3.0]) 
x_err=np.array([1.0, 1.0, 1.0, 1.0]) 
y_err=np.array([5.0, 5.0, 5.0, 5.0]) 

linear=Model(linear_func) 
data=RealData(x_data, y_data, sx=x_err, sy=y_err) 
odr=ODR(data, linear, beta0=[1.0, 0.0]) 
out=odr.run() 
out.pprint() 

pprint() 라인 준다 :

Beta: [ 1. 0.] 
Beta Std Error: [ 0. 0.] 
Beta Covariance: [[ 5.20000039 -7.80000026] 
[ -7.80000026 18.1999991 ]] 
Residual Variance: 0.0 
Inverse Condition #: 0.0315397386692 
Reason(s) for Halting: 
    Sum of squares convergence 

resutling 베타 값은 1.0 및 0.0로하는 I는 것이 도시되어 다음 따라서 I 먼저 간단한 예 ODR을 사용하도록 시도 전망. 하지만 왜 표준 오류, Beta Std Error, 또한 데이터 포인트에서 내 오류가 상당히 큰 경우 모두 0입니까? 누구나 통찰력을 제공 할 수 있습니까?

답변

1

여기에는 차이가 없습니다. 예제 모델은 데이터에 완벽하게 부합하므로 데이터에 전달하는 가중치는 중요하지 않습니다. 또한, 초기 추측 beta0=[1.0, 0.0]은 최적 해를 제공하는 매개 변수 벡터이므로 ODR 기계는 매개 변수의 반복적 개선을 찾을 수 없으며 0 번 반복 후에 종료됩니다. 주어진 데이터의 경우 sum of squares (sum of squares, B=[1, 0])이 0이기 때문에 발견 된 솔루션이 다른 솔루션보다 무한히 우수하기 때문에 관련 오류는 0입니다.

회귀를 실행하기 전에 ODR.run() 함수에서 실제로 발생하는 것을 보려면 odr.set_iprint(init=2, iter=2, final=2)을 추가하십시오. 오류가 하지 0이됩니다, 그리고 중 하나를 당신의 x_datay_data 또는 경우에 동일하지 않은 경우 NITER는 정수 얼마나

--- STOPPING CONDITIONS: 
     INFO =  1 ==> SUM OF SQUARES CONVERGENCE. 
     NITER =  0   (NUMBER OF ITERATIONS) 

주 : 특히, 다음과 같은 출력은 ODR이 즉시 정지 상태에 도달 것을 확인 beta0이 최적의 솔루션과 일치하지 않습니다. 이 경우 ODR에 의해 반환 된 오류는 여전히 작지만 매우 작습니다.

+0

멋진 답변, Vlas을 보내 주셔서 감사합니다. 내가 이해할 수없는 것은 경사면에 근본적인 오류가없는 이유입니다. ODR은 오류 막대가있는 데이터가 주어진 경우 그 값뿐만 아니라 선의 기울기에 내재 된 오류를 계산하기로되어 있다고 생각했습니다. 이 방법이 아니면 경사면의 고유 오차를 어떻게 계산합니까? – user4437416

+0

'Beta Std Error'의 값은 전달한 절대 오류를 반영하지 않습니다 - 데이터 포인트에 할당 된 상대적 "가중치"만. 이러한 값이 어떻게 계산되는지는 완전히 이해하지 못했지만 아마도 ordpack [documentation] (http://docs.scipy.org/doc/external/odrpack_guide.pdf)을 통해 알아낼 수 있습니다. –

+0

'x_err'과'y_err'의 절대적인 스케일링을 고려하는 한 가지 방법은 파라미터 불확실성을'B_err = np.sqrt (np.diag (out.cov_beta))'로 대칭 적으로 계산하는 것입니다. 공분산 행렬. 위 링크 된 문서의'4.B' 절은 근사값이 얼마나 좋은지에 대해 약간 자세히 설명합니다. –