我试图找到最小化 w \in \mathbb{R}^n :
\min{w} |Aw-y|^2 + \lambda |w|^2
对于 A \in \mathbb{R}^{m imes n} 和 y \in \mathbb{R}^{m}
根据维基百科,显式解决方案由以下方式给出:
w = (X^TX + \lam 1)^{-1} X^T y
所以我用Python实现了这个:
w = np.linalg.solve(X.T@X+lam*np.eye(n), X.T@y)
但这在某种程度上给了我一个与专业实施截然不同的w:
from sklearn.linear_model import Ridge
clf = Ridge(alpha=lam)
clf.fit(X,y)
w = clf.coef_
有人可以快速发现我做错了什么吗,谢谢!
请注意,sklearn Ridge 类默认将 fit_intercept 设置为 True,这意味着它正在尝试拟合类型的模型:
w_1x_1 + ... + w_nx_n + b
如果您提供的数学解决方案在计算中缺少额外的 b 项,因此您将得到不同的结果。
为了修复它,有两种选择:
clf = Ridge(alpha=alpha, fit_intercept=False)
2.在特征矩阵中添加额外的 1 列,即:
X = np.concatenate([X, np.ones((m, 1))], axis=1)
尝试每一个都会导致数学公式和 sklearn 实现的岭回归得到相同的结果。