带有正则化的 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 线性回归的主要内容,如果未能解决你的问题,请参考以下文章

带有sklearn的numpy多项式线性回归

基于线性回归分析——boston房价预测

spark.mllib源码阅读-回归算法1-LinearRegression

岭回归和Lasso回归有啥区别?

stanford coursera 机器学习编程作业 exercise 5(正则化线性回归及偏差和方差)

机器学习算法:线性回归的改进-岭回归-黑马程序员