多元最小二乘回归 C++带类实现 及案例
时间: 2024-02-20 22:56:14 浏览: 102
基于最小二乘实现线性回归(C++)最小二乘
5星 · 资源好评率100%
多元最小二乘回归是一种回归分析方法,用于建立多个自变量和一个因变量之间的线性关系。在 C++ 中,我们可以通过类来实现多元最小二乘回归。下面是一个简单的示例:
```cpp
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
class MultipleLinearRegression {
private:
vector<vector<double>> X;
vector<double> y;
vector<double> beta;
int n; // 样本数
int k; // 自变量个数
public:
MultipleLinearRegression(vector<vector<double>> X, vector<double> y) {
this->X = X;
this->y = y;
this->n = X.size();
this->k = X[0].size();
this->beta = vector<double>(k, 0);
}
void fit() {
// 计算 X 的转置
vector<vector<double>> X_T(k, vector<double>(n));
for (int i = 0; i < n; i++) {
for (int j = 0; j < k; j++) {
X_T[j][i] = X[i][j];
}
}
// 计算 X 的转置乘 X
vector<vector<double>> X_T_X(k, vector<double>(k));
for (int i = 0; i < k; i++) {
for (int j = 0; j < k; j++) {
double sum = 0;
for (int l = 0; l < n; l++) {
sum += X_T[i][l] * X[l][j];
}
X_T_X[i][j] = sum;
}
}
// 计算 X 的转置乘 y
vector<double> X_T_y(k);
for (int i = 0; i < k; i++) {
double sum = 0;
for (int j = 0; j < n; j++) {
sum += X_T[i][j] * y[j];
}
X_T_y[i] = sum;
}
// 解方程 X_T_X * beta = X_T_y
for (int i = 0; i < k; i++) {
for (int j = i + 1; j < k; j++) {
double ratio = X_T_X[j][i] / X_T_X[i][i];
for (int l = i; l < k; l++) {
X_T_X[j][l] -= ratio * X_T_X[i][l];
}
X_T_y[j] -= ratio * X_T_y[i];
}
}
for (int i = k - 1; i >= 0; i--) {
double sum = 0;
for (int j = i + 1; j < k; j++) {
sum += X_T_X[i][j] * beta[j];
}
beta[i] = (X_T_y[i] - sum) / X_T_X[i][i];
}
}
double predict(vector<double> x) {
double y_pred = 0;
for (int i = 0; i < k; i++) {
y_pred += beta[i] * x[i];
}
return y_pred;
}
vector<double> get_coefficients() {
return beta;
}
};
int main() {
// 构造样本数据
vector<vector<double>> X = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12}};
vector<double> y = {6, 15, 24, 33};
// 构造多元最小二乘回归模型
MultipleLinearRegression model(X, y);
model.fit();
// 预测新数据
vector<double> x_new = {2, 4, 6};
double y_pred = model.predict(x_new);
cout << "Predicted value: " << y_pred << endl;
// 输出回归系数
vector<double> beta = model.get_coefficients();
cout << "Coefficients: ";
for (double b : beta) {
cout << b << " ";
}
cout << endl;
return 0;
}
```
在上面的示例中,我们定义了一个 `MultipleLinearRegression` 类,该类包含了样本数据 `X` 和 `y`,以及多元最小二乘回归模型的系数 `beta`。该类还包含了 `fit` 方法来训练模型,`predict` 方法来预测新数据,以及 `get_coefficients` 方法来获取回归系数。在主函数中,我们构造了一个 `MultipleLinearRegression` 对象,并使用样本数据训练模型,然后预测了新数据的值并输出回归系数。
需要注意的是,上面的示例只是一个简单的实现,可能存在精度问题和性能问题,实际使用时需要进行优化和改进。
阅读全文