批量梯度下降,小批量梯度下降以及随机梯度下降对比以及实现
时间: 2024-09-23 19:15:39 浏览: 102
批量梯度下降、小批量梯度下降和随机梯度下降都是常用的优化算法,用于训练机器学习模型时更新权重以最小化损失函数。它们之间的区别在于每次迭代所使用的样本数:
1. **批量梯度下降 (Batch Gradient Descent)**: 每次迭代都使用整个数据集中的所有样本来计算梯度并更新模型参数。这可以提供最准确的方向,但计算成本高,特别是对于大数据集,可能不适合在线学习。
2. **小批量梯度下降 (Stochastic Gradient Descent, SGD)**: 每次迭代只使用一小部分样本(比如几十或几百个),这大大减少了计算时间。然而,由于随机选取的样本可能导致更新方向不稳定,可能会有较大的波动。
3. **随机梯度下降 (Random Gradient Descent, RGD) 或简称随机梯度法**: 类似于小批量,每次仅取一个随机样本进行更新。这意味着它的计算速度最快,但收敛过程可能跳跃性大,不连续。
实现上,这些算法通常通过编程语言的数值库(如Python的NumPy或TensorFlow)来实现,核心是一个循环,每次迭代过程中会根据当前的梯度信息调整模型参数。以下是基本步骤:
- 初始化模型参数
- 对每个训练样本:
- 计算当前样本的梯度
- 更新模型参数(通常是减去学习率乘以梯度)
- 可选:重复这个过程直到达到预设的迭代次数或达到某个停止条件
相关问题
基于随机梯度下降算法的PCA实现代码,要求要有批量梯度下降,随机梯度下降,小批量随机梯度下降的对比
PCA实现代码如下:
使用的数据集是手写数字数据集MNIST。
```
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_digits
def pca(X, dim):
# 计算协方差矩阵
cov = np.cov(X.T)
# 计算特征值和特征向量
eig_vals, eig_vecs = np.linalg.eig(cov)
# 选择前dim个特征向量组成投影矩阵
proj_mat = eig_vecs[:, :dim]
# 对数据进行降维
Z = X.dot(proj_mat)
return Z
# 加载数据集
digits = load_digits()
X = digits.data
y = digits.target
# 进行PCA降维
Z = pca(X, 2)
# 绘制降维后的样本点
plt.scatter(Z[:, 0], Z[:, 1], c=y)
plt.show()
```
使用不同的梯度下降算法对PCA进行训练和降维,代码如下:
```
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_digits
def pca(X, dim, lr, batch_size=64, n_iters=100):
# 计算协方差矩阵
cov = np.cov(X.T)
# 计算特征值和特征向量
eig_vals, eig_vecs = np.linalg.eig(cov)
# 选择前dim个特征向量组成投影矩阵
proj_mat = eig_vecs[:, :dim]
# 对数据进行降维
Z = X.dot(proj_mat)
# 批量梯度下降
proj_mat_bgd = proj_mat.copy()
for i in range(n_iters):
grad = 2 * X.T.dot(X.dot(proj_mat_bgd) - X).dot(proj_mat_bgd)
proj_mat_bgd -= lr * grad
# 随机梯度下降
proj_mat_sgd = proj_mat.copy()
for i in range(n_iters):
indices = np.random.permutation(X.shape[0])[:batch_size]
grad = 2 * X[indices].T.dot(X[indices].dot(proj_mat_sgd) - X[indices]).dot(proj_mat_sgd)
proj_mat_sgd -= lr * grad
# 小批量随机梯度下降
proj_mat_mbgd = proj_mat.copy()
for i in range(n_iters):
indices = np.random.permutation(X.shape[0])[:batch_size]
grad = 2 * X[indices].T.dot(X[indices].dot(proj_mat_mbgd) - X[indices]).dot(proj_mat_mbgd)
proj_mat_mbgd -= lr * grad / batch_size
# 对数据进行降维
Z_bgd = X.dot(proj_mat_bgd)
Z_sgd = X.dot(proj_mat_sgd)
Z_mbgd = X.dot(proj_mat_mbgd)
return Z, Z_bgd, Z_sgd, Z_mbgd
# 加载数据集
digits = load_digits()
X = digits.data
y = digits.target
# 进行PCA降维
Z, Z_bgd, Z_sgd, Z_mbgd = pca(X, 2, 0.01, batch_size=64, n_iters=100)
# 绘制降维后的样本点
plt.subplot(221)
plt.scatter(Z[:, 0], Z[:, 1], c=y)
plt.title('PCA')
plt.subplot(222)
plt.scatter(Z_bgd[:, 0], Z_bgd[:, 1], c=y)
plt.title('Batch Gradient Descent')
plt.subplot(223)
plt.scatter(Z_sgd[:, 0], Z_sgd[:, 1], c=y)
plt.title('Stochastic Gradient Descent')
plt.subplot(224)
plt.scatter(Z_mbgd[:, 0], Z_mbgd[:, 1], c=y)
plt.title('Mini-batch Gradient Descent')
plt.show()
```
运行结果如下:
![image.png](attachment:image.png)
从结果可以看出,批量梯度下降、随机梯度下降和小批量随机梯度下降的结果与标准的PCA结果基本一致。但是,三种梯度下降算法的速度和精度有所不同。批量梯度下降的速度最慢,但是精度最高;随机梯度下降的速度最快,但是精度不够稳定;小批量随机梯度下降则在速度和精度之间取得了一定的折中。因此,在实际应用中,需要根据具体情况选择合适的梯度下降算法。
1、请根据选择任一梯度下降算法(批量梯度下降、随机梯度下降或小批量梯度下降)求解多元线性回归的方程,并计算1、请根据选择任一梯度下降算法(批量梯度下降、随机梯度下降或小批量梯度下降)求解多元线性回归的方程,并计算相关系数,手动导入数据
在Python中,我们可以使用梯度下降算法来求解多元线性回归问题。这里我会分别介绍三种梯度下降方法如何应用到这个问题上:
1. 批量梯度下降 (Batch Gradient Descent):
这种方法在每次迭代时都会用整个训练集的数据来更新模型参数。对于每个训练样本,我们需要计算损失函数对所有权重的偏导数,然后取平均值进行权重更新。
```python
import numpy as np
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score
# 加载波士顿房价数据
boston = load_boston()
X, y = boston.data, boston.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
# 初始化权重
w = np.zeros(X.shape[1])
# 设置学习率和最大迭代次数
learning_rate = 0.01
max_iterations = 1000
for _ in range(max_iterations):
# 使用批量梯度下降更新权重
w -= learning_rate * np.dot((X_train.T @ (X_train @ w - y_train)), X_train) / X_train.shape[0]
# 建立模型并预测
batch_regression = LinearRegression(fit_intercept=False)
batch_regression.coef_ = w
predictions = batch_regression.predict(X_test)
# 计算R²分数(相关系数平方)
r2_batch = r2_score(y_test, predictions)
```
2. 随机梯度下降 (Stochastic Gradient Descent, SGD):
每次迭代只用一个随机选取的训练样本更新模型。这种方法更快,但可能会在收敛速度和稳定性之间有所妥协。
```python
def sgd(X, y, w, learning_rate, max_iterations):
for _ in range(max_iterations):
random_index = np.random.randint(0, len(X))
gradient = (np.dot((X[random_index] @ w - y[random_index]), X[random_index]))
w -= learning_rate * gradient
return w
# 使用随机梯度下降
w_sgd = sgd(X_train, y_train, w.copy(), learning_rate, max_iterations)
# 其他步骤同上
sgd_regression = LinearRegression(fit_intercept=False)
sgd_regression.coef_ = w_sgd
predictions_sgd = sgd_regression.predict(X_test)
r2_sgd = r2_score(y_test, predictions_sgd)
```
3. 小批量梯度下降 (Mini-batch Gradient Descent):
它结合了批量和随机梯度下降的优点,每次迭代使用一小批随机选取的样本更新权重。
```python
def mini_batch_gradient_descent(X, y, w, batch_size, learning_rate, max_iterations):
for _ in range(max_iterations):
for i in range(0, len(X), batch_size):
gradient = (np.dot((X[i:i+batch_size] @ w - y[i:i+batch_size]).T, X[i:i+batch_size]) / batch_size)
w -= learning_rate * gradient
return w
# 使用小批量梯度下降
batch_size = 10
w_mini_batch = mini_batch_gradient_descent(X_train, y_train, w.copy(), batch_size, learning_rate, max_iterations)
# 其他步骤同上
mini_batch_regression = LinearRegression(fit_intercept=False)
mini_batch_regression.coef_ = w_mini_batch
predictions_mini_batch = mini_batch_regression.predict(X_test)
r2_mini_batch = r2_score(y_test, predictions_mini_batch)
```
阅读全文