3

为了学习目的,我正在尝试使用梯度下降法从头开始实现线性回归。我的代码的一部分真的让我很烦。出于某种原因,在我运行一行代码后变量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 或列表中的最后一个元素。

4

2 回答 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)])
于 2013-02-21T02:17:24.033 回答
4

发生的事情是 python 正在计算 list 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)])
于 2013-02-21T02:18:30.590 回答