在以下示例中,有人可以向我解释在 Python 中的 for 循环中执行增强赋值时的意外行为:
- 以下代码正在进行
n_epochs
迭代,试图达到参数的最佳值theta
。奇怪的是,即使它正确地完成了工作并成功收敛,列表中theta_list
也充满了循环最后一次迭代的n_epochs + 1
值theta
。
eta = 0.1
n_epochs = 5
theta = np.random.rand(2, 1)
loss_list = []
theta_list = []
theta_list.append(theta)
for epoch in range(n_epochs):
theta -= eta * loss_grad(theta, x, y)
theta_list.append(theta)
loss_list.append(loss(theta, np.c_[np.ones_like(x), x], y))
print(theta_list)
In [1]: %run proto.py
[array([[3.6315498 ],
[3.40173314]]), array([[3.6315498 ],
[3.40173314]]), array([[3.6315498 ],
[3.40173314]]), array([[3.6315498 ],
[3.40173314]]), array([[3.6315498 ],
[3.40173314]]), array([[3.6315498 ],
[3.40173314]])]
- 在上一个示例中更改单行之后,从
theta -= eta * loss_grad(theta, x, y)
至
theta = theta - eta * loss_grad(theta, x, y)
输出看起来符合预期:
In [5]: %run proto.py
[array([[0.00686239],
[0.06257885]]), array([[1.50998752],
[1.80281404]]), array([[2.35777388],
[2.7475853 ]]), array([[2.84342938],
[3.25403032]]), array([[3.12872463],
[3.51915101]]), array([[3.30292104],
[3.65160945]])]
我没有在 stackoverflow 或其他任何在线网站上注意到有人遇到过类似的问题。我正在使用通过 Anaconda3 安装的 Windows 10 和 Python 3.8.5。