2014-12-15 6 views
5

Я не вижу, что не так с моим кодом для регуляризованной линейной регрессии. Нерегуляризованное меня просто это, что я достаточно уверен, правильно:Цифровая линейная регрессия с регуляризацией

import numpy as np 

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

Вот мой код для регуляризованного решения, где я не вижу, что случилось с ним:

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) 

С значение по умолчанию 0.0 для ягненка, я предполагаю, что он должен дать тот же результат, что и (правильная) нерегулярная версия, но разница на самом деле довольно велика.

Кто-нибудь видит, в чем проблема?

+0

Я начинаю упорядочению, и будет Регуляризация линейной регрессии производят кривую? – duldi

+1

Нет. Вы все равно получите линейные коэффициенты. Регуляризация просто изменит наклон. –

ответ

6

Проблема заключается в том:

features.transpose().dot(features) не может быть обратимым. И numpy.linalg.inv работает только для полноразмерной матрицы в соответствии с документами. Однако (ненулевой) член регуляризации всегда делает уравнение невырожденным.

Кстати, вы правы в реализации. Но это не эффективно. Эффективным способом решения этого уравнения является метод наименьших квадратов.

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()' более совершенен? –

Смежные вопросы