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;
}

代码解释

  1. 输入数据:
    • input_data() 函数用于读取数据文件,将数据存储到 xy 数组中。
    • 请根据实际情况修改数据文件路径。
  2. 最小二乘法:
    • least_squares() 函数实现最小二乘法拟合。
    • 首先构建设计矩阵 X 和其转置 Xt
    • 计算 (XtX)-1XtY
    • 最后通过矩阵运算求解系数 a
  3. 输出结果:
    • main() 函数调用 input_data()least_squares() 函数,并输出最终拟合的线性模型。

注意事项

  • 本代码示例仅供参考,需要根据实际情况进行修改和完善。
  • 请确保数据文件路径正确。
  • 可以根据实际需要调整数据组数和自变量个数。
  • 代码中使用矩阵运算,可进一步优化算法效率。

总结

本文介绍了使用 C++ 语言进行多元线性回归的最小二乘法拟合方法,并提供了代码示例和解释。您可以根据实际需求修改代码,并将其应用到不同的数据分析场景中。


原文地址: https://www.cveoy.top/t/topic/oEvR 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录