21xrx.com
2025-03-17 14:23:34 Monday
文章检索 我的文章 写文章
C++实现最小二乘法拟合直线
2023-07-07 20:40:14 深夜i     --     --
C++ 最小二乘法 拟合直线 线性回归 数学模型

最小二乘法是一种常用的数学方法,用于找到最适合数据点的线性函数。这种方法可以在C++中使用,以帮助您拟合一个直线。

最小二乘法的主要思路是找到与给定数据最接近的直线。C++中可以通过使用定义函数和数据结构来实现这一点。对于每个数据点,需要首先定义一个结构,来记录数据的X和Y值。此外,需要定义一个包括所有数据点的向量,记录数据点的数量。

下一步,需要定义一个函数来计算拟合直线的斜率和截距。这个函数可以采用以下步骤:

1. 计算所有数据点的平均值。

2. 根据平均值计算每个数据点到平均值的偏差。

3. 计算每个数据点之间的协方差。

4. 计算斜率和截距。

在最后一步中,要记得检查斜率是否合理,排除由于数据偏差所引起的异常情况。

实现以上步骤后,即可使用C++代码实现拟合直线。下面是一个基本的代码框架:

#include <iostream>
#include <cmath>
#include <vector>
struct DataPoint y;
;
double CalcSlope(std::vector<DataPoint>& data) {
  double sum_xy = 0, sum_x = 0, sum_y = 0, sum_x_pow2 = 0;
  int n = data.size();
  for (int i = 0; i < n; i++) {
    sum_xy += data[i].x * data[i].y;
    sum_x += data[i].x;
    sum_y += data[i].y;
    sum_x_pow2 += data[i].x * data[i].x;
  }
  double mean_x = sum_x / n;
  double mean_y = sum_y / n;
  double cov_xy = sum_xy / n - mean_x * mean_y;
  double var_x = sum_x_pow2 / n - mean_x * mean_x;
  double slope = cov_xy / var_x;
  return slope;
}
double CalcIntercept(std::vector<DataPoint>& data, double slope) {
  double sum_x = 0, sum_y = 0;
  int n = data.size();
  for (int i = 0; i < n; i++) {
    sum_x += data[i].x;
    sum_y += data[i].y;
  }
  double mean_x = sum_x / n;
  double mean_y = sum_y / n;
  double intercept = mean_y - slope * mean_x;
  return intercept;
}
int main() {
  std::vector<DataPoint> data = { 2, 2, 3, 7, 8};
  double slope = CalcSlope(data);
  double intercept = CalcIntercept(data, slope);
  std::cout << "Slope: " << slope << std::endl;
  std::cout << "Intercept: " << intercept << std::endl;
  return 0;
}

这个例子基于一个包含5个数据点的向量。您可以在向量中添加或删除数据点,以便测试其他数据集。每个数据点的X和Y值存储在`DataPoint`结构中。`CalcSlope`和`CalcIntercept`函数分别计算拟合直线的斜率和截距。

运行这个程序会输出计算出来的斜率和截距。将它们代入公式y = mx + b,即可得到拟合直线的方程。

  
  

评论区

    相似文章