2013-04-18 11 views
2

둘 다 거의 동일한 결과를 제공합니다.선형 최소 제곱 다른 방법 VS QR 인수 분해의 정밀도 I는 다음과 같은 방법을 사용 scipy에서 선형 최소 제곱 문제 도끼 = B 해결을 시도

Qmat, Rmat = la.qr(A) 

bpr = dot(Qmat.T,b) 
n=len(bpr) 
x = np.zeros(n) 
for i in xrange(n-1, -1,-1): 
    x[i] = bpr[i] 
    for j in xrange(i+1, n): 
     x[i] -= Rmat[i, j]*x[j] 
    x[i] /= Rmat[i,i] 

그러나이 방법은, (1E-2의 순서에 오류가) 매우 부정확 한 결과를 제공합니다 : I 수동 그래서 예를 수행 할 QR 알고리즘을 사용하여 시도했다. 코드 또는 수학에 n00b 실수를 했습니까? 아니면이 방법에 문제가 있습니까?

내 numpy 버전은 x86_64에 Python 2.7.3과 함께 1.6.1 (mkl 컴파일 된 버전은 http://www.lfd.uci.edu/~gohlke/pythonlibs/)입니다.

답변

2

이러한 바이너리를 사용하는 경우 QR 인수 분해는 Intel MKL에서 계산되며 정확할 수 있습니다.

위의 코드는 임의의 행렬에 대해 올바른 결과 인 1e-12 내에 해결책을 제공합니다. 어떤 행렬을 테스트 했습니까? 오류를 어떻게 측정합니까?

최소 제곱 문제가 악화되는 경우가 있습니다. 예를 들어 큰 공백이있는 행렬에 대해 을 입력하면 반올림 오류가 결과에 영향을 줄 수 있습니다.

np.random.seed(1234) 
v = np.random.rand(100) 
A = v[:,None] * v[None,:] 
b = np.random.randn(100) 

x = scipy.linalg.lstsq(A, b)[0] 
print(np.linalg.norm(A.dot(x) - b)) 
# -> 9.63612833771 

# xp obtained using your above code 
print(np.linalg.norm(A.dot(xp) - b)) 
# -> 3262.61161684 

귀하의 가정 brewn 삼각형이 lstsq에 사용되는 더 신중하게 작성 LAPACK 루틴보다 오류를 반올림에 더 suspectible입니다 해결, 그래서 다소 덜 정확합니다 : 순위-1 매트릭스를 고려하십시오.

+0

최소 제곱 사인파 커브 피팅에 위의 코드를 사용하고 있으므로 A 행렬은 다음과 같이 보입니다. A = numpy.c_ [cos (a * t), cos (b * t), cos (c * t는 균등하게 이격 된 M 길이의 벡터이다. 여기서, t는 sin (a * t), sin (b * t), sin (c * t) 또한 a, b 및 c의 차이는 dt * M보다 훨씬 큽니다. 이것은 A의 열이 거의 직각이고 행렬이 전체 계급임을 의미하지 않습니까? 반올림 오류에 영향을주는 다른 요소가있을 수 있습니까? – rs1223

+0

행렬에 6 개의 열만있는 경우 벡터 't'의 길이가 6 인 경우에만 전체 랭크입니다. 또한 솔루션에서 오류를 어떻게 측정하고 있는지 지정하지 않았습니다. –

+0

여기에서 할 수있는 일은 완전한 실행 코드를 게시하고 그 코드가 출력하는 내용을 말하는 것입니다. –

0

잘라낸 고유 분해능을 사용해 볼 수도 있습니다. 즉, Y는 KC에게 u는 고유하고 lambda 선형 모델

커널 행렬의 고유 값이다

enter image description here

= .I는 최소 제곱 회귀를 정규화하기 위해 다음과 같은 코드를 사용하여 상위 k 개의 고유 값을 이용하여 평균 :

k=np.dot(X,X.T) 

다음 eigendecompostion :

w, v = scipy.linalg.eigh(k, eigvals=(lo, hi)) 
,

는 정규화에도

temp= np.dot(np.dot(v,np.diag(1.0/w)),v.T) 
c=np.dot(temp,y) 

당신은 당신이 그렇지 않으면 당신은 긍정적 인 명확한 없다는 커널 행렬을 방지 부정적인 고유있을 것입니다, 커널 행렬의 대각선에 (같은 0.001) 작은 값을 추가해야합니다.

+0

절단 된 SVD는 절단 된 고유 분해보다 수치상으로 좋은 선택 일 수 있습니다. –

+0

은 사용하지 않았지만 그 이유를 알려 주실 수 있습니까? – Moj

+0

http://www.google.com/search?q=svd+least+squares 알고 계시면 --- 다소 차이는 있지만 반올림은 적습니다. 오류, 아마도 더 효율적이며, 정규화가 더 잘 제어됩니다. –

관련 문제