2014-12-15 3 views
5

규칙 선형 회귀에 대한 내 코드의 문제가 보이지 않습니다. 나는 합리적으로 확신하는 단순히이,이 Unregularized 올바른지 :정규화 된 Numpy 선형 회귀

def get_model(features, labels, lamb=0.0): 
    n_cols = features.shape[1] 
    return linalg.inv(features.transpose().dot(features) + lamb * np.identity(n_cols))\ 
      .dot(features.transpose()).dot(labels) 

으로 :

import numpy as np 

def get_model(features, labels): 
    return np.linalg.pinv(features).dot(labels) 

여기 내가 잘못이 무엇인지 표시되지 해요 정규화 솔루션에 대한 내 코드입니다 램에 대한 0.0의 기본값, 내 의도는 (정확한) 정규화되지 않은 버전과 동일한 결과를 제공해야하지만 차이는 실제로 실제로 큽니다.

문제가 무엇인지 누구에게 알 수 있습니까?

+0

내가 정규화를 시작하고, 선형 회귀 라인이 곡선을 만들어 정례화 것? – duldi

+1

아니요. 여전히 선형 계수를 얻을 수 있습니다. 정규화는 기울기를 변경합니다. –

답변

6

문제는 :

features.transpose().dot(features)

이 반전되지 않을 수 있습니다. numpy.linalg.inv는 문서에 따라 전체 등급 매트릭스에서만 작동합니다. 그러나 (0이 아닌) 정규화 용어는 항상이 방정식을 비 윤리적으로 만듭니다.

그런데, 당신은 구현에 대해 옳습니다. 그러나 그것은 효율적이지 않습니다. 이 방정식을 풀 수있는 효율적인 방법은 최소 제곱 법입니다.

np.linalg.lstsq(features, labels)np.linalg.pinv(features).dot(labels)에 대한 작업을 수행 할 수 있습니다.

일반적인 방법으로

, 당신이 할 수있는이

def get_model(A, y, lamb=0): 
    n_col = A.shape[1] 
    return np.linalg.lstsq(A.T.dot(A) + lamb * np.identity(n_col), A.T.dot(y)) 
+0

np.linalg.lstsq()를 사용하는 경우 정규화 용어'lamb'에 어떻게 들어갈 수 있습니까? –

+0

내 대답을 편집하십시오. – nullas

+0

멋지게 작동합니다! 감사. 달리 튜플을 반환 받기 때문에'np.linalg.lstsq (...) [0]'으로 끝났습니다. 또한'lstsq()'가 더 뛰어난 성능을 발휘하는 이유를 알고 계신가요? –