给我一个梯度下降训练算法实现的具体例子
时间: 2024-01-24 22:17:24 浏览: 24
下面是一个简单的梯度下降训练算法的示例,以解决线性回归问题为例。假设我们有一组训练数据 $(x_1, y_1), (x_2, y_2), ..., (x_n, y_n)$,其中 $x_i$ 是 $m$ 维特征向量,$y_i$ 是对应的标签。我们的目标是找到一个 $m$ 维向量 $w$,使得对于任意的 $x_i$,都有 $y_i \approx w^Tx_i$。
1. 初始化参数 $w$。可以将 $w$ 的每个分量初始化为 $0$,或者从一个随机分布中采样。
2. 计算损失函数。我们使用均方误差作为损失函数,即
$$
L(w) = \frac{1}{2n} \sum_{i=1}^n (w^Tx_i - y_i)^2
$$
其中 $n$ 是训练集大小。
3. 计算梯度。我们需要计算损失函数相对于参数 $w$ 的梯度,即
$$
\frac{\partial L}{\partial w} = \frac{1}{n} \sum_{i=1}^n (w^Tx_i - y_i)x_i
$$
4. 更新参数。我们按照梯度下降算法的公式来更新参数,即
$$
w = w - \alpha \frac{\partial L}{\partial w}
$$
其中 $\alpha$ 是学习率,控制了每次更新的步长大小。
5. 重复步骤 2-4,直到达到停止条件。停止条件可以是达到一定的迭代次数,或者损失函数的变化量小于某个阈值。
下面是一个 Python 代码实现:
```
import numpy as np
def gradient_descent(X, y, alpha=0.01, max_iters=1000, tol=1e-6):
n, m = X.shape
w = np.zeros(m)
old_loss = np.inf
for i in range(max_iters):
y_pred = X.dot(w)
loss = np.mean((y_pred - y) ** 2)
if abs(loss - old_loss) < tol:
break
old_loss = loss
grad = X.T.dot(y_pred - y) / n
w -= alpha * grad
return w
```
其中 `X` 是训练数据的特征矩阵,`y` 是对应的标签向量。函数返回的是学到的参数向量 $w$。