資源簡(jiǎn)介
C++最小二乘法擬合直線,根據(jù)數(shù)據(jù)直接計(jì)算直線的斜率、截距和相似度,即擬合的好壞。
代碼片段和文件信息
#include?
#include?
using?namespace?std;
/*************************************************************************
?*?ref:http://blog.csdn.net/pl20140910/article/details/51926886
?最小二乘法擬合直線,y?=?a*x?+?b;?n組數(shù)據(jù);?r-相關(guān)系數(shù)[-11]fabs(r)->1說(shuō)明xy之間線性關(guān)系好,fabs(r)->0,xy之間無(wú)線性關(guān)系,擬合無(wú)意義
?a?=?(n*C?-?B*D)?/?(n*A?-?B*B)
?b?=?(A*D?-?B*C)?/?(n*A?-?B*B)
?r?=?E?/?F
?其中:
?A?=?sum(Xi?*?Xi)
?B?=?sum(Xi)
?C?=?sum(Xi?*?Yi)
?D?=?sum(Yi)
?E?=?sum((Xi?-?Xmean)*(Yi?-?Ymean))
?F?=?sqrt(sum((Xi?-?Xmean)*(Xi?-?Xmean)))?*?sqrt(sum((Yi?-?Ymean)*(Yi?-?Ymean)))
**************************************************************************/
void?LineFitLeastSquares(float?*data_x?float?*data_y?int?data_n)
{
????float?A?=?0.0;
????float?B?=?0.0;
????float?C?=?0.0;
????float?D?=?0.0;
????float?E?=?0.0;
????float?F?=?0.0;
????for?(int?i=0;?i ????{
????????A?+=?data_x[i]?*?data_x[i];
????????B?+=?data_x[i];
????????C?+=?data_x[i]?*?data_y[i];
????????D?+=?data_y[i];
????}
????//?計(jì)算斜率a和截距b
????float?a?b?temp?=?0;
????if(?temp?=?(data_n*A?-?B*B)?)//?判斷分母不為0
????{
????????a?=?(data_n*C?-?B*D)?/?temp;
????????b?=?(A*D?-?B*C)?/?temp;
????}
????else
????{
????
評(píng)論
共有 條評(píng)論