当前位置: 首页 > news >正文

【物联网】简要介绍最小二乘法—C语言实现

最小二乘法是一种常用的数学方法,用于拟合数据和寻找最佳拟合曲线。它的目标是找到一个函数,使其在数据点上的误差平方和最小化。
在这里插入图片描述


文章目录

    • 基本原理
    • 最小二乘法的求解
    • 应用举例
    • 使用C语言实现最小二乘法
    • 总结


基本原理

假设我们有一组数据点 ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x n , y n ) (x_1, y_1), (x_2, y_2), ..., (x_n, y_n) (x1,y1),(x2,y2),...,(xn,yn),我们想要找到一个函数 y = f ( x ) y = f(x) y=f(x),使得这个函数能够最好地拟合这些数据点。最小二乘法的基本思想是,我们要找到一个函数 y = f ( x ) y = f(x) y=f(x),使得所有数据点到这个函数的距离的平方和最小。

我们定义每个数据点到函数的距离为残差 r e s i d u a l i residual_i residuali,即 r e s i d u a l i = y i − f ( x i ) residual_i = y_i - f(x_i) residuali=yif(xi)。我们的目标是最小化所有残差的平方和,即最小化误差平方和 S = ∑ i = 1 n r e s i d u a l i 2 S = \sum_{i=1}^{n} residual_i^2 S=i=1nresiduali2


最小二乘法的求解

为了求解最小二乘法问题,我们需要选择一个合适的函数形式 y = f ( x ) y = f(x) y=f(x)。常见的函数形式包括线性函数、多项式函数、指数函数等。以线性函数 y = a x + b y = ax + b y=ax+b为例,我们可以通过最小化误差平方和 S S S来求解系数 a a a b b b

首先,我们定义一个目标函数 J ( a , b ) J(a, b) J(a,b),即 J ( a , b ) = ∑ i = 1 n ( y i − ( a x i + b ) ) 2 J(a, b) = \sum_{i=1}^{n} (y_i - (ax_i + b))^2 J(a,b)=i=1n(yi(axi+b))2。我们的目标是找到使得 J ( a , b ) J(a, b) J(a,b)最小的 a a a b b b。为了达到这个目标,我们需要求解目标函数的偏导数,并令其为0。

对于目标函数 J ( a , b ) J(a, b) J(a,b),我们分别对 a a a b b b求偏导数,并令其为0,即:

∂ J ∂ a = 0 \frac{\partial J}{\partial a} = 0 aJ=0

∂ J ∂ b = 0 \frac{\partial J}{\partial b} = 0 bJ=0

通过求解上述方程组,我们可以得到 a a a b b b的解,从而得到最佳拟合直线。


应用举例

最小二乘法在实际应用中具有广泛的应用。例如,在经济学中,最小二乘法可以用于估计经济模型的参数。在物理学中,最小二乘法可以用于拟合实验数据并得到物理定律的参数。在机器学习中,最小二乘法可以用于线性回归问题。

下面以线性回归问题为例,假设我们有一组房屋面积和价格的数据点,我们想要找到一个线性函数,使得能够最好地拟合这些数据点。我们可以使用最小二乘法来求解线性函数的参数。

假设我们的数据点为 ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x n , y n ) (x_1, y_1), (x_2, y_2), ..., (x_n, y_n) (x1,y1),(x2,y2),...,(xn,yn),我们要找到一个线性函数 y = a x + b y = ax + b y=ax+b,使得误差平方和 S = ∑ i = 1 n ( y i − ( a x i + b ) ) 2 S = \sum_{i=1}^{n} (y_i - (ax_i + b))^2 S=i=1n(yi(axi+b))2最小化。

通过求解目标函数的偏导数,并令其为0,我们可以得到 a a a b b b的解。最终,我们可以得到最佳拟合直线的参数。


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

#include <stdio.h>// 定义最大数据点数量
#define MAX_DATA_POINTS 100// 定义数据点结构体
typedef struct {double x;double y;
} DataPoint;// 定义线性回归函数
void linearRegression(DataPoint* data, int n, double* a, double* b) {double sumX = 0, sumY = 0, sumXY = 0, sumX2 = 0;for (int i = 0; i < n; i++) {sumX += data[i].x;sumY += data[i].y;sumXY += data[i].x * data[i].y;sumX2 += data[i].x * data[i].x;}double denominator = n * sumX2 - sumX * sumX;*a = (n * sumXY - sumX * sumY) / denominator;*b = (sumY * sumX2 - sumX * sumXY) / denominator;
}int main() {int n;DataPoint data[MAX_DATA_POINTS];// 输入数据点数量printf("Enter the number of data points: ");scanf("%d", &n);// 输入数据点的 x 和 y 值printf("Enter the data points (x, y):\n");for (int i = 0; i < n; i++) {printf("Data point %d: ", i+1);scanf("%lf %lf", &data[i].x, &data[i].y);}double a, b;linearRegression(data, n, &a, &b);// 输出线性回归的结果printf("Linear regression equation: y = %.2fx + %.2f\n", a, b);return 0;
}

该代码实现了一个简单的线性回归函数linearRegression,该函数接受一个数据点数组和数据点数量作为输入,并计算出最佳拟合直线的参数。在main函数中,我们首先输入数据点的数量和具体数值,然后调用linearRegression函数进行线性回归计算,并输出最佳拟合直线的方程。

请注意,该代码仅实现了简单的线性回归,如果需要拟合其他类型的函数,需要相应地修改linearRegression函数的实现。


总结

最小二乘法是一种常用的数学方法,用于拟合数据和寻找最佳拟合曲线。它的基本原理是最小化数据点到拟合函数的距离的平方和。通过求解目标函数的偏导数,并令其为0,我们可以得到最佳拟合函数的参数。最小二乘法在各个领域都有广泛的应用,是一种非常有用的工具。

http://www.lryc.cn/news/166766.html

相关文章:

  • 慢查询SQL如何优化
  • UART 通信-使用VIO进行板级验证
  • linux 查看可支持的shell
  • 微服务简介
  • PHP自己的框架2.0设置常量并绑定容器(重构篇三)
  • 重建大师提交空三后引擎状态是等待,怎么开启?
  • 【数据结构】堆的向上调整和向下调整以及相关方法
  • 【蓝桥杯选拔赛真题60】Scratch旋转风车 少儿编程scratch图形化编程 蓝桥杯选拔赛真题解析
  • JavaSE、JavaEE与Spring的概念和异同点剖析以及规范13 个分析
  • 微信小程序的图书馆图书借阅 座位预约系统 读者端设计与实现
  • 在阿里云 linux 服务器上查看当前服务器的Nginx配置信息
  • 专业招投标书翻译怎样做比较好
  • 算法总结10 线段树
  • 518抽奖软件,支持按人像照片抽奖
  • 数字IC笔试面试题之--时钟偏斜(skew)与抖动(jitter)
  • 免费api接口:物流api,企业工商查询api,游戏api。。。
  • 第二十八章 Classes - 引用其他类的方法
  • Android 中集成 TensorFlow Lite图片识别
  • NSSCTF之Misc篇刷题记录(16)
  • 域名解析--nslookup和dig
  • EXCEL如何把一个单元格内的文本和数字分开?例如:龚龚15565 = 龚龚 15565
  • uniapp抽取组件绑定事件中箭头函数含花括号无法解析
  • 猫头虎博主第四期赠书活动:《精通Go语言:(第2版) 》
  • 【学习总结】EasyExcel合并同列不同行,表格数据相同的行
  • Tokenview X-ray功能:深入探索EVM系列浏览器的全新视角
  • 【洛谷 P1364】医院设置 题解(图论+深度优先搜索)
  • 【Java基础】- RMI原理和使用详解
  • 无水印免费4K视频素材网站 可商用-Free Stock Video
  • kubesphere中间件部署
  • 使用 AWS S3 SDK 访问 COS-腾讯云国际站代充