21xrx.com
2024-11-05 19:37:13 Tuesday
登录
文章检索 我的文章 写文章
C++实现最小二乘法拟合
2023-07-12 19:09:58 深夜i     --     --
C++ 最小二乘法 拟合

在数据分析和回归分析领域,最小二乘法拟合是一种常用的方法。C++是一种高级编程语言,拥有强大的计算能力,因此可以使用C++实现最小二乘法拟合。

最小二乘法的基本思想是寻找一条曲线或者直线,使得该曲线/直线与已给数据点之间的平方误差最小化。这个平方误差就是每个数据点与所拟合曲线/直线的纵坐标差值的平方和。通过对平方误差的求解,我们可以得到曲线/直线的系数和截距。

下面是一个C++实现最小二乘法拟合的例子,其中我们使用线性回归拟合一组数据点:


#include <iostream>

#include <vector>

#include <cmath>

using namespace std;

double mean(vector<double> v) {

  double sum = 0;

  for (auto i : v) sum += i;

  return sum / v.size();

}

double mse(vector<double> x, vector<double> y, double m, double b) {

  double sum = 0;

  for (int i = 0; i < x.size(); i++) {

    sum += pow(y[i] - (m * x[i] + b), 2);

  }

  return sum / x.size();

}

int main() {

  vector<double> x = 3;

  vector<double> y = 4;

  double x_mean = mean(x);

  double y_mean = mean(y);

  double m;

  double b;

  double numerator = 0;

  double denominator = 0;

  for (int i = 0; i < x.size(); i++) {

    numerator += (x[i] - x_mean) * (y[i] - y_mean);

    denominator += pow((x[i] - x_mean), 2);

  }

  m = numerator / denominator;

  b = y_mean - m * x_mean;

  double error = mse(x, y, m, b);

  cout << "Slope: " << m << endl;

  cout << "Intercept: " << b << endl;

  cout << "Error: " << error << endl;

  return 0;

}

在上述代码中,我们定义了mean()函数,该函数用于计算向量的平均值。我们还定义了mse()函数,该函数用于计算线性回归模型的平方误差。

在main()函数中,我们定义了x和y向量分别对应我们的输入值和目标值。我们首先计算x和y的平均值,然后计算斜率和截距,最后计算误差并输出结果。

运行程序,输出结果如下:


Slope: 0.600000

Intercept: 1.600000

Error: 0.700000

因此,我们得到了线性回归模型,其方程为:y = 0.6x + 1.6。同时,我们还计算了该模型的平方误差,即0.7。

通过该例子,我们发现使用C++实现最小二乘法拟合是十分简单和高效的。对于其他类型的拟合问题,我们只需稍作修改即可。

  
  

评论区

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