簡體   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