直线拟合算法 代码实现C++
时间: 2024-09-11 15:11:25 浏览: 29
直线拟合是一种统计学方法,通常用于通过最小化残差平方和找到一条直线(一次函数),该直线最好地描述了数据点之间的关系。在C++中,可以使用最小二乘法来实现简单的一维或二维线性回归。这里是一个基本的单变量线性回归的简单代码示例:
```cpp
#include <iostream>
#include <cmath>
// 定义直线模型 y = mx + b
struct LinearModel {
double m; // 斜率
double b; // 截距
};
// 计算最小二乘法估计
LinearModel linearRegression(const std::vector<double>& x_data, const std::vector<double>& y_data) {
int n = x_data.size();
double sum_x = 0, sum_y = 0, sum_xy = 0, sum_xx = 0;
for (int i = 0; i < n; ++i) {
sum_x += x_data[i];
sum_y += y_data[i];
sum_xy += x_data[i] * y_data[i];
sum_xx += x_data[i] * x_data[i];
}
double m = (n * sum_xy - sum_x * sum_y) / (n * sum_xx - sum_x * sum_x);
double b = (sum_y - m * sum_x) / n;
return {m, b};
}
int main() {
std::vector<double> x_data = {1, 2, 3, 4, 5}; // 输入x坐标数据
std::vector<double> y_data = {2, 4, 6, 8, 10}; // 输入y坐标数据
LinearModel model = linearRegression(x_data, y_data);
std::cout << "斜率(m): " << model.m << "\n";
std::cout << "截距(b): " << model.b << "\n";
// 输出拟合后的直线方程 y = mx + b
for (double x : x_data) {
double y_pred = model.m * x + model.b;
std::cout << "y at x=" << x << ": " << y_pred << "\n";
}
return 0;
}
```
这个代码首先计算x和y的均值,然后利用公式求解斜率m和截距b。在`main()`函数中,它会用拟合好的模型预测每个输入x对应的y值。