用C语言实现最小二乘法算法

随机选定10艘战舰,并分析它们的长度与宽度,寻找它们长度与宽度之间的关系。由下面的描点图可以直观地看出,一艘战舰的长度(t)与宽度(y)基本呈线性关系。散点图如下:

可以看出,战舰的长度每变化1m,相对应的宽度便要变化16cm。并由下式得到常数项b0:

在这里随机理论不加阐述。可以看出点的拟合非常好,长度和宽度的相关性大约为96.03%。 利用Matlab得到拟合直

线:

算法结果:

mean_x = 167.800003,mean_y = 18.410000a = -8.645075,b = 0.161234300m长度的战舰预测宽度为为39.725140米

源代码:

#include <stdio.h>/**********************************************************************宏定义**********************************************************************//**********************************************************************数据fifo长度**********************************************************************/#define LEN100/**********************************************************************数据结构**********************************************************************//**********************************************************************数据单元**********************************************************************/struct _Data_Unit{float x;float y;};/**********************************************************************数据fifo**********************************************************************/struct _Data{struct _Data_Unit data[LEN];int len;};/**********************************************************************全局变量**********************************************************************//**********************************************************************数据fifo**********************************************************************/struct _Data Data = {.len = 0};/**********************************************************************函数**********************************************************************//**********************************************************************压入数据*参数:x:测量数据x*y:测量数据y**********************************************************************/void push(float x,float y){int i = 0;if (Data.len < LEN){Data.data[Data.len].x = x;Data.data[Data.len++].y = y;return;}//数据移动,去掉最后一个数据for (i = 0;i < LEN – 1;i++){Data.data[i].x = Data.data[i + 1].x;Data.data[i].y = Data.data[i + 1].y;}Data.data[LEN].x = x;Data.data[LEN].y = y;Data.len = LEN;}/**********************************************************************计算估值*拟合曲线y = a * x + b*参数:x:需要估值的数的x值*返回:估值y**********************************************************************/float calc(float x){int i = 0;float mean_x = 0;float mean_y = 0;float num1 = 0;float num2 = 0;float a = 0;float b = 0;//求t,y的均值for (i = 0;i < Data.len;i++){mean_x += Data.data[i].x;mean_y += Data.data[i].y;}mean_x /= Data.len;mean_y /= Data.len;printf("mean_x = %f,mean_y = %f\n",mean_x,mean_y);for (i = 0;i < Data.len;i++){num1 += (Data.data[i].x – mean_x) * (Data.data[i].y – mean_y);num2 += (Data.data[i].x – mean_x) * (Data.data[i].x – mean_x); }b = num1 / num2;a = mean_y – b * mean_x;printf("a = %f,b = %f\n",a,b);return (a + b * x);}int main(){float length[10] = {208,152,113,227,137,238,178,104,191,130};float width[10] = {21.6,15.5,10.4,31.0,13.0,32.4,19.0,10.4,19.0,11.8};int i = 0;for (i = 0;i < 10;i++){push(length[i],width[i]);}printf("300m长度的战舰预测宽度为为%f米\n",calc(300));getchar();return 0;}

德高培身,财多伤身。

用C语言实现最小二乘法算法

相关文章:

你感兴趣的文章:

标签云: