线性回归使用梯度下降算法,得到意想不到的结果
Linear regression using gradient descent algorithm, getting unexpected results
我正在尝试创建一个函数,其中 returns θ<sub>0</sub>
& 的值线性回归假设函数的θ<sub>1</sub>
。但是对于 θ<sub>0</sub>
& θ<sub>1 的不同初始(随机)值,我得到了不同的结果</sub>
.
代码有什么问题?
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
收敛
您已经 运行 对仅 5 个训练样本进行了五次梯度下降迭代,学习率为 0.01(可能是合理的)。那是 not 预期会给你带来问题的 "final" 答案 - 你需要做 many 梯度下降迭代就像你实施的那样,重复这个过程,直到你的 thetas 收敛到一个稳定的值。 那么比较结果值就有意义了。
将for i in range(5)
中的5替换为5000,然后看看会发生什么。绘制错误率/成本函数的降低图以查看过程收敛到解决方案的速度可能是说明性的。
这不是问题而是很平常的事情。为此,您需要了解 gradient decent 的工作原理。
每次你 运行domly 初始化你的参数时,假设都会从 运行dom 地方开始它的旅程。每次迭代它都会更新参数,以便成本函数收敛。在你的情况下,你有 运行 你的渐变体面仅适用于 5 次迭代,对于不同的初始化,它最终会产生太多不同的结果。尝试更高的迭代,即使初始化不同,您也会看到显着的相似性。如果我可以使用对你有帮助的可视化。
我是这样看待梯度下降的:想象你在雾中高高的岩石山坡上。因为有雾,看不到最快的下山路。所以,你环顾脚下,根据你在附近看到的东西往下走。迈出一步,再环顾脚下,再迈出一步。有时这会将您困在一个看不到任何向下方向的小低点(局部最小值),有时这会让您安全到达山脚(全局最小值)。从雾蒙蒙的山腰上的不同随机位置开始可能会使您陷入不同的局部最小值,但如果随机起始位置良好,您可能会找到安全下山的路。
我正在尝试创建一个函数,其中 returns θ<sub>0</sub>
& 的值线性回归假设函数的θ<sub>1</sub>
。但是对于 θ<sub>0</sub>
& θ<sub>1 的不同初始(随机)值,我得到了不同的结果</sub>
.
代码有什么问题?
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
收敛
您已经 运行 对仅 5 个训练样本进行了五次梯度下降迭代,学习率为 0.01(可能是合理的)。那是 not 预期会给你带来问题的 "final" 答案 - 你需要做 many 梯度下降迭代就像你实施的那样,重复这个过程,直到你的 thetas 收敛到一个稳定的值。 那么比较结果值就有意义了。
将for i in range(5)
中的5替换为5000,然后看看会发生什么。绘制错误率/成本函数的降低图以查看过程收敛到解决方案的速度可能是说明性的。
这不是问题而是很平常的事情。为此,您需要了解 gradient decent 的工作原理。 每次你 运行domly 初始化你的参数时,假设都会从 运行dom 地方开始它的旅程。每次迭代它都会更新参数,以便成本函数收敛。在你的情况下,你有 运行 你的渐变体面仅适用于 5 次迭代,对于不同的初始化,它最终会产生太多不同的结果。尝试更高的迭代,即使初始化不同,您也会看到显着的相似性。如果我可以使用对你有帮助的可视化。
我是这样看待梯度下降的:想象你在雾中高高的岩石山坡上。因为有雾,看不到最快的下山路。所以,你环顾脚下,根据你在附近看到的东西往下走。迈出一步,再环顾脚下,再迈出一步。有时这会将您困在一个看不到任何向下方向的小低点(局部最小值),有时这会让您安全到达山脚(全局最小值)。从雾蒙蒙的山腰上的不同随机位置开始可能会使您陷入不同的局部最小值,但如果随机起始位置良好,您可能会找到安全下山的路。