我正在尝试创建一个函数,该函数返回线性回归假设函数的θ0
和θ1
的值。但是对于θ0
和θ1
的不同初始(随机)值,我得到了不同的结果。
代码有什么问题?
training_data_set = [[1, 1], [2, 3], [4, 3], [3, 2], [5, 5]]
initial_theta = [1, 0]
def gradient_descent(data, theta0, theta1):
def h(x, theta0, theta1):
return theta0 + theta1 * x
m = len(data)
alpha = 0.01
for n in range(m):
cost = 0
for i in range(m):
cost += (h(data[i][0], theta0, theta1) - data[i][1])**2
cost = cost/(2*m)
error = 0
for i in range(m):
error += h(data[i][0], theta0, theta1) - data[i][1]
theta0 -= alpha*error/m
theta1 -= alpha*error*data[n][0]/m
return theta0, theta1
for i in range(5):
initial_theta = gradient_descent(training_data_set, initial_theta[0], initial_theta[1])
final_theta0 = initial_theta[0]
final_theta1 = initial_theta[1]
print(f'theta0 = {final_theta0}\ntheta1 = {final_theta1}')
输出:
When initial_theta = [0, 0]
theta0 = 0.27311526522692103
theta1 = 0.7771301328221445
When initial_theta = [1, 1]
theta0 = 0.8829506006170339
theta1 = 0.6669442287905096
答案 0 :(得分:2)
您仅对5个训练样本进行了五次梯度下降迭代,学习率(可能是合理的)为0.01。这不是您期望得到的“最终”答案-您需要像实现的那样进行许多梯度下降迭代,重复该过程直到您的theta收敛到稳定值为止。 然后比较结果值很有意义。
将for i in range(5)
中的5替换为5000,然后看看会发生什么。绘制错误率/成本函数的降低,以查看流程收敛到解决方案的速度可能是说明性的。
答案 1 :(得分:1)
这不是问题,而是很平常的事情。为此,您需要了解渐变体面的工作原理。 每次您随机初始化参数时,假设都会从一个随机的地方开始。每次迭代都会更新参数,从而使成本函数收敛。在您的情况下,您仅运行了5次迭代就满足了梯度要求,对于不同的初始化,最终会产生太多不同的结果。尝试更高的迭代,即使使用不同的初始化,您也会看到明显的相似性。如果我可以使用可视化对您有帮助。
答案 2 :(得分:1)
这是我看到梯度下降的方式:想象你高高在雾蒙蒙的山腰上。由于有雾,您看不到下山的最快路径。因此,您环顾四周,然后根据附近的视线向下走。迈出一步之后,您再次环顾四周,然后迈出另一步。有时,这会将您困在一个很小的低点,在那里您看不到任何下落(局部最小值),有时这会使您安全地到达山底(全局最小值)。从雾蒙蒙的山腰上的不同随机位置开始可能会使您陷入不同的局部最小值,但是如果随机起始位置很好,您可能会安全找到自己的路。