我一直在努力让我的机器学习几天。我正在观看互联网上的视频和文章 在this视频中。 Siraj(视频中的家伙)教导从头开始创造渐变下降与numpy和python。这是代码: -
import numpy as np
ERROR = []
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_m
def 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,m
def 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 变量中给我一些见解,那将非常有帮助。
提前致谢
答案 0 :(得分:0)
为了在while循环中设置条件“直到成本函数的最低值”,首先必须知道该值是什么。在程序完成聚合之前,您不会知道它会是什么。你无法预先知道它。
因此,你可以让它运行一个任意数字,在你的情况下,1000,并希望通过那么多次迭代,成本的最小值(或至少是一个合理的值)将达到。
修改强>
这是我在运行10000
代码后得到的结果OPTIMIZED: 4.247984440219189
OPTIMIZED: 1.3959992655297515
Error: 110.7863192974508
1000 -
OPTIMIZED: 0.08893651993741346
OPTIMIZED: 1.4777440851894448
Error: 112.61481011613473
当代码运行1000次时,错误与我们100000次获得的错误相比更多。这是预期的。循环越多,参数越接近最佳值。使用100000个纪元,代码将继续调整b和m,直到达到错误或110。使用1000时,它将继续执行相同的操作,但一旦达到1000就会停止。