我试图创建一个函数来返回线性回归假设函数的θ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, theta1for 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}')
输出:
当 initial_theta = [0, 0] 时theta0 = 0.27311526522692103theta1 = 0.7771301328221445当 initial_theta = [1, 1] 时theta0 = 0.8829506006170339theta1 = 0.6669442287905096
回答:
收敛性
你已经对仅5个训练样本进行了5次梯度下降迭代,学习率为0.01(可能合理)。这并不能期望你得到问题的“最终”答案——你需要进行多次梯度下降迭代,就像你实现的那样,重复这个过程直到你的θ值收敛到一个稳定值。然后比较结果值才有意义。
将for i in range(5)
中的5替换为5000,然后看看会发生什么。绘制错误率/成本函数的下降图可能会有助于说明这个过程收敛到解的速度有多快。