Python 线性回归采用梯度下降算法,得到意想不到的结果
我试图创建一个函数,它返回线性回归假设函数的Python 线性回归采用梯度下降算法,得到意想不到的结果,python,machine-learning,linear-regression,gradient-descent,Python,Machine Learning,Linear Regression,Gradient Descent,我试图创建一个函数,它返回线性回归假设函数的θ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 +
θ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
汇聚
您已经在5个训练样本上运行了5次梯度下降迭代,学习率(可能合理)为0.01。这并不意味着你会得到问题的“最终”答案——你需要像你所实现的那样进行多次梯度下降迭代,重复这个过程直到你的θ收敛到一个稳定的值。然后比较结果值是有意义的
将范围(5)中i的
中的5替换为5000,然后查看发生了什么。绘制错误率/成本函数的下降曲线,以查看流程收敛到解决方案的速度,这可能是一个说明。这不是一个问题,而是一个非常常见的问题。为此,您需要了解gradient Delegate的工作原理。
每次你随机初始化你的参数,这个假设就从一个随机的地方开始了它的旅程。每次迭代都会更新参数,以便成本函数收敛。在你的例子中,你只运行了5次迭代的梯度下降,对于不同的初始化,结果会有太多的不同。尝试更高的迭代次数,您将看到显著的相似性,即使是不同的初始化。如果我能使用可视化技术,那将对你有所帮助。以下是我如何看待梯度下降:想象你在雾中的岩石山坡上。因为有雾,你看不到下山最快的路。所以,你环顾你的脚,根据你在附近看到的东西往下走。迈出一步后,你再次环顾你的脚,再迈出一步。有时这会把你困在一个小的低洼处,你看不到任何下山的路(局部最小值),有时这会让你安全地到达山脚(全局最小值)。从雾蒙蒙的山腰上不同的随机位置出发可能会让你陷入不同的局部极小值,尽管如果随机出发位置好,你可能会找到安全的下山之路