欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 国际 > C语言,用最小二乘法实现一个回归模型

C语言,用最小二乘法实现一个回归模型

2024/11/14 13:02:41 来源:https://blog.csdn.net/qq_39437730/article/details/143691472  浏览:    关键词: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. 异常值处理:最小二乘法对异常值比较敏感,如果数据中存在离群点,可能会影响回归结果。在实际应用中,可能需要考虑使用加权最小二乘法或其他更健壮的回归方法。

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com