如何在Matplotlib中求多项式曲线的梯度及正斜率临界点
实现多项式曲线梯度由负转正临界点的检测
你已经通过5次多项式拟合了学习率(Learning Rate)与损失(Loss)的关系曲线,要找到梯度由负转正的临界点并以此停止训练,可以按以下步骤实现:
步骤1:计算拟合多项式的导数(梯度)
numpy.poly1d 对象支持直接调用 deriv() 方法生成导函数,导函数的取值就是原多项式在对应点的梯度。
步骤2:求解导函数的根(梯度为0的点)
利用 numpy.roots() 函数求解导函数的根,这些根对应原多项式的极值点,其中我们需要的是斜率由负转正的极小值点(对应损失曲线的谷底)。
步骤3:筛选有效临界点
由于学习率的范围是1到16,需要过滤掉超出这个范围的根,同时只保留实根(复数根无实际意义),最后验证该点是否是斜率由负转正的点。
完整代码示例
import matplotlib.pyplot as plt import numpy as np loss = [7,6,4,4,3,4,2,1,1,2,3,4,4,5,6,7] learning_rate = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16] # 拟合5次多项式 draw_polynomial = np.poly1d(np.polyfit(learning_rate, loss, 5)) # 生成多项式的导函数(梯度函数) gradient_poly = draw_polynomial.deriv() # 求解导函数的根(梯度为0的点) roots = np.roots(gradient_poly) # 筛选有效根:在学习率范围内的实根 valid_roots = [] for root in roots: # 只保留实根,且在[1,16]区间内 if np.isreal(root) and 1 <= root.real <= 16: valid_roots.append(root.real) # 确定斜率由负转正的临界点(极小值点) # 验证方法:取根左侧和右侧的点,看梯度符号变化(负→正) critical_point = None for root in valid_roots: left_grad = gradient_poly(root - 0.1) right_grad = gradient_poly(root + 0.1) if left_grad < 0 and right_grad > 0: critical_point = root break # 可视化结果 polyline = np.linspace(1, 16, 50) plt.plot(learning_rate, loss, color='orange', label='原始数据') plt.plot(polyline, draw_polynomial(polyline), color='purple', label='5次拟合曲线') # 画出临界点 if critical_point: plt.scatter(critical_point, draw_polynomial(critical_point), color='red', s=100, label='临界点') plt.text(critical_point + 0.5, draw_polynomial(critical_point), f'LR={critical_point:.2f}', fontsize=10) plt.xlabel("Learning Rate") plt.ylabel("Loss") plt.legend() plt.show() # 输出临界点的学习率值 if critical_point: print(f"梯度由负转正的临界点学习率为: {critical_point:.2f}")
说明
- 导函数的根对应原多项式的极值点,通过判断根左右两侧的梯度符号,就能确定哪个是斜率由负转正的极小值点——也就是你需要停止训练的临界点。
- 代码中加入了可视化标注,能直观看到临界点在损失曲线上的位置。
内容的提问来源于stack exchange,提问作者Sunjaree
相关产品推荐
相关产品推荐

