微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 Eigen SVD 进行线性回归

如何解决使用 Eigen SVD 进行线性回归

我有一个超定的 2D 数据系统。我正在使用 Eigen 库来计算线性回归线。数据采用 A x = b 的形式,其中 A一个 nx1 矩阵,b一个 n 大小的向量。

当我运行 SVD 时,我计算了一个斜率,并且这条线通过了原点(即,没有 Y 截距)。对于具有不通过原点的趋势线的数据,这不会导致我正在寻找的线。

这是一个例子:

//Eigen
#include <Eigen/Dense>
//std
#include <cstdlib>
#include <iostream>

int main() {
  
  Eigen::MatrixXd A(15,1);
  Eigen::VectorXd b(15);

  A << -4,-4,-3,-2,-1,1,2,2;
  b << 11.8,10.9,11.5,9.6,8.4,7.4,6.2,4.8,5.4,4.5,3.5,1.5,0.1,-0.5,-2;
  
  //Calculate the SVD and solve for the regression line
  Eigen::MatrixXd x = A.bdcSvd(Eigen::ComputeThinU | Eigen::ComputeThinV).solve(b);
  Eigen::MatrixXd b_reg = A*x;

  std::cout << x << std::endl;
  std::cout << b_reg << std::endl;

  return EXIT_SUCCESS;
}

我预期的趋势线是 y = -2.079x + 2.907。我上面的程序报告 x 为 -2.714,并且这条线穿过原点。

是否有一种简单的方法可以使用 SVD 来恢复“偏移”回归线?还是我应该使用 SVD 以外的其他东西?在这种情况下,什么?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。