多维随机梯度下降回归 带截距的C++带类实现及案例
时间: 2024-03-05 08:48:22 浏览: 61
以下是一个带有截距的多维随机梯度下降回归的 C++ 类实现以及一个简单的案例:
```cpp
#include <iostream>
#include <vector>
#include <ctime>
#include <cmath>
using namespace std;
class SGDRegressor {
private:
double alpha; // 学习率
int n_iter; // 迭代次数
vector<double> w; // 回归系数
public:
SGDRegressor(double alpha = 0.01, int n_iter = 100) {
this->alpha = alpha;
this->n_iter = n_iter;
srand(time(NULL));
}
double predict(vector<double> X) {
double y_pred = w[0];
for (int i = 0; i < X.size(); i++) {
y_pred += w[i+1] * X[i];
}
return y_pred;
}
void fit(vector<vector<double>> X, vector<double> y) {
int m = X.size();
int n = X[0].size();
w.resize(n+1);
for (int i = 0; i < w.size(); i++) {
w[i] = (double)rand() / RAND_MAX; // 初始化回归系数
}
for (int i = 0; i < n_iter; i++) {
for (int j = 0; j < m; j++) {
vector<double> Xj = X[j];
Xj.insert(Xj.begin(), 1); // 加入截距项
double y_pred = predict(Xj);
double error = y_pred - y[j];
w[0] = w[0] - alpha * error;
for (int k = 0; k < n; k++) {
w[k+1] = w[k+1] - alpha * error * Xj[k];
}
}
}
}
};
int main() {
vector<vector<double>> X = {{1, 2}, {2, 3}, {3, 4}, {4, 5}, {5, 6}};
vector<double> y = {3, 5, 7, 9, 11};
SGDRegressor reg;
reg.fit(X, y);
vector<double> x_test = {6, 7};
double y_pred = reg.predict(x_test);
cout << "预测结果:" << y_pred << endl;
return 0;
}
```
这个例子中,我们使用 SGDRegressor 类来实现带有截距的多维随机梯度下降回归。类的构造函数中定义了学习率 alpha 和迭代次数 n_iter,初始化了回归系数 w。predict() 方法用于根据输入的 X 向量预测 y 值,fit() 方法用于拟合数据。
在案例中,我们使用输入矩阵 X 和输出向量 y 来训练模型。我们使用 fit() 方法拟合数据,然后使用 predict() 方法预测 x_test 对应的 y 值。
这个例子中我们使用了一个非常简单的数据集,但是原理适用于更复杂的数据集。
阅读全文