线性回归/梯度下降 Python 实现
我正在尝试从头开始实现线性回归,使用的是梯度下降法,主要是为了学习。有一部分代码让我很困惑。运行到某一行代码后,变量 x
的值发生了变化,我不知道为什么。
这些变量的情况是这样的:x
和 y
是 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)])