c语言编写最小二乘法
时间: 2024-09-25 14:11:46 浏览: 104
在C语言中,最小二乘法是一种常用的优化算法,常用于数据拟合和线性回归等场景。下面是一个简单的例子,演示如何使用迭代法来求解二维线性方程组的最小二乘解:
```c
#include <stdio.h>
#include <math.h>
// 定义函数来计算误差平方和
double error_sum(double *x, double *y, int n, double a, double b) {
double sum = 0;
for (int i = 0; i < n; i++) {
sum += pow(a * x[i] + b - y[i], 2);
}
return sum;
}
// 使用梯度下降法求最小值
void least_squares(double *x, double *y, double *a_init, double *b_init, double learning_rate, int n, double *a, double *b) {
double m = 1.0 / n;
for (int iteration = 0; iteration < 100; iteration++) { // 设置迭代次数
double da = -(2 * m * error_sum(x, y, n, *a, *b)) * x[0]; // 求导对a的更新
double db = -(2 * m * error_sum(x, y, n, *a, *b)); // 求导对b的更新
*a -= learning_rate * da; // 更新a
*b -= learning_rate * db; // 更新b
}
}
int main() {
int n = 5; // 数据点的数量
double x[] = {1, 2, 3, 4, 5}; // 自变量数组
double y[] = {2, 3, 4, 5, 6}; // 因变量数组
double a_init = 0.5, b_init = 0.5; // 初始猜测值
double learning_rate = 0.01;
double a, b; // 最终的最小二乘解
least_squares(x, y, &a_init, &b_init, learning_rate, n, &a, &b);
printf("最小二乘解: a = %.2f, b = %.2f\n", a, b);
return 0;
}
```
这个程序首先定义了一个计算误差平方和的函数,然后使用梯度下降法逐步调整斜率a和截距b,直到找到误差平方和最小的解。
阅读全文