封闭形式岭回归

pte*_*ent 5 python regression numpy machine-learning linear-algebra

我无法理解实现多岭回归的函数的输出。我正在 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)
Run Code Online (Sandbox Code Playgroud)

为了测试,我使用前 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])
Run Code Online (Sandbox Code Playgroud)

我的问题和澄清:

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

我想我真的很困惑我在看什么,因为我仍在研究我的线性代数。

谢谢!

HAL*_*001 4

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

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
Run Code Online (Sandbox Code Playgroud)

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

我还将A=X.T@X计算、单位矩阵I生成和右侧向量c=X.T@y计算从循环中取出——这些在循环内不会改变,并且计算成本相对较高。

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

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