矩阵形式预警中的多因素线性回归
Multiple factors linear regression in matrix form warning
我在 MATLAB 中以矩阵形式执行多因素线性回归,我遇到了以下警告:
Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND = smth.
我怀疑这是因为我执行线性回归的方式,我遵循的是系数向量为 ((X'X)^(-1))*(X'Y)
的标准方法。我的矩阵 X
具有以下格式:第一列只是全部 1
以便可以找到截距,在其他列中我使用 [=13= 的幂(因此是多项式基础模型) ]-坐标,所以 x
然后是 x^2
、x^3
等(列向量)。我认为错误的产生是由于较高的基值非常小,并且以某种方式将它们变成 NaN
,因此出现警告。
我正在考虑使用另一种变量类型,但 double 已经达到极限了吗?有没有办法强制 MATLAB 不将那些极小的值分配给 NaN
?如果那当然是 MATLAB 所做的。
MATLAB 不会仅仅因为数字很小(甚至非常小)就引入 NaN。如果您的输入 x 向量中没有 NaN,则 MATLAB 不会将它们放入 x^2 或 x^3 或 x^n。
但是,如果您的 X 矩阵的一列或多列接近于零,那么您的病态矩阵并不真正适合此回归。您需要重新考虑您尝试使用的模型(即多项式的次数)。
顺便说一句,对于这个特定的问题,除非您需要编写自己的函数,否则您可以使用 polyfit,或者统计工具箱中的众多回归函数之一。
如果您需要编写自己的函数,请确保您使用的是反斜杠运算符而不是 inv
函数,即使用 (X'*X)\(X'*Y)
而不是 inv(X'*X)*(X'*Y)
.
几条评论。 (如果对符号感到困惑,请检查最后的定义。)
怎么了?
线性回归背后的假设之一是 E[x_i * x_i'] 是满秩的。当您用样本均值 X'*X / n
近似总体均值 E[x_i * x_i'] 时,您希望 X'*X 为满秩! 错误告诉您,根据机器精度,此假设不成立!
我猜你的一列总是接近于 0,或者当你提高到高次幂时,两列在数值上变得相似(例如,同一行中的 0 或 HUGE)想象一下线性方程:
y = b1 * x1 + b2 * x2 + e
如果 x2 始终为零,您将永远无法正确估计 b2,它可能是 10,也可能是 10^10。如果 x2 始终非常接近于零,或者某些列的线性组合在数值上接近另一列,则基本相同:那么数据中微小的微小变化将导致估计值的巨大波动。用数学术语来说,发生的事情是 E[x_i * x_i'] 实际上小于满秩。
尝试一下,检查 cond(X'*X)
以提高 x 的 1 到 3 次方,检查 cond(X'*X)
以提高 x 的 1 到 4、1 到 5 次方等...在某个时候,您的条件数正在上升,因为 X'*X
在数值上接近排名不足。
在你得到这个错误之前,你的估计已经完全是废话了。这个错误 ("matrix badly scaled etc...") 告诉你什么时候你的 X'X 有如此高的条件数,e^-16 的机器精度与这个病态矩阵相结合将使你的估计不可靠。 但是您的数据中的误差几乎肯定比 e^-16 大得多出于估计的目的,您的数据实际上是多共线的。
你应该做什么?
您无法估计如此高的 x 次方的系数。您的数据不足以做到这一点。你需要往回拨,直到 X'*X
的条件数是合理的。
也许您最多只能估计二阶多项式的系数!不要贪心,不要试图估计什么是不可能的。
用 b = X \ y
计算你的估计值。
对于任何线性方程,用 x = inv(A)*c 求解 Ax = c 不是最优的。形成逆是不必要的。可以直接用A\c
求解线性系统。在这个问题中,您可以用 b = (X'*X) \ (X' * y);
求解系数 b
而且因为 \
运算符的工作方式(它在最小二乘意义上求解超定系统),最简单的代码是:
b = X \ y; % USE THIS! (you can treat as a magical incantation to solve b = inv(X'*X) * X'y
最后一点不是您问题的根源,但无论如何您都应该修复它。
定义:
- 对于每个观测值 i,x_i 是一个 k x 1 向量。
- n 是观察次数。
- 数据矩阵X是由[x_1'组成的n×k矩阵; x_2'; x_3'; ...; x_n'];
- y 是 n x 1 向量。
- 我们正在尝试通过线性方程
y_i = x_i' * b + e_i
中的 1 个向量 b
来估计 k。
我在 MATLAB 中以矩阵形式执行多因素线性回归,我遇到了以下警告:
Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND = smth.
我怀疑这是因为我执行线性回归的方式,我遵循的是系数向量为 ((X'X)^(-1))*(X'Y)
的标准方法。我的矩阵 X
具有以下格式:第一列只是全部 1
以便可以找到截距,在其他列中我使用 [=13= 的幂(因此是多项式基础模型) ]-坐标,所以 x
然后是 x^2
、x^3
等(列向量)。我认为错误的产生是由于较高的基值非常小,并且以某种方式将它们变成 NaN
,因此出现警告。
我正在考虑使用另一种变量类型,但 double 已经达到极限了吗?有没有办法强制 MATLAB 不将那些极小的值分配给 NaN
?如果那当然是 MATLAB 所做的。
MATLAB 不会仅仅因为数字很小(甚至非常小)就引入 NaN。如果您的输入 x 向量中没有 NaN,则 MATLAB 不会将它们放入 x^2 或 x^3 或 x^n。
但是,如果您的 X 矩阵的一列或多列接近于零,那么您的病态矩阵并不真正适合此回归。您需要重新考虑您尝试使用的模型(即多项式的次数)。
顺便说一句,对于这个特定的问题,除非您需要编写自己的函数,否则您可以使用 polyfit,或者统计工具箱中的众多回归函数之一。
如果您需要编写自己的函数,请确保您使用的是反斜杠运算符而不是 inv
函数,即使用 (X'*X)\(X'*Y)
而不是 inv(X'*X)*(X'*Y)
.
几条评论。 (如果对符号感到困惑,请检查最后的定义。)
怎么了?
线性回归背后的假设之一是 E[x_i * x_i'] 是满秩的。当您用样本均值
X'*X / n
近似总体均值 E[x_i * x_i'] 时,您希望 X'*X 为满秩! 错误告诉您,根据机器精度,此假设不成立!我猜你的一列总是接近于 0,或者当你提高到高次幂时,两列在数值上变得相似(例如,同一行中的 0 或 HUGE)想象一下线性方程:
y = b1 * x1 + b2 * x2 + e
如果 x2 始终为零,您将永远无法正确估计 b2,它可能是 10,也可能是 10^10。如果 x2 始终非常接近于零,或者某些列的线性组合在数值上接近另一列,则基本相同:那么数据中微小的微小变化将导致估计值的巨大波动。用数学术语来说,发生的事情是 E[x_i * x_i'] 实际上小于满秩。
尝试一下,检查
cond(X'*X)
以提高 x 的 1 到 3 次方,检查cond(X'*X)
以提高 x 的 1 到 4、1 到 5 次方等...在某个时候,您的条件数正在上升,因为X'*X
在数值上接近排名不足。在你得到这个错误之前,你的估计已经完全是废话了。这个错误 ("matrix badly scaled etc...") 告诉你什么时候你的 X'X 有如此高的条件数,e^-16 的机器精度与这个病态矩阵相结合将使你的估计不可靠。 但是您的数据中的误差几乎肯定比 e^-16 大得多出于估计的目的,您的数据实际上是多共线的。
你应该做什么?
您无法估计如此高的 x 次方的系数。您的数据不足以做到这一点。你需要往回拨,直到
X'*X
的条件数是合理的。也许您最多只能估计二阶多项式的系数!不要贪心,不要试图估计什么是不可能的。
用
b = X \ y
计算你的估计值。对于任何线性方程,用 x = inv(A)*c 求解 Ax = c 不是最优的。形成逆是不必要的。可以直接用
A\c
求解线性系统。在这个问题中,您可以用b = (X'*X) \ (X' * y);
求解系数b
而且因为\
运算符的工作方式(它在最小二乘意义上求解超定系统),最简单的代码是:b = X \ y; % USE THIS! (you can treat as a magical incantation to solve b = inv(X'*X) * X'y
最后一点不是您问题的根源,但无论如何您都应该修复它。
定义:
- 对于每个观测值 i,x_i 是一个 k x 1 向量。
- n 是观察次数。
- 数据矩阵X是由[x_1'组成的n×k矩阵; x_2'; x_3'; ...; x_n'];
- y 是 n x 1 向量。
- 我们正在尝试通过线性方程
y_i = x_i' * b + e_i
中的 1 个向量b
来估计 k。