我在理解实现多元岭回归的函数输出时遇到了困难。我正在从头开始用Python编写这种方法的闭合形式。该闭合形式如下所示:
我有一个训练集X
,大小为100行 x 10列
,以及一个向量y
,大小为100x1
。
我的尝试如下:
def ridgeRegression(xMatrix, yVector, lambdaRange): wList = [] for i in range(1, lambdaRange+1): lambVal = i # 计算内部值 (X.T X + lambda I) xTranspose = np.transpose(x) xTx = xTranspose @ x lamb_I = lambVal * np.eye(xTx.shape[0]) # 求内部的逆,例如 (inner)**(-1) inner_matInv = np.linalg.inv(xTx + lamb_I) # 计算外部 (X.T y) outer_xTy = np.dot(xTranspose, y) # 相乘 w = inner_matInv @ outer_xTy wList.append(w) print(wList)
为了测试,我使用前5个lambda值运行它。wList
变成了5个长度为10的numpy.arrays
(我假设是对应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个斜率)?如何从这个计算中得到最小平方误差
?如果我想绘制这条线,接下来该怎么做?
我想我只是对自己在看什么感到非常困惑,因为我还在学习线性代数。
谢谢!
回答:
首先,我会修改你的岭回归函数,使其看起来如下:
import numpy as npdef ridgeRegression(X, y, lambdaRange): wList = [] # 获取`X`的标准形式 A = X.T @ X # 获取单位矩阵 I = np.eye(A.shape[0]) # 获取右侧 c = X.T @ y for lambVal in range(1, lambdaRange+1): # 设置方程 Bw = c lamb_I = lambVal * I B = A + lamb_I # 求解 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矩阵。在这种情况下,第一个系数将与y截距相关。然而,根据你的问题的上下文,你似乎对多元线性回归感兴趣。不管怎样,模型需要明确定义。一旦定义了,就可以使用返回的权重进一步分析你的数据。