为我的模型收集数据后:
y = b(0) + b(1)x(1) + ... + b(i)x(i)
y = Xb 其中 y 是列向量 (n*1),X 是矩阵 (n*m),b (m*1)。
我使用普通最小二乘法(OLS)在python中实现了一个解决方案来找到b。我的问题是我的解决方案完全取决于 X 是否可逆。如果 X 不是,那么我无法使用 OLS 估计 b。
有什么建议么?
谢谢。
为我的模型收集数据后:
y = b(0) + b(1)x(1) + ... + b(i)x(i)
y = Xb 其中 y 是列向量 (n*1),X 是矩阵 (n*m),b (m*1)。
我使用普通最小二乘法(OLS)在python中实现了一个解决方案来找到b。我的问题是我的解决方案完全取决于 X 是否可逆。如果 X 不是,那么我无法使用 OLS 估计 b。
有什么建议么?
谢谢。
是的,使用 SVD(奇异值分解)来求解该方程组。
万一后来有人发现,矩阵 X 是 nxm,因此对于 n 不等于 m 将永远不可逆。求解 OLS 的正规方程将涉及矩阵 X^T * X 的反转,只要 X 很高并且具有线性独立的列,这将始终是可逆的(通常情况下,如果您的测量值多于要估计的变量)。
如果 X^T * X 不可逆,您将不得不做出某种简化假设。通常,这个假设(大致)是权重 b 很小,除非有足够的数据表明其他情况。这是通过将平方问题转换为
最小化 ||Xb - y||^2 + lambda * ||b||^2
其中 lambda 是一个正标量。本质上,这会惩罚参数 b 的大值。您当然可以通过缩放 lambda 来使这个惩罚任意大或小。而不是 OLS 解决方案
b_ols = inv(X^T * X) * X^T * y
你可以做数学来找到正则化问题的解决方案是
b_reg = inv(X^T * X + lambda * I) * X^T * y
对于 lambda 的任何正值,矩阵总是可逆的。要找到 lambda 的“好”值,您通常需要执行交叉验证之类的操作