线性回归/梯度下降 Python 实现

3 投票
2 回答
1274 浏览
提问于 2025-04-17 16:34

我正在尝试从头开始实现线性回归,使用的是梯度下降法,主要是为了学习。有一部分代码让我很困惑。运行到某一行代码后,变量 x 的值发生了变化,我不知道为什么。

这些变量的情况是这样的:xy 是 numpy 数组,我在这个例子中给它们随机赋了些数字。

x = np.array([1, 2, 3, 4, ...., n])
y = np.array([1, 2, 3, , ...., n])
theta = [0, 0]
alpha = .01
m = len(x)

代码如下:

theta[0] = theta[0] - alpha*1/m*sum([((theta[0]+theta[1]*x) - y)**2 for (x,y) in zip(x,y)])

一旦我运行了上面的代码,x 就不再是一个列表了。它变成了变量 n 或者列表中的最后一个元素。

2 个回答

4

是的,在你的列表推导式中,x 确实被重新赋值了。为什么不直接换个变量名,这样就不会被覆盖了呢?

theta[0] = theta[0] - alpha*1/m*sum([((theta[0]+theta[1]*x_i) - y_i)**2 for x_i, y_i in zip(x,y)])
4

发生的事情是,Python正在计算列表 zip(x,y),然后你每次循环的时候,都会用 zip(x,y) 中对应的元素来覆盖 (x,y)。当你的循环结束时,(x,y) 就只剩下 zip(x,y)[-1] 的内容了。

你可以试试

theta[0] = theta[0] - alpha*1/m*sum([((theta[0]+theta[1]*xi) - yi)**2 for (xi,yi) in zip(x,y)])

撰写回答