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

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 = a x + b y=ax+b y=ax+b
其中, a a a是斜率, b b b 是截距。最小二乘法通过以下公式来计算 a a a b b b

  • 斜率 a a a 计算公式:

    a = n ∑ i = 1 n x i y i − ∑ i = 1 n x i ∑ i = 1 n y i n ∑ i = 1 n x i 2 − ( ∑ i = 1 n x i ) 2 a= \frac{n \sum_{i=1}^{n} x_i y_i - \sum_{i=1}^{n} x_i \sum_{i=1}^{n} y_i}{n \sum_{i=1}^{n} x_i^2 - (\sum_{i=1}^{n} x_i)^2} a=ni=1nxi2(i=1nxi)2ni=1nxiyii=1nxii=1nyi

  • 截距 b b b 计算公式:

    b = ∑ i = 1 n y i − a ∑ i = 1 n x i n b= \frac{\sum_{i=1}^{n} y_i - a \sum_{i=1}^{n} x_i}{n} b=ni=1nyiai=1nxi

C 语言实现

以下是一个简单的 C 程序,实现了最小二乘法来计算线性回归模型的斜率和截距:

#include <stdio.h>

// 计算最小二乘法回归模型的斜率和截距
void linear_regression(double x[], double y[], int n, double *a, double *b) {
    double sum_x = 0, sum_y = 0, sum_xx = 0, sum_xy = 0;

    // 计算各个和
    for (int i = 0; i < n; i++) {
        sum_x += x[i];
        sum_y += y[i];
        sum_xx += x[i] * x[i];
        sum_xy += x[i] * y[i];
    }

    // 计算斜率 a 和截距 b
    *a = (n * sum_xy - sum_x * sum_y) / (n * sum_xx - sum_x * sum_x);
    *b = (sum_y - (*a) * sum_x) / n;
}

int main() {
    // 一些样本数据
    double x[] = {1, 2, 3, 4, 5};  // 自变量
    double y[] = {2, 4, 5, 4, 5};  // 因变量
    int n = sizeof(x) / sizeof(x[0]);  // 数据点个数

    double a, b;
    linear_regression(x, y, n, &a, &b);

    // 输出回归模型的斜率和截距
    printf("线性回归模型: y = %.2fx + %.2f\n", a, b);

    return 0;
}

代码解释

  1. linear_regression 函数
    • 接收两个数组 x[]y[](自变量和因变量的值),以及数据点数量 n
    • 计算总和:sum_xsum_ysum_xxsum_xy,这些是斜率和截距公式中的中间值。
    • 然后根据最小二乘法公式计算斜率 a a a 和截距 b b b ,并将结果通过指针返回。
  2. main 函数
    • 定义了一些简单的样本数据 x[]y[],并计算数据点的数量 n
    • 调用 linear_regression 函数计算回归系数 a a a b b b,然后输出结果。

输出

运行该程序后,会输出拟合的线性回归模型:

线性回归模型: y = 0.60x + 2.20

数学推导

  • sum_x 是所有 x i x_i xi 的和,sum_y 是所有 y i y_i yi 的和。
  • sum_xx 是所有 x i 2 x_i^2 xi2 的和,sum_xy 是所有 x i ∗ y i x_i*y_i xiyi 的和。

通过这些值,我们可以根据最小二乘法的公式计算斜率 a a a 和截距 b b b,然后用它们来表示拟合的直线。

扩展

  1. 多项式回归:如果数据的关系不是线性的,可以扩展这个方法来拟合高阶多项式。多项式回归的计算会涉及到更高阶的矩阵运算。
  2. 误差和拟合优度:可以通过计算残差(实际值与预测值之间的差距)来评估回归模型的好坏,常见的评估方法包括 均方误差MSE)和 决定系数 R 2 R^2 R2
  3. 异常值处理:最小二乘法对异常值比较敏感,如果数据中存在离群点,可能会影响回归结果。在实际应用中,可能需要考虑使用加权最小二乘法或其他更健壮的回归方法。

通过这个简单的实现,你可以更深入地理解最小二乘法回归的基本原理,并应用于实际的数据分析任务中。


http://www.kler.cn/a/395758.html

相关文章:

  • ChatGPT登录失败的潜在原因分析
  • vue3+elementplus+虚拟树el-tree-v2+多条件筛选过滤filter-method
  • 38配置管理工具(如Ansible、Puppet、Chef)
  • 【linux】centos7 换阿里云源
  • Oracle ADB 导入 BANK_GRAPH 的学习数据
  • 从华为到创业公司
  • (附项目源码)Java开发语言,211 springboot 在线问诊系统的设计与实现,计算机毕设程序开发+文案(LW+PPT)
  • 谷歌Gemini发布iOS版App,live语音聊天免费用!
  • 基于微信小程序的乡村研学游平台设计与实现,LW+源码+讲解
  • 科锐国际,蓝禾,汤臣倍健,三七互娱,GE医疗,得物,顺丰,快手,途游游戏25秋招内推
  • 14天Java基础学习——第6天:面向对象编程(类与对象)
  • 实验1-1 顺序表的基本操作
  • ceph的集群管理
  • 计算机的错误计算(一百五十五)
  • HTML5实现俄罗斯方块小游戏
  • jenkins用户在执行scp的时候如何做免密登录
  • 【RabbitMQ】08-延迟消息
  • POD-Transformer多变量回归预测(Matlab)
  • 使用Git工具在GitHub的仓库中上传文件夹(超详细)
  • Python爬虫----python爬虫基础
  • Liunx-Ubuntu22.04.1系统下配置Anaconda+pycharm+pytorch-gpu环境配置
  • OpenAI官方发布:利用ChatGPT提升写作的12条指南
  • 低资源集群中的大语言模型分布式推理技术:Reduce、LayerNorm和Broadcast的作用
  • 基于yolov8、yolov5的鸟类分类系统(含UI界面、训练好的模型、Python代码、数据集)
  • vue使用vite-plugin-svg-icons插件组件化svg图片
  • MybatisPlus的基础使用