我在过去几天里一直试图理解机器学习。我在互联网上观看了各种视频和文章。
在这个视频中。视频中的@人名教我们如何从头开始使用numpy和python创建梯度下降法。以下是代码:
import numpy as npERROR = []def compute_error_for_given_points(b, m, points): total_error = 0.0 for i in range(0,len(points)): x = points[i,0] y = points[i,1] total_error += (y-(m * x + b))**2 return total_error/float(len(points))def step_gradient(b_current, m_current, points, learning_rate): b_gradient = 0 m_gradient = 0 N = float(len(points)) for i in range(0,int(N)): x = points[i, 0] y = points[i, 1] b_gradient += -(2/N) * (y- (m_current*x + b_current)) m_gradient += -(2/N) * x * (y- (m_current*x + b_current)) new_b = b_current - (learning_rate * b_gradient) new_m = m_current - (learning_rate * m_gradient) return new_b,new_mdef gradient_descent_runner(points,starting_b,starting_m,learning_rate,num_iteration): b = starting_b m = starting_m for i in range(num_iteration): ERROR.append(compute_error_for_given_points(b,m,points)) b, m = step_gradient(b, m, points, learning_rate) return b,mdef run(): points = np.genfromtxt('data.csv',delimiter=',') #print(type(points)) #print(points) #hyperparameter learning_rate = 0.0001 #y = mx + b initial_b = 0 initial_m = 0 num_iteration = 100000 b,m = gradient_descent_runner(points,initial_b,initial_m,learning_rate,num_iteration) print("OPTIMIZED: ",b) print("OPTIMIZED: ",m) print("Error: ",compute_error_for_given_points(b,m,points)) print("\n") #print(ERROR)if __name__ == '__main__': run()
我理解所有的数学和微积分内容。但我无法理解变量num_iteration的概念。他建议使用1000次迭代,得到了一些b和m的值。但当我使用超过1000次时,得到的b和m的值不同。而且在使用num_iteration的循环中,我们不能用一个while循环来替代吗,条件是直到我们得到成本函数的最低值?所以,如果你们能给我一些关于这个num_iteration变量的见解,那将非常有帮助。
提前感谢
回答:
要在while循环中设置一个条件说“直到成本函数的最低值”,你首先需要知道那个值会是什么。你不会知道那个值,直到程序完成收敛。你无法事先知道它。
所以你让它运行一个任意次数,在你的例子中是1000次,并希望通过这么多次迭代,能够达到成本的最小值(或至少是一个合理值)。
编辑
这是我在运行代码10000次后的结果
OPTIMIZED: 4.247984440219189OPTIMIZED: 1.3959992655297515Error: 110.7863192974508
对于1000次 –
OPTIMIZED: 0.08893651993741346OPTIMIZED: 1.4777440851894448Error: 112.61481011613473
当代码运行1000次时,与运行100000次相比,误差更大。这是预期的结果。你运行的循环次数越多,参数就越接近最优值。运行100000次迭代,代码会不断调整b和m,直到达到110的误差。运行1000次,它会做同样的事情,但一旦达到1000次就会停止。