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

3

我正在尝试使用梯度下降法从零开始实现线性回归,以便学习目的。我的代码中有一个部分让我很困扰。由于某种原因,在运行一行代码后变量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

发生的情况是Python正在计算列表zip(x,y),然后您的for循环的每次迭代都会使用 zip(x,y) 的对应元素覆盖(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)])

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)])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接