在 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=n∑i=1nxi2−(∑i=1nxi)2n∑i=1nxiyi−∑i=1nxi∑i=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=n∑i=1nyi−a∑i=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;
}
代码解释
linear_regression
函数:- 接收两个数组
x[]
和y[]
(自变量和因变量的值),以及数据点数量n
。 - 计算总和:
sum_x
、sum_y
、sum_xx
和sum_xy
,这些是斜率和截距公式中的中间值。 - 然后根据最小二乘法公式计算斜率 a a a 和截距 b b b ,并将结果通过指针返回。
- 接收两个数组
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 xi∗yi 的和。
通过这些值,我们可以根据最小二乘法的公式计算斜率 a a a 和截距 b b b,然后用它们来表示拟合的直线。
扩展
- 多项式回归:如果数据的关系不是线性的,可以扩展这个方法来拟合高阶多项式。多项式回归的计算会涉及到更高阶的矩阵运算。
- 误差和拟合优度:可以通过计算残差(实际值与预测值之间的差距)来评估回归模型的好坏,常见的评估方法包括 均方误差(
MSE
)和 决定系数 R 2 R^2 R2。 - 异常值处理:最小二乘法对异常值比较敏感,如果数据中存在离群点,可能会影响回归结果。在实际应用中,可能需要考虑使用加权最小二乘法或其他更健壮的回归方法。
通过这个简单的实现,你可以更深入地理解最小二乘法回归的基本原理,并应用于实际的数据分析任务中。