c语言实现最小二乘法算法
时间: 2024-09-04 10:04:54 浏览: 78
在C语言中,我们可以使用最小二乘法(Least Mean Square, LMS)算法来解决线性回归问题,即找到一条直线或超平面,使得所有数据点到这条直线的垂直距离平方和最小。下面是一个简单的二维线性回归的最小二乘法实现示例:
```c
#include <stdio.h>
#include <math.h>
// 简化版的二维线性模型
typedef struct {
double m; // 斜率
double b; // 截距
} LineModel;
// 计算残差平方和
double residual_sum_of_squares(const double* x_data, const double* y_data, int n, const LineModel& line) {
double sum = 0;
for (int i = 0; i < n; ++i) {
sum += pow(line.m * x_data[i] + line.b - y_data[i], 2);
}
return sum;
}
// 使用最小二乘法求解最佳拟合线
void least_square_fit(double* x_data, double* y_data, int n, LineModel* result) {
double n_term = n, x_sum = 0, y_sum = 0, xy_sum = 0, x_pow_sum = 0;
for (int i = 0; i < n; ++i) {
x_sum += x_data[i];
y_sum += y_data[i];
xy_sum += x_data[i] * y_data[i];
x_pow_sum += x_data[i] * x_data[i];
}
*result = (LineModel) { (x_pow_sum * n - x_sum * x_sum) / (n * x_pow_sum - x_sum * x_sum),
(y_sum * n_x_pow_sum - xy_sum) / (n * x_pow_sum - x_sum * x_sum) };
}
int main() {
// 假设我们有样本数据...
double x_data[] = {1, 2, 3, 4, 5};
double y_data[] = {2, 4, 6, 8, 10};
// 初始化结果模型
LineModel line;
// 计算最佳拟合线
least_square_fit(x_data, y_data, sizeof(x_data) / sizeof(x_data[0]), &line);
// 输出结果
printf("斜率: %.2f\n", line.m);
printf("截距: %.2f\n", line.b);
return 0;
}
```
阅读全文