首页 文章

矩阵形式警告的多因素线性回归

提问于
浏览
0

我在MATLAB中以矩阵形式执行多因素线性回归,我遇到了以下警告:

警告:矩阵接近单一或严重缩放 . 结果可能不准确 . RCOND = smth .

我怀疑是因为我执行线性回归的方式,我遵循标准方法,其中系数向量是 ((X'X)^(-1))*(X'Y) . 我的矩阵 X 具有以下格式:第一列只是 1 所以可以找到截距,在其他列中我使用 x -coordinates的幂(所以多项式基础模型),所以 x 然后 x^2x^3 等 . (列向量) . 我认为这个错误是由于这样一个事实,即在更高的基础上,这些值非常小,并且它会以某种方式将它们变成 NaN ,从而发出警告 .

我正在考虑使用另一种变量类型,但是double和它一样大?有没有办法强迫MATLAB不要将这些极小的值分配给 NaN ?如果这当然是MATLAB的作用 .

2 回答

  • 0

    几条评论 . (如果用符号混淆,请在末尾检查定义 . )

    出了什么问题?

    • 线性回归背后的假设之一是E [x_i * x_i '] is full rank. When you approximate the population mean E[x_i * x_i'],样本均为 X'*X / n ,您希望X'* X为满级! The error is telling you that up to machine precision, this assumption is violated!

    我猜你的一个列总是接近于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 在数字上变成时,你的条件数将通过屋顶接近排名不足 .

    • WAY在您收到此错误之前,您的估算已经是完全CRAP . 当您的X'X具有如此高的条件数时,此错误("matrix badly scaled etc...")告诉您,e ^ -16的机器精度与此病态条件矩阵相结合将使您的估计值不可靠 . 但是你的数据中的错误几乎肯定比e--16方式更大 . 出于估算目的,你的数据实际上是多线的WAY WAY .

    你应该怎么做?

    • 你可以't estimate coefficients on such high powers of x. Your data isn'足以做到这一点 . 你需要回拨这个WAY WAY,直到条件号 X'*X 合理 .

    也许你只能估计二阶多项式的系数!不要贪婪,并试图估计什么是不可能的 .

    • 使用 b = X \ y 计算您的估算值 .

    对于任何线性方程,求解Ax = c,其中x = inv(A)* c是 NOT optimal . 形成逆是不必要的 . 您可以使用 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乘1的向量 .

    • n是观察的数量 .

    • 数据矩阵X是由[x_1'; x_2'; x_3'; ...; x_n'];

    • y是一个n乘1的向量 .

    • 我们试图在线性方程 y_i = x_i' * b + e_i 中估计k乘以1矢量 b .

  • 1

    MATLAB没有引入NaN只是因为数字很小(甚至非常小) . 如果你的输入x向量中没有NaN,那么MATLAB不会将它们放入x ^ 2或x ^ 3或x ^ n .

    但是,如果您的X矩阵的一列或多列接近于零,那么您将拥有一个不适合此回归的病态矩阵 . 您需要重新考虑您尝试使用的模型(即多项式的次数) .

    顺便说一句,对于这个特定的问题,除非你需要编写自己的函数,否则你可以使用polyfit,或统计工具箱中的众多回归函数之一 .

    如果您需要编写自己的函数,请确保使用反斜杠运算符而不是 inv 函数,即使用 (X'*X)\(X'*Y) 而不是 inv(X'*X)*(X'*Y) .

相关问题