【问题标题】:Eigen OLS vs python statsmodel.api.OLS特征 OLS 与 python statsmodel.api.OLS
【发布时间】:2022-07-24 04:47:15
【问题描述】:

我需要计算斜率,线的截距,以便在 2 个向量与数据之间进行回归。所以我用python下面的代码做了一个原型:

A = [1,2,5,7,14,17,19]
b = [2,14,6,7,13,27,29]

A = sm.add_constant(A)
results = sm.OLS(A, b).fit()

print(\"results: \", results.params)

输出:[0.04841897 0.64278656]

现在我需要在C++ 中使用Eigen lib 复制它,据我所知,我需要在A 的矩阵中传递1 列。如果这样做,我得到的回归结果与不使用第二列或0 列时完全不同。 C++ 代码如下:

Eigen::VectorXd A(7);
Eigen::VectorXd b(7);

A << 1,2,5,7,14,17,19;
b << 2,14,6,7,13,27,29;

MatrixXd new_A(A.rows(), 2);
VectorXd d = VectorXd::Constant(A.rows(), 1);
new_A << A, d;

Eigen::MatrixXd res = new_A.bdcSvd(Eigen::ComputeThinU | Eigen::ComputeThinV).solve(b);

cout << \" slope: \" << res.coeff(0, 0) << \" intercept: \" << res.coeff(1, 0) << endl;
cout << \"dbl check: \" << (new_A.transpose() * new_A).ldlt().solve(new_A.transpose() * b) << endl;

将 \'1\' 列添加到 new_A -> 斜率的输出:1.21644 截距: 2.70444 输出带有 \'0\' 或未添加列 -> 斜率:0.642787 截距:0

如何在C++ 中获得相同的结果?哪一个是正确的,我似乎更信任 python 一个,因为当我使用 0 列时我得到了相同的结果。

谢谢你,

梅林

    标签: python c++ linear-regression eigen statsmodels


    【解决方案1】:

    看来我必须用 b 反转 new_A,并用 ComputeFull 替换 ComputeThin 以便它构建。

    Eigen::MatrixXd res = b.bdcSvd(Eigen::ComputeFullU | Eigen::ComputeFullV).solve(new_A);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-30
      • 2015-12-31
      • 2014-05-11
      • 2017-05-12
      • 2020-10-27
      • 2023-04-02
      • 2020-03-06
      • 1970-01-01
      相关资源
      最近更新 更多