封闭式岭回归

Posted

技术标签:

【中文标题】封闭式岭回归【英文标题】:Closed Form Ridge Regression 【发布时间】:2019-07-13 06:46:24 【问题描述】:

我无法理解实现多岭回归的函数的输出。我在 Python 中从头开始为该方法的封闭形式执行此操作。这个封闭的表格如下所示:

我有一个训练集X100 rows x 10 columns 和一个向量y100x1

我的尝试如下:

def ridgeRegression(xMatrix, yVector, lambdaRange):
    wList = []

    for i in range(1, lambdaRange+1):
        lambVal = i

        # compute the inner values (X.T X + lambda I)
        xTranspose = np.transpose(x)
        xTx = xTranspose @ x
        lamb_I = lambVal * np.eye(xTx.shape[0])

        # invert inner, e.g. (inner)**(-1)
        inner_matInv = np.linalg.inv(xTx + lamb_I)

        # compute outer (X.T y)
        outer_xTy = np.dot(xTranspose, y)

        # multiply together
        w = inner_matInv @ outer_xTy
        wList.append(w)

    print(wList)

为了测试,我使用前 5 个 lambda 值运行它。 wList 变为 5 numpy.arrays 每个长度为 10(我假设为 10 个系数)。

这是这 5 个数组中的第一个:

array([ 0.29686755,  1.48420319,  0.36388528,  0.70324668, -0.51604451,
        2.39045735,  1.45295857,  2.21437745,  0.98222546,  0.86124358])

我的问题和澄清:

不应该有 11 个系数(1 个 y 截距 + 10 个斜率)吗? 我如何从这个计算中得到Minimum Square Error? 如果我想绘制这条线,接下来会发生什么?

我想我只是对我在看什么感到很困惑,因为我仍在研究我的线性代数。

谢谢!

【问题讨论】:

请按照您创建此帐户时的建议阅读并遵循帮助文档中的发布指南。 On topic、how to ask 和 ... the perfect question 在此处申请。 *** 不是设计、编码、研究或教程资源。 @Prune 会的,谢谢! 永远不要使用倒数。 Numpy 有一个解决方法。 【参考方案1】:

首先,我会将您的岭回归修改为如下所示:

import numpy as np
def ridgeRegression(X, y, lambdaRange):
    wList = []
    # Get normal form of `X`
    A = X.T @ X 
    # Get Identity matrix
    I = np.eye(A.shape[0])
    # Get right hand side
    c = X.T @ y
    for lambVal in range(1, lambdaRange+1):
        # Set up equations Bw = c        
        lamb_I = lambVal * I
        B = A + lamb_I
        # Solve for w
        w = np.linalg.solve(B,c)
        wList.append(w)        
    return wList

请注意,我用隐式求解替换了您的 inv 调用来计算矩阵逆。这在数值上更加稳定,这对于这些类型的问题尤其重要。

我还将A=X.T@X 计算、单位矩阵I 生成和右侧向量c=X.T@y 计算排除在循环之外——这些不会在循环内改变并且计算起来相对昂贵.

正如@qwr 所指出的,X 的列数将决定您拥有的系数数。您尚未描述您的模型,因此不清楚基础域x 是如何构造成X 的。

传统上,人们可能会使用多项式回归,在这种情况下,X 是Vandermonde Matrix。在这种情况下,第一个系数将与 y 截距相关联。但是,根据您问题的上下文,您似乎对多元线性回归感兴趣。在任何情况下,模型都需要明确定义。一旦完成,则返回的权重可用于进一步分析您的数据。

【讨论】:

给定的公式建议使用正则化项的普通线性回归 谢谢@HAL9001。这帮助我找到了正确的理解方向。【参考方案2】:
    1234563有关示例,请参阅Wikipedia article on linear regression。

    要计算样本内 MSE,请使用 MSE 的定义:残差平方的平均值。要计算泛化误差,您需要交叉验证。

【讨论】:

【参考方案3】:

此外,您不应将lambVal 视为整数。如果目标只是在xTx 病态时避免数值错误,它可以很小(接近 0)。

我建议您使用对数范围而不是线性范围,从 0.001 开始,如果您愿意,可以增加到 100 或更多。例如,您可以将代码更改为:

powerMin = -3
powerMax = 3

for i in range(powerMin, powerMax):
    lambVal = 10**i
    print(lambVal)

然后,一旦您通过交叉验证的数据找出lambVal 的正确顺序,您就可以尝试更小的范围或线性范围。

【讨论】:

以上是关于封闭式岭回归的主要内容,如果未能解决你的问题,请参考以下文章

求助spss做岭回归

R语言glmnet拟合岭回归模型实战:岭回归模型的模型系数(ridge regression coefficients)及可视化岭回归模型分类评估计算(混淆矩阵accuracyDeviance)

岭回归与lasso回归算法

岭回归与lasso回归算法

岭回归与Lasso回归

Matlab岭回归(可替换数据)