C++ 多元线性回归:最小二乘法拟合 100 组数据
C++ 多元线性回归:最小二乘法拟合 100 组数据
本文将使用 C++ 语言,通过最小二乘法对 100 组多元数据进行拟合。每组数据包含三个自变量 x1、x2、x3 和一个因变量 y,目标是构建一个多变量的线性模型,根据三个自变量和因变量的变化规律进行拟合。模型格式为:
y = a1x1 + a2x2 + a3x3 + a0
其中,a0 为常数项,a1、a2、a3 为系数。
代码实现
由于数据存放位置不确定,以下代码仅提供实现思路,需要根据实际情况进行修改:
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
const int N = 100; // 数据组数
const int M = 4; // 自变量个数(包括常数项)
double x[N][M]; // 自变量
double y[N]; // 因变量
void input_data() {
ifstream fin('C:/Users/用户名/Desktop/data.txt'); // 数据存放路径
for (int i = 0; i < N; i++) {
fin >> x[i][1] >> x[i][2] >> x[i][3] >> y[i];
x[i][0] = 1; // 常数项
}
fin.close();
}
void least_squares(double a[]) {
double X[N][M]; // 设计矩阵
double Xt[M][N]; // 设计矩阵的转置
double XtX[M][M] = { 0 }; // (XtX)-1
double XtY[M] = { 0 }; // XtY
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
X[i][j] = x[i][j];
Xt[j][i] = x[i][j];
}
}
// 计算 (XtX)-1 和 XtY
for (int i = 0; i < M; i++) {
for (int j = 0; j < M; j++) {
for (int k = 0; k < N; k++) {
XtX[i][j] += Xt[i][k] * X[k][j];
}
}
for (int k = 0; k < N; k++) {
XtY[i] += Xt[i][k] * y[k];
}
}
// 求解系数
for (int i = 0; i < M; i++) {
double det = 1.0 / (XtX[i][i] * (XtX[(i + 1) % M][(i + 1) % M] * XtX[(i + 2) % M][(i + 2) % M] - XtX[(i + 1) % M][(i + 2) % M] * XtX[(i + 2) % M][(i + 1) % M]) -
XtX[i][(i + 1) % M] * (XtX[(i + 1) % M][(i + 2) % M] * XtX[(i + 2) % M][i] - XtX[(i + 1) % M][i] * XtX[(i + 2) % M][(i + 1) % M]) +
XtX[i][(i + 2) % M] * (XtX[(i + 1) % M][i] * XtX[(i + 2) % M][(i + 1) % M] - XtX[(i + 1) % M][(i + 2) % M] * XtX[i][(i + 1) % M]));
a[i] = det * (XtY[i] * (XtX[(i + 1) % M][(i + 1) % M] * XtX[(i + 2) % M][(i + 2) % M] - XtX[(i + 1) % M][(i + 2) % M] * XtX[(i + 2) % M][(i + 1) % M]) -
XtX[i][(i + 1) % M] * (XtY[(i + 1) % M] * XtX[(i + 2) % M][(i + 2) % M] - XtX[(i + 1) % M][(i + 2) % M] * XtY[(i + 2) % M]) +
XtX[i][(i + 2) % M] * (XtY[(i + 1) % M] * XtX[(i + 2) % M][(i + 1) % M] - XtX[(i + 1) % M][(i + 2) % M] * XtY[(i + 2) % M]));
}
}
int main() {
double a[M]; // 系数
input_data();
least_squares(a);
cout << 'y=' << a[1] << 'x1+' << a[2] << 'x2+' << a[3] << 'x3+' << a[0] << endl;
return 0;
}
代码解释
- 输入数据:
input_data()函数用于读取数据文件,将数据存储到x和y数组中。- 请根据实际情况修改数据文件路径。
- 最小二乘法:
least_squares()函数实现最小二乘法拟合。- 首先构建设计矩阵
X和其转置Xt。 - 计算
(XtX)-1和XtY。 - 最后通过矩阵运算求解系数
a。
- 输出结果:
main()函数调用input_data()和least_squares()函数,并输出最终拟合的线性模型。
注意事项
- 本代码示例仅供参考,需要根据实际情况进行修改和完善。
- 请确保数据文件路径正确。
- 可以根据实际需要调整数据组数和自变量个数。
- 代码中使用矩阵运算,可进一步优化算法效率。
总结
本文介绍了使用 C++ 语言进行多元线性回归的最小二乘法拟合方法,并提供了代码示例和解释。您可以根据实际需求修改代码,并将其应用到不同的数据分析场景中。
原文地址: https://www.cveoy.top/t/topic/oEvR 著作权归作者所有。请勿转载和采集!