c++实现最小二乘拟合y=kx+b
时间: 2024-09-10 08:19:55 浏览: 103
在 C++ 中实现最小二乘法求解线性回归方程 \( y = kx + b \) 的过程通常涉及到数组操作、矩阵运算以及优化算法。这里是一个简单的步骤概述:
1. **收集数据**:首先,你需要有一个包含 x 和对应的 y 值的数据集。
2. **初始化**:创建两个一维数组或向量 `x_data` 和 `y_data` 存储数据,以及两个变量 `m` (斜率) 和 `b` (截距) 来存储结果。
3. **计算均值**:分别计算 x 和 y 的平均值(均值常用于消除数据集的偏移)。
4. **计算协方差和自相关**:计算 `cov_x_y`(x 和 y 的协方差),`mean_x`(x 的平均值),`mean_y`(y 的平均值)。
- `cov_x_y = sum((x_data - mean_x) * (y_data - mean_y)) / (n - 1)`
- 其他均值类似,`mean_x = sum(x_data) / n`
5. **求解斜率**:利用公式 `k = cov_x_y / var_x`,其中 `var_x = sum((x_data - mean_x)^2) / (n - 1)` 是 x 的方差。
6. **计算截距**:`b = mean_y - k * mean_x`。
7. **验证**:你可以使用计算得到的斜率和截距对数据点进行拟合,看看误差是否最小。
这只是一个基础版本的实现,实际应用中可能会引入迭代算法(如梯度下降法)以处理大规模数据或复杂情况。下面是一个简单的代码示例:
```cpp
#include <iostream>
#include <vector>
double mean(const std::vector<double>& data) {
double sum = 0;
for (auto& d : data)
sum += d;
return sum / data.size();
}
double variance(const std::vector<double>& data, double mean) {
double sum = 0;
for (auto& d : data)
sum += pow(d - mean, 2);
return sum / (data.size() - 1);
}
std::pair<double, double> leastSquaresFit(std::vector<double> x_data, std::vector<double> y_data) {
double x_mean = mean(x_data), y_mean = mean(y_data);
double cov_x_y = 0, var_x = variance(x_data, x_mean);
if (var_x > 0) {
cov_x_y = (x_data.size() * std::inner_product(x_data.begin(), x_data.end(), y_data.begin(), 0.0) - x_mean * y_data.sum()) / var_x;
// 计算斜率和截距
double k = cov_x_y / var_x;
double b = y_mean - k * x_mean;
return {k, b};
}
else {
throw std::runtime_error("Invalid data, zero variance");
}
}
int main() {
std::vector<double> x_data = {1, 2, 3, 4, 5}; // 假设这是你的 x 值
std::vector<double> y_data = {2, 4, 6, 8, 10}; // 对应的 y 值
auto fit = leastSquaresFit(x_data, y_data);
std::cout << "斜率 k = " << fit.first << ", 截距 b = " << fit.second << std::endl;
return 0;
}
```
阅读全文
相关推荐
















