2012-02-21 6 views
12

scipy lib의 leastsq 방법은 일부 데이터에 곡선을 맞 춥니 다. 그리고이 방법은이 데이터에서 Y 값이 어떤 X 인자에 의존한다는 것을 의미합니다. 그리고이를 구현하는 몇 가지 방법이 있나요 곡선과 Y 축 (DY)의 데이터 포인트scipy 최소 제곱 법에 의한 직교 회귀 분석

하지만 최소한의 양 축에서 거리 (DY 및 DX)

을 계산해야하는 경우 것 사이의 최소 거리를 계산 계산? 하나의 축을 계산을 사용하면 다음

코드의 예이다 : I 최근 scipy.odr 라이브러리 tryed

import numpy as np 
from scipy.optimize import leastsq 

xData = [some data...] 
yData = [some data...] 

def mFunc(p, x, y): 
    return y - (p[0]*x**p[1]) # is takes into account only y axis 

plsq, pcov = leastsq(mFunc, [1,1], args=(xData,yData)) 
print plsq 

및 단지 선형 함수에 대한 적절한 결과를 반환한다. y = a * x^b와 같은 다른 함수의 경우 잘못된 결과를 반환합니다. 사용 방법은 다음과 같습니다.

def f(p, x):  
    return p[0]*x**p[1] 

myModel = Model(f) 
myData = Data(xData, yData) 
myOdr = ODR(myData, myModel , beta0=[1,1]) 
myOdr.set_job(fit_type=0) #if set fit_type=2, returns the same as leastsq 
out = myOdr.run() 
out.pprint() 

이렇게하면 원하지 않는 잘못된 결과가 반환되고 일부 입력 데이터는 실제와 유사하지 않습니다. 몇 가지 특별한 사용 방법이 있습니다. 무엇을 잘못 했습니까?

+1

Scipy는 "직교 거리 회귀"에 대한 모듈을 가지고 올바른 솔루션에 저를 지시 - 당신이 무엇을 필요가있다이다? http://docs.scipy.org/doc/scipy/reference/odr.html –

+0

네,이 문제를 해결하는 것 같지만 시도 할 때 leastsq 메서드와 같은 결과를 반환합니다. 나는 문서에 나와있는 예제를 따라 갔고 필요에 따라 작동하지 않습니다. 몇 가지 실제 사례가 있습니까? – Vladimir

+0

나는 그것을 시도했을 때 그 결과가 비슷하지만 동일하지 않다는 것을 발견했다 - 나는 단지 여분의 계산이 적합에 많은 차이를주지 않는다는 것을 의미한다고 생각했다. –

답변

5

. Scipy Odrpack은 정상적으로 작동하지만 올바른 결과를 얻으려면 좋은 초기 추측이 필요합니다. 그래서 나는 그 과정을 두 단계로 나누었다.

첫 번째 단계 : 최소 제곱 법 (ordinaty least squares method)을 사용하여 초기 추측을 찾습니다.

두 번째 단계 : substitude ODR에서 이러한 초기 추측을 beta0 매개 변수로 지정합니다.

허용되는 속도로 매우 잘 작동합니다.

너희들 감사, 귀하의 조언이

+1

이 게시물은 오래된 게시물이지만 여기에 코드 스 니펫을 게시 할 수는 있습니다. 나는 암시 적 ODR을하려고 노력하고 있지만 나는 scipy에서 그것을 설정하는 방법을 모르겠습니다. – Barbarossa

+1

@Barbarossa [this code snippet] (http://blog.rtwilson.com/orthogonal-distance-regression-in-python/)을 원할 수도 있습니다. – gerrit

+0

@gerrit 정보를 제공해 주셔서 감사합니다. – Barbarossa

0

p가 설명하는 함수를 반전 할 수있는 경우 mFunc에 x-pinverted (y)를 포함하면 sqrt (a^2 + b^2)로 같음 (의사 코드)

return sqrt((y - (p[0]*x**p[1]))^2 + (x - (pinverted(y))^2) 

y=kx+m p=[m,k]  
pinv=[-m/k,1/k] 

return sqrt((y - (p[0]+x*p[1]))^2 + (x - (pinv[0]+y*pinv[1]))^2) 

에 대한 예를 들어

그러나 당신이 요청하는 경우에 문제가있다. 예를 들어, 다항식 (또는 x^j) 곡선이 y (m)에서 최소 ym을 가지며 y가 y보다 작은 점 x가있는 경우 어떤 종류의 값을 반환 하시겠습니까? 항상 해결책이있는 것은 아닙니다.

+0

점 x, y가 ym보다 작 으면 ym까지의 유사 거리를 반환해야합니다. ** sqrt ((m-x)^2 + (ym-y)^2)/2 **. 왜 이것이 문제입니까? – Vladimir

+0

당신은 y = f (x)라는 함수가 있다면 어떤 x에 대해서도 y 값이 있음을 의미합니다. Bot은 입력 y에 대해 항상 x의 값을 가지는 것은 아닙니다. 모든 기능이 반전 가능하지는 않습니다. 예를 들어 y = x^2이고 x = -2가있는 임의의 점 –

+0

아, 이제 알겠습니다. 네 말이 맞습니다. 그러나 어떤 소프트웨어가 입력 데이터에 대한 모든 함수에 대해이 최소 최소 제곱 (Deming regression)을 어떻게 맞추는 지 설명합니다. 파이썬으로 할 수있는 방법이 있어야합니다. – Vladimir

6

scipy.odr은 직교 거리 회귀를 구현합니다. 문서화 문자열에서 기본적인 사용에 대한 지침을 참조하십시오 : 나는 해결책을 발견했습니다

https://github.com/scipy/scipy/blob/master/scipy/odr/odrpack.py#L27

+0

오, 그래, 내가 그것을 tryed, 그리고 leastsq 같은 방식으로 작동, 동일한 결과를 반환 – Vladimir

+4

정확한 결과? 나는 그럴 가능성이 없다고 생각한다. 잘못된 결과를주는'scipy.odr'과 함께 실행 가능한 예제를 보여주기 위해 게시물을 업데이트 할 수 있습니까? –

관련 문제