我正在尝试使用梯度下降法从头开始实现线性回归以用于学习目的。我的代码的一部分真的很烦我。出于某种原因,在运行一行代码后,变量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或最后一个元素。
答案 0 :(得分: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)])
答案 1 :(得分:4)
正在发生的事情是python正在计算列表zip(x,y)
,然后for循环的每次迭代都会用(x,y)
的相应元素覆盖zip(x,y)
。当for循环终止时(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)])