21xrx.com
2024-12-27 19:49:41 Friday
登录
文章检索 我的文章 写文章
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,即可得到拟合直线的方程。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复