我在MATLAB中以矩阵形式执行多因素线性回归,我遇到了以下警告:
警告:矩阵接近单一或严重缩放 . 结果可能不准确 . RCOND = smth .
我怀疑是因为我执行线性回归的方式,我遵循标准方法,其中系数向量是 ((X'X)^(-1))*(X'Y)
. 我的矩阵 X
具有以下格式:第一列只是 1
所以可以找到截距,在其他列中我使用 x
-coordinates的幂(所以多项式基础模型),所以 x
然后 x^2
, x^3
等 . (列向量) . 我认为这个错误是由于这样一个事实,即在更高的基础上,这些值非常小,并且它会以某种方式将它们变成 NaN
,从而发出警告 .
我正在考虑使用另一种变量类型,但是double和它一样大?有没有办法强迫MATLAB不要将这些极小的值分配给 NaN
?如果这当然是MATLAB的作用 .
2 回答
几条评论 . (如果用符号混淆,请在末尾检查定义 . )
出了什么问题?
X'*X / n
,您希望X'* X为满级! The error is telling you that up to machine precision, this assumption is violated!我猜你的一个列总是接近于0,或者当你提高到高功率时,两列在数值上相似(例如,在同一行中为0或HUGE)想象一下线性方程式:
如果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
在数字上变成时,你的条件数将通过屋顶接近排名不足 .你应该怎么做?
X'*X
合理 .也许你只能估计二阶多项式的系数!不要贪婪,并试图估计什么是不可能的 .
b = X \ y
计算您的估算值 .对于任何线性方程,求解Ax = c,其中x = inv(A)* c是 NOT optimal . 形成逆是不必要的 . 您可以使用
A\c
直接求解线性系统 . 在这个问题中,您可以使用b = (X'*X) \ (X' * y);
求解系数b
并且因为\
运算符的工作方式(它解决了最小二乘意义上的超定系统),最简单的代码是:最后一点不是问题的根源,但无论如何你应该修复它 .
定义:
对于每个观察i,x_i是k乘1的向量 .
n是观察的数量 .
数据矩阵X是由[x_1'; x_2'; x_3'; ...; x_n'];
y是一个n乘1的向量 .
我们试图在线性方程
y_i = x_i' * b + e_i
中估计k乘以1矢量b
.MATLAB没有引入NaN只是因为数字很小(甚至非常小) . 如果你的输入x向量中没有NaN,那么MATLAB不会将它们放入x ^ 2或x ^ 3或x ^ n .
但是,如果您的X矩阵的一列或多列接近于零,那么您将拥有一个不适合此回归的病态矩阵 . 您需要重新考虑您尝试使用的模型(即多项式的次数) .
顺便说一句,对于这个特定的问题,除非你需要编写自己的函数,否则你可以使用polyfit,或统计工具箱中的众多回归函数之一 .
如果您需要编写自己的函数,请确保使用反斜杠运算符而不是
inv
函数,即使用(X'*X)\(X'*Y)
而不是inv(X'*X)*(X'*Y)
.