我正在嘗試編寫一個函數,它使用最小二乘方法計算數據表中的迴歸直線,但我遇到了一些嚴重的問題。避免舍入雙數
我的第一個問題是,我不知道爲什麼我的「線性迴歸」函數將迭代的結果四捨五入,即使我試圖使用其他「更大」的類型。
我的第二個問題是,我的代碼的最後一部分給了y截距(b)和斜率(a)的錯誤結果,我認爲這可能是一個轉換問題,但我不太確定。如果是這種情況,我應該怎麼做才能避免它?
void RegLin (const vector<double>& valuesX, const vector<double>& valuesY, vector<double>& PenOrd) {
unsigned int N=valuesX.size();
long double SomXi{0};
for (unsigned i=0; i<N; ++i){
SomXi+=valuesX.at(i);
}
long double SomXiXi{0};
for (unsigned i=0; i<N; ++i){ //Here is a problem (number rounded) Expected value: 937352,25/Given value: 937352
SomXiXi+=(valuesX.at(i))*(valuesX.at(i));
}
long double SomYi{0};
for (unsigned i=0; i<N; ++i){
SomYi+=valuesY.at(i);
}
long double SomXiYi{0};
for (unsigned i=0; i<N; ++i){ //Here is the same problem Excepted value: 334107,41/Given value: 334107
SomXiYi+=(valuesX.at(i))*(valuesY.at(i));
}
long double a=(SomYi*SomXiXi-SomXi*SomXiYi)/(N*SomXiXi-pow(SomXi,2)); //Bad result
long double b=(N*SomXiYi-SomYi*SomXi)/(N*SomXiXi-pow(SomXi,2)); //Bad result
PenOrd.push_back(a);
PenOrd.push_back(b);
return;
}
預先感謝您的支持
P.S:我用g ++以及2011年的C++標準。
「四捨五入結果」的描述是沒有意義的。描述你的意思(例如用一個示例輸入,預期輸出和實際輸出)。 – Peter
我不太清楚你在問什麼。但是,猜測;也許你想讀這些(並記住,浮點數學不是確切的 - 它不能):http://stackoverflow.com/questions/588004/is-floating-point-math-broken,https: //docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html –
對於a和b的公式看起來不正確。看看維基百科上的正確公式:https://en.wikipedia.org/wiki/Simple_linear_regression #Fitting_the_regression_line你在哪裏計算Xi和Yi的平均值?這是一個完整的解決方案btw:http://stackoverflow.com/a/18974171/1291717 –