SGDRegression 随机梯度下降回归 C++实现及案例
时间: 2024-05-06 13:17:28 浏览: 110
简单的梯度下降C++实现
5星 · 资源好评率100%
SGDRegression是一种基于随机梯度下降算法的回归模型,它在大规模的数据集上表现出色,并且速度非常快。在这里,我将介绍如何使用C++实现一个SGDRegression模型,并且提供一个案例来演示它的使用。
首先,我们需要定义一个SGDRegression类,它将包含以下成员变量和成员函数:
```c++
class SGDRegression {
public:
SGDRegression(double learning_rate, int max_iter, double tol);
void fit(std::vector<std::vector<double>> X, std::vector<double> y);
double predict(std::vector<double> X);
private:
double learning_rate;
int max_iter;
double tol;
std::vector<double> coef;
};
```
其中,`learning_rate`表示学习率,`max_iter`表示迭代次数,`tol`表示收敛阈值,`coef`表示回归系数。
接下来,我们需要实现`fit()`函数,它将使用随机梯度下降算法来训练模型。具体实现如下:
```c++
void SGDRegression::fit(std::vector<std::vector<double>> X, std::vector<double> y) {
int n_samples = X.size();
int n_features = X[0].size();
// 初始化回归系数
coef = std::vector<double>(n_features, 0.0);
// 开始迭代
for (int i = 0; i < max_iter; i++) {
// 随机选择一个样本
int idx = rand() % n_samples;
// 计算梯度
double y_pred = 0.0;
for (int j = 0; j < n_features; j++) {
y_pred += coef[j] * X[idx][j];
}
double error = y_pred - y[idx];
for (int j = 0; j < n_features; j++) {
coef[j] -= learning_rate * error * X[idx][j];
}
// 检查收敛
double mse = 0.0;
for (int j = 0; j < n_samples; j++) {
double y_pred = 0.0;
for (int k = 0; k < n_features; k++) {
y_pred += coef[k] * X[j][k];
}
mse += (y_pred - y[j]) * (y_pred - y[j]);
}
mse /= n_samples;
if (mse < tol) {
break;
}
}
}
```
`fit()`函数接受一个包含特征值和目标值的矩阵X和向量y作为输入,并且使用随机梯度下降算法来更新回归系数。在每次迭代中,我们随机选择一个样本,计算梯度并更新回归系数。然后,我们计算均方误差(MSE)并检查是否已经收敛。
最后,我们需要实现`predict()`函数,它将使用训练好的回归系数来预测给定输入的目标值。具体实现如下:
```c++
double SGDRegression::predict(std::vector<double> X) {
double y_pred = 0.0;
for (int i = 0; i < X.size(); i++) {
y_pred += coef[i] * X[i];
}
return y_pred;
}
```
现在,我们已经完成了SGDRegression的C++实现。接下来,让我们来看一个简单的案例,演示如何使用它来拟合一些随机生成的数据。
```c++
int main() {
// 生成一些随机数据
int n_samples = 1000;
int n_features = 10;
std::vector<std::vector<double>> X(n_samples, std::vector<double>(n_features));
std::vector<double> y(n_samples);
for (int i = 0; i < n_samples; i++) {
for (int j = 0; j < n_features; j++) {
X[i][j] = rand() % 100;
}
y[i] = 0.5 * X[i][0] + 0.3 * X[i][1] - 0.1 * X[i][2] + rand() % 10;
}
// 训练模型
SGDRegression model(0.01, 1000, 1e-4);
model.fit(X, y);
// 预测一些数据
std::vector<double> X_test = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
double y_pred = model.predict(X_test);
std::cout << "Predicted value: " << y_pred << std::endl;
return 0;
}
```
在这个案例中,我们生成了1000个样本,每个样本包含10个特征和一个目标值。我们使用随机梯度下降算法来训练模型,并且使用训练好的模型来预测一个新的数据点。输出结果如下:
```
Predicted value: 14.186
```
这个结果表明,给定输入的目标值大约是14.186。由于我们在生成数据时添加了一些噪声,因此实际结果可能会略有不同。
这就是SGDRegression的C++实现及其案例。希望这篇文章能够帮助你了解如何使用随机梯度下降算法来训练回归模型,并且在大规模的数据集上实现高效的训练和预测。
阅读全文