为什么sklearn Ridge不接受热启动?

机器算法验证 回归 scikit-学习 套索 岭回归
2022-04-01 14:25:27

我正在使用 sklearn 尝试一些正则化线性回归方法,并注意到 Ridge 不接受热启动。我发现这很奇怪,因为许多其他方法都可以接受,例如 Lasso、LogisticRegression 等。

这有更深层次的原因吗?Ridge 不会从热启动中受益吗?

1个回答

岭回归可以作为线性方程组一次性求解:

β^=(XtX+λI)1Xty

所以岭回归通常用线性方程求解器来求解,就像线性回归一样。

例如 sklearn 使用矩阵的奇异值分解X

X=UDV1

将该系统重新表达为

β^=V(D2+λI)1DUty

有关此等式的推导,请参阅通过谱分解使用岭回归证明收缩系数

请注意,这个等式比看起来要好得多。D2+λI矩阵是对角的,所以反转它只是取条目的倒数。然后(D2+λI)1D也是对角线,矩阵乘积只是对角线项的乘积。

这是sklearn 的源代码

def _solve_svd(X, y, alpha):
    U, s, Vt = linalg.svd(X, full_matrices=False)
    idx = s > 1e-15  # same default value as scipy.linalg.pinv
    s_nnz = s[idx][:, np.newaxis]
    UTy = np.dot(U.T, y)
    d = np.zeros((s.size, alpha.size), dtype=X.dtype)
    d[idx] = s_nnz / (s_nnz ** 2 + alpha)
    d_UT_y = d * UTy
    return np.dot(Vt.T, d_UT_y).T

除了处理零奇异值的少量体操外,此代码与上面的等式完全一致。

另一方面,LASSO 在线性代数运算方面没有简单的表达。对于 LASSO,我们需要某种迭代求解器,因此在之前的解中重新开始迭代的概念是有意义的。