下面是一个使用 C++ 实现最小二乘法的示例代码,最小二乘法用于拟合线性回归模型 y = ax + b。
#include <iostream>
#include <vector>// 定义最小二乘法函数
std::pair<double, double> leastSquares(const std::vector<double>& x, const std::vector<double>& y) {int n = x.size();double sumX = 0.0, sumY = 0.0, sumXY = 0.0, sumX2 = 0.0;// 计算所需的总和for (int i = 0; i < n; ++i) {sumX += x[i];sumY += y[i];sumXY += x[i] * y[i];sumX2 += x[i] * x[i];}// 计算斜率 a 和截距 bdouble a = (n * sumXY - sumX * sumY) / (n * sumX2 - sumX * sumX);double b = (sumY - a * sumX) / n;return std::make_pair(a, b);
}int main() {// 示例数据std::vector<double> x = {1, 2, 3, 4, 5};std::vector<double> y = {2, 4, 6, 8, 10};// 调用最小二乘法函数std::pair<double, double> result = leastSquares(x, y);double a = result.first;double b = result.second;// 输出结果std::cout << "拟合直线方程: y = " << a << "x + " << b << std::endl;return 0;
}
代码解释
leastSquares
函数:该函数接受两个std::vector<double>
类型的参数x
和y
,分别表示自变量和因变量的数据点。在函数内部,首先计算 x 的总和sumX
、y 的总和sumY
、x 与 y 乘积的总和sumXY
以及 x 的平方和sumX2
。然后根据最小二乘法的公式计算斜率 a 和截距 b,并将它们作为std::pair<double, double>
类型的结果返回。main
函数:定义了示例数据x
和y
,调用leastSquares
函数进行最小二乘法拟合,得到斜率 a 和截距 b,并将拟合直线方程输出到控制台。
你可以将示例数据替换为你自己的数据,以进行不同数据集的拟合。