带有正则化的 Numpy 线性回归
Posted
技术标签:
【中文标题】带有正则化的 Numpy 线性回归【英文标题】:Numpy linear regression with regularization 【发布时间】:2015-02-13 03:06:06 【问题描述】:我没有看到我的正则化线性回归代码有什么问题。 Unregularized 我有这个,我有理由确定这是正确的:
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)
lamb 的默认值为 0.0,我的意图是它应该给出与(正确的)非正则化版本相同的结果,但实际上差异很大。
有人知道问题出在哪里吗?
【问题讨论】:
我正在开始正则化,正则化线性回归线会产生曲线吗? 没有。你仍然会得到线性系数。正则化只会改变斜率。 【参考方案1】:问题是:
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))
【讨论】:
如果你使用np.linalg.lstsq(),你如何适应正则化术语lamb
?
效果很好!谢谢。我最终得到了np.linalg.lstsq(...)[0]
,因为否则我会返回一个元组。另外,您是否知道为什么lstsq()
的性能更高?
lstsq() 求解线性方程。 inv() 将计算矩阵的求逆。求解线性方程将比计算反演更快。性能增益的另一部分来自 A.T.dot(A),假设 A 是 m×n,它将是 n×n 矩阵。对于大多数线性回归问题,m 远大于 n,即样本数远大于特征数。求解 n×n 线性方程将比求解 m×n 线性方程更快。
对于 Ax=b,最小二乘求解 A.T.dot(A).dot(x) = A.T.dot(b)。在这里你已经解决了一个最小二乘问题,所以你应该使用np.linalg.solve
而不是np.linalg.lstsq
,否则你会像我一样遇到数值问题。
Aᵀ·A + λI 保证是正定的(因此是可逆的),只要 λ ≠ 0。在这种情况下,您应该使用solve
而不是lstsq
,因为它更快且数值更精确。以上是关于带有正则化的 Numpy 线性回归的主要内容,如果未能解决你的问题,请参考以下文章
spark.mllib源码阅读-回归算法1-LinearRegression