700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 最小二乘法线性拟合及其代码实现(C语言)

最小二乘法线性拟合及其代码实现(C语言)

时间:2021-06-14 15:10:03

相关推荐

最小二乘法线性拟合及其代码实现(C语言)

文章目录

前言一、最小二乘法二、代码实现(C语言)三、缺陷与不足1. 对异常值很敏感2. 没有考虑自变量的误差3. 存在不可求解的情况总结参考

前言

最小二乘法是最常用的数据拟合方法。本文从最小二乘法概念入手,介绍了其线性拟合的机理;之后通过C语言进行了算法实现;最后阐述了最小二乘法线性拟合的缺点与不足

一、最小二乘法

最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。

以最简单的yyy关于xxx的线性方程:y=β0+β1xy=β_0+β_1xy=β0​+β1​x为例。 假设给出的若干点的坐标为:( x1,y1x_1 , y_1x1​,y1​ ) , ( x2,y2x_2 , y_2x2​,y2​) ⋯( xj,yjx_j , y_jxj​,yj​) ⋯( xn,ynx_n , y_nxn​,yn​); 定义纵坐标yyy的残差ResidualResidualResidual为估计值与观测值之差,公式如下:

Residual=yi−(β0+β1x)Residual = y_i - (β_0+β_1x)Residual=yi​−(β0​+β1​x);

β0=nΣyi‾−nβ1Σxi‾β_0 = ^{\underline{Σ{y_i}}}_{n}- ^{\underline{β_1Σ{x_i}}}_{n}β0​=nΣyi​​​−nβ1​Σxi​​​

β1=nΣxi2−(Σxi)2nΣxiyi−ΣxiΣyi‾β_1 = ^{\underline{nΣ{x_iy_i}-Σ{x_i}Σ{y_i}}}_{nΣ{x_i}^2-(Σ{x_i})^2}β1​=nΣxi​2−(Σxi​)2nΣxi​yi​−Σxi​Σyi​​​

一般最小二乘法的目的是使拟合误差(残差和)最小,即最小二乘法就是找到一组直线的参数,使得目标函数最小。

二、代码实现(C语言)

代码如下:

/**************************************************************/// 最小二乘法线性拟合(y = β0 + β1x)// 注:本程序仅考虑因变量y存在误差的情况,自变量给定为X_sample/**************************************************************/float β1;float β0;const int16_t X_sample[100] ={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100};//平方和float Square_sum(int16_t* data, uint16_t len){uint16_t i;float z = 0;for (i = 0; i < len; i++){z = z + (*data)*(*data);data++;}return z;}//向量积float X_By_Y(int16_t* X, int16_t* Y, uint16_t len){uint16_t i;float z = 0;for (i = 0; i < len; i++){z = z + X[i] * Y[i];}return z;}//最小二乘法线性拟合float Line_fit(int16_t *data, uint16_t len){float X_square= Square_sum((int16_t*)X_sample, len);float X_multiply_Y = X_By_Y((int16_t*)X_sample, data, len);float X_sum = SFLeaSum16s((int16_t*)X_sample, len);float Y_sum = SFLeaSum16s(data, len);β0= (X_square*Y_sum - X_sum*X_multiply_Y)/(len*X_square - X_sum*X_sum);β1= (len*X_multiply_Y - Y_sum*X_sum)/(len*X_square - X_sum*X_sum);return β1;}float Line_return(int16_t X){return β0 + β1*X;}

三、缺陷与不足

1. 对异常值很敏感

观察其代数解法的结果,最小二乘法仅使用了点的均值和方差信息,因此仅适用于存在普通噪声的情况,当存在异常值时,一般最小二乘法对异常值很敏感,可能会改变最后的结果,需采用其他方法解决。

2. 没有考虑自变量的误差

只有当自变量不存在偏差,或者自变量的偏差在一定范围内可以忽略不计时,最小二乘法才比较适用。因为一般最小二乘法仅考虑了因变量yyy存在误差的情况,没有考虑自变量xxx的误差,所以其应用条件有一定的限制。

3. 存在不可求解的情况

当要拟合的直线是垂直或接近垂直于xxx轴时,斜率无穷大,最小二乘法不适用。

总结

1)最小二乘法是最常用的数据拟合方法,通过最小化误差的平方和寻找数据的最佳函数匹配;

2)最小二乘法仅使用了点的均值和方差信息,对异常值很敏感;

3)最小二乘法仅考虑了因变量yyy存在误差的情况,但当点的横纵坐标都存在误差,而且都不能忽略时,一般最小二乘法不适用;

4)最小二乘法存在不可求解的情况(拟合的直线是垂直或接近垂直于xxx轴)。

以上便是本文的全部内容,希望本文能对大家理解和运用最小二乘法进行线性拟合有所帮助。

当然,本文内容如有错误或不严谨之处,也恳请大家及时指出,谢谢!

参考

线性回归——最小二乘法拟合 - David Xu - 博客园

线性拟合1-最小二乘法_ningzian的博客-CSDN博客

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。