[英]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.