求教Coursera吴恩达ML课程中Gradient Descent函数的第二个if条件含义
梯度下降迭代打印条件的解释
我在Coursera修读吴恩达的机器学习专项课程时,遇到一段实现梯度下降算法的代码。我知道for循环里的第二个if语句是用来打印控制台信息的,但搞不懂if i% math.ceil(num_iters/10) == 0:这个条件的具体含义,希望得到解释。
代码片段
def gradient_descent(x, y, w_in, b_in, alpha, num_iters, cost_function, gradient_function): w = copy.deepcopy(w_in) # avoid modifying global w_in # An array to store cost J and w's at each iteration primarily for graphing later J_history = [] p_history = [] b = b_in w = w_in for i in range(num_iters): # Calculate the gradient and update the parameters using gradient_function dj_dw, dj_db = gradient_function(x, y, w , b) # Update Parameters using equation (3) above b = b - alpha * dj_db w = w - alpha * dj_dw # Save cost J at each iteration if i<100000: # prevent resource exhaustion J_history.append( cost_function(x, y, w , b)) p_history.append([w,b]) # Print cost every at intervals 10 times or as many iterations if < 10 if i% math.ceil(num_iters/10) == 0: print(f"Iteration {i:4}: Cost {J_history[-1]:0.2e} ", f"dj_dw: {dj_dw: 0.3e}, dj_db: {dj_db: 0.3e} ", f"w: {w: 0.3e}, b:{b: 0.5e}") return w, b, J_history, p_history #return w and J,w history for graphing
条件含义拆解
这个条件的核心目标是控制迭代信息的打印频率,确保输出足够但不冗余的监控数据,具体逻辑如下:
- 划分区间:
num_iters/10将总迭代次数分成10等份,得到理想的打印间隔 - 向上取整:
math.ceil(...)对间隔值向上取整,避免因总迭代数无法被10整除出现非整数间隔的问题 - 判断打印时机:
i % 间隔 == 0表示仅当当前迭代次数i是间隔的整数倍(含第0次迭代)时,才打印控制台信息
最终效果
- 当总迭代次数
num_iters ≥ 10时:会打印约10次迭代信息(比如100次迭代打印10次,105次迭代也打印10次),避免控制台刷屏 - 当总迭代次数
num_iters < 10时:每一次迭代都会打印信息(间隔被取整为1,所有i都满足i%1 == 0),确保能看到完整的迭代过程
这样设计可以让开发者清晰监控梯度下降的收敛状态,同时避免输出过多冗余内容。
内容的提问来源于stack exchange,提问作者Rhythm Dutta
相关产品推荐
相关产品推荐

