繁体   English   中英

特征 OLS 与 python statsmodel.api.OLS

[英]Eigen OLS vs python statsmodel.api.OLS

我需要计算斜率,线的截距,以便在 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”列。如果我这样做,我得到的回归结果与我只使用 no 时完全不同第二列或“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 列时我得到了相同的结果。

谢谢你,

梅林

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM