我的正则化线性回归代码似乎有问题。未正则化的版本如下,我相当确定这是正确的:
import numpy as npdef 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)
使用lamb的默认值0.0时,我的意图是它应该与(正确)的未正则化版本给出相同的结果,但实际上差异相当大。
有谁能看出问题出在哪里吗?
回答:
问题在于:
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))