小批量梯度下降的代码 python
时间: 2023-09-28 07:07:15 浏览: 31
下面是一个简单的 Python 代码实现小批量梯度下降:
```python
import numpy as np
# 定义损失函数
def loss_function(X, y, W):
n = X.shape[0] # 样本数
h = X @ W # 计算预测值
loss = (1 / (2 * n)) * np.sum((h - y) ** 2) # 计算损失
return loss
# 定义梯度函数
def gradient(X, y, W):
n = X.shape[0] # 样本数
h = X @ W # 计算预测值
grad = (1 / n) * (X.T @ (h - y)) # 计算梯度
return grad
# 定义小批量梯度下降函数
def mini_batch_gradient_descent(X, y, learning_rate=0.01, batch_size=32, epochs=100):
n, d = X.shape # 样本数和特征数
W = np.zeros((d, 1)) # 初始化权重
num_batches = n // batch_size # 计算总批次数
for epoch in range(epochs):
for batch in range(num_batches):
X_batch = X[batch * batch_size:(batch + 1) * batch_size] # 取出当前批次的数据
y_batch = y[batch * batch_size:(batch + 1) * batch_size]
grad = gradient(X_batch, y_batch, W) # 计算当前批次的梯度
W = W - learning_rate * grad # 更新权重
loss = loss_function(X, y, W) # 计算当前的损失
print("Epoch {0}: loss = {1}".format(epoch, loss))
return W
```
其中,`X` 是样本的特征矩阵,`y` 是样本的标签向量,`learning_rate` 是学习率,`batch_size` 是每次训练时取出的样本数,`epochs` 是训练的轮数。在函数中,先计算出总共的批次数 `num_batches`,然后循环 `epochs` 轮,在每一轮内循环 `num_batches` 次,每次取出 `batch_size` 个样本进行训练,并更新权重。在每轮训练结束后,计算当前的损失并输出。最后返回训练好的权重 `W`。