最小二乘法的嵌入式C语言实现
生活随笔
收集整理的這篇文章主要介紹了
最小二乘法的嵌入式C语言实现
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1. 最小二乘法
首先舉個(gè)例子。
針對(duì)線性最小二乘法即直線擬合,如下圖(來自維基百科)所示:
根據(jù)已有的數(shù)據(jù)(圖中的點(diǎn)),來做出一條最貼近數(shù)據(jù)發(fā)展趨勢(shì)的直線。
通過這條直線,我們可以對(duì)未來的數(shù)據(jù)進(jìn)行預(yù)測(cè),因?yàn)榛緯?huì)落在這條直線附近。
當(dāng)然了,最小二乘法不只是直線,還可以是曲線,本文不討論。
?
2. 求解直線方程
我們現(xiàn)在要做的,就是求解直線方程。
假設(shè)已知有N個(gè)點(diǎn),設(shè)這條直線方程為: ?y = a·x + b
其中,a和b的計(jì)算公式如下:
3. 算法代碼
#define DEFAULT_EPS 1e-15STATUS LeastSquareLinearFit(double *x, double *y, const int num, double *a, double *b) {int i = 0;double denominator = 0.0;double sum_xsquared = 0.0;double sum_y = 0.0;double sum_x = 0.0;double sum_xy = 0.0;for (i = 0; i < num; ++i){sum_xsquared += x[i] * x[i];sum_y += y[i];sum_x += x[i];sum_xy += x[i] * y[i];}denominator = (num * sum_xsquared - sum_x * sum_x);if ( fabs(denominator) <= DEFAULT_EPS ){return -1;}*a = (num * sum_xy - sum_x * sum_y) / denominator;*b = (sum_xsquared * sum_y - sum_x * sum_xy) / denominator;return 0; }?
總結(jié)
以上是生活随笔為你收集整理的最小二乘法的嵌入式C语言实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 124-统计学概率论之二项分布
- 下一篇: JAVA过滤器以及拦截器的基本介绍以及使