用几何动画和Python可视化5分钟掌握Jensen不等式数学公式总是让人望而生畏今天我们用Python代码和动态几何演示让Jensen不等式从抽象符号变成直观可见的图形游戏。无论你是备考的学生、跨领域研究者还是单纯对数学可视化感兴趣的开发者这套方法都能帮你建立肌肉记忆般的数学直觉。1. 从几何直觉理解凸函数与Jensen不等式想象用手握住一个苹果——这就是最经典的凸形状。数学上凸函数的定义正是对这种几何特性的抽象函数图像上任意两点间的线段弦永远位于函数曲线上方。用Python的Matplotlib可以快速验证这个特性import numpy as np import matplotlib.pyplot as plt x np.linspace(-2, 2, 500) f lambda x: x**2 # 经典凸函数示例 plt.plot(x, f(x), labelf(x)x²) plt.plot([-1, 1], [f(-1), f(1)], r--, label弦) plt.fill_between(x, f(x), np.max(f(x)), alpha0.1) plt.legend(); plt.grid()运行这段代码会看到红色虚线连接(-1,1)和(1,1)两点形成弦抛物线f(x)x²始终位于弦的下方这就是Jensen不等式的几何本质函数值在加权平均点处的输出 ≤ 函数值的加权平均关键可视化技巧用fill_between突出弦与曲线围成的区域动态版本可以添加滑块调节权重λ值后文介绍2. 用Manim制作交互式证明动画静态图像还不够直观让我们用Manim数学动画引擎创建可交互的证明过程。以下动画设计思路值得收藏基础场景构建class JensenScene(Scene): def construct(self): axes Axes(x_range[0,5], y_range[0,10]) func axes.plot(lambda x: (x-2)**2 2, colorBLUE) self.play(Create(axes), Create(func))添加可拖拽控制点dot1 Dot(pointaxes.c2p(1, func(1))).set_color(RED) dot2 Dot(pointaxes.c2p(4, func(4))).set_color(RED) line Line(dot1.get_center(), dot2.get_center(), colorYELLOW) self.play(FadeIn(dot1), FadeIn(dot2), Create(line))动态权重演示lambda_tracker ValueTracker(0.3) # 权重参数 def get_interpolated_point(): l lambda_tracker.get_value() x l*1 (1-l)*4 y l*func(1) (1-l)*func(4) return axes.c2p(x,y) moving_dot always_redraw(lambda: Dot( get_interpolated_point(), colorGREEN))完整代码需处理动画过渡和公式联动但核心逻辑就是通过移动绿点展示当λ从0→1变化时绿点沿黄线弦移动同时在x轴投影点显示函数曲线上的真实值二者垂直距离直观呈现不等式关系3. 三类典型函数的Python验证实验不同凸函数会导致Jensen不等式呈现不同形态我们通过实验对比分析3.1 指数函数验证def test_exponential(): x np.array([1, 3, 5]) weights np.array([0.2, 0.5, 0.3]) lhs np.exp(weights x) # e^(Σλx) rhs weights np.exp(x) # Σλe^x print(fe^{weightsx:.2f}{lhs:.2f} ≤ {rhs:.2f}) # 输出e^3.2024.53 ≤ 55.483.2 对数函数验证注意凹凸性反转def test_logarithm(): x np.array([0.1, 0.5, 0.9]) lhs np.log(0.3*0.1 0.4*0.5 0.3*0.9) rhs 0.3*np.log(0.1) 0.4*np.log(0.5) 0.3*np.log(0.9) print(fln(0.38){lhs:.2f} ≥ {rhs:.2f}) # 输出ln(0.38)-0.97 ≥ -1.233.3 自定义函数交互实验import ipywidgets as widgets widgets.interact( a(0.1, 2), b(0.1, 2), c(0.1, 2), x1(0,5), x2(5,10), λ(0,1,0.1)) def custom_test(a, b, c, x1, x2, λ): f lambda x: a*x**2 b*x c avg_x λ*x1 (1-λ)*x2 avg_f λ*f(x1) (1-λ)*f(x2) print(ff({avg_x:.1f}){f(avg_x):.1f} ≤ {avg_f:.1f})4. 工程应用中的实战技巧掌握Jensen不等式的直观理解后来看几个实际应用中的经典场景机器学习中的损失函数设计交叉熵损失本质是-log(x)的Jensen不等式应用通过凸性保证优化过程的稳定性金融风险评估def risk_assessment(returns, weights): 用Jensen不等式验证投资组合风险 portfolio_return weights returns individual_risks np.array([r**2 for r in returns]) print(fVar(E[R]) {portfolio_return**2:.2f}) print(fE[Var(R)] {weights individual_risks:.2f}) # 对于凸函数x²前者≤后者信息论中的关键不等式KL散度的非负性证明互信息的非负性证明这些都可以看作Jensen不等式在特定凸函数下的实例在算法竞赛中有个经典技巧是构造合适的凸函数来放缩表达式。比如要证明 $$ \frac{ab}{2} \geq \sqrt{ab} $$ 只需取f(x)-ln(x)应用Jensen不等式 $$ -\ln(\frac{ab}{2}) \leq \frac{-\ln a -\ln b}{2} \Rightarrow \frac{ab}{2} \geq e^{\frac{\ln a \ln b}{2}} \sqrt{ab} $$
别再死记硬背了!用几何动画和Python可视化,5分钟彻底搞懂Jensen不等式
发布时间:2026/5/30 4:06:15
用几何动画和Python可视化5分钟掌握Jensen不等式数学公式总是让人望而生畏今天我们用Python代码和动态几何演示让Jensen不等式从抽象符号变成直观可见的图形游戏。无论你是备考的学生、跨领域研究者还是单纯对数学可视化感兴趣的开发者这套方法都能帮你建立肌肉记忆般的数学直觉。1. 从几何直觉理解凸函数与Jensen不等式想象用手握住一个苹果——这就是最经典的凸形状。数学上凸函数的定义正是对这种几何特性的抽象函数图像上任意两点间的线段弦永远位于函数曲线上方。用Python的Matplotlib可以快速验证这个特性import numpy as np import matplotlib.pyplot as plt x np.linspace(-2, 2, 500) f lambda x: x**2 # 经典凸函数示例 plt.plot(x, f(x), labelf(x)x²) plt.plot([-1, 1], [f(-1), f(1)], r--, label弦) plt.fill_between(x, f(x), np.max(f(x)), alpha0.1) plt.legend(); plt.grid()运行这段代码会看到红色虚线连接(-1,1)和(1,1)两点形成弦抛物线f(x)x²始终位于弦的下方这就是Jensen不等式的几何本质函数值在加权平均点处的输出 ≤ 函数值的加权平均关键可视化技巧用fill_between突出弦与曲线围成的区域动态版本可以添加滑块调节权重λ值后文介绍2. 用Manim制作交互式证明动画静态图像还不够直观让我们用Manim数学动画引擎创建可交互的证明过程。以下动画设计思路值得收藏基础场景构建class JensenScene(Scene): def construct(self): axes Axes(x_range[0,5], y_range[0,10]) func axes.plot(lambda x: (x-2)**2 2, colorBLUE) self.play(Create(axes), Create(func))添加可拖拽控制点dot1 Dot(pointaxes.c2p(1, func(1))).set_color(RED) dot2 Dot(pointaxes.c2p(4, func(4))).set_color(RED) line Line(dot1.get_center(), dot2.get_center(), colorYELLOW) self.play(FadeIn(dot1), FadeIn(dot2), Create(line))动态权重演示lambda_tracker ValueTracker(0.3) # 权重参数 def get_interpolated_point(): l lambda_tracker.get_value() x l*1 (1-l)*4 y l*func(1) (1-l)*func(4) return axes.c2p(x,y) moving_dot always_redraw(lambda: Dot( get_interpolated_point(), colorGREEN))完整代码需处理动画过渡和公式联动但核心逻辑就是通过移动绿点展示当λ从0→1变化时绿点沿黄线弦移动同时在x轴投影点显示函数曲线上的真实值二者垂直距离直观呈现不等式关系3. 三类典型函数的Python验证实验不同凸函数会导致Jensen不等式呈现不同形态我们通过实验对比分析3.1 指数函数验证def test_exponential(): x np.array([1, 3, 5]) weights np.array([0.2, 0.5, 0.3]) lhs np.exp(weights x) # e^(Σλx) rhs weights np.exp(x) # Σλe^x print(fe^{weightsx:.2f}{lhs:.2f} ≤ {rhs:.2f}) # 输出e^3.2024.53 ≤ 55.483.2 对数函数验证注意凹凸性反转def test_logarithm(): x np.array([0.1, 0.5, 0.9]) lhs np.log(0.3*0.1 0.4*0.5 0.3*0.9) rhs 0.3*np.log(0.1) 0.4*np.log(0.5) 0.3*np.log(0.9) print(fln(0.38){lhs:.2f} ≥ {rhs:.2f}) # 输出ln(0.38)-0.97 ≥ -1.233.3 自定义函数交互实验import ipywidgets as widgets widgets.interact( a(0.1, 2), b(0.1, 2), c(0.1, 2), x1(0,5), x2(5,10), λ(0,1,0.1)) def custom_test(a, b, c, x1, x2, λ): f lambda x: a*x**2 b*x c avg_x λ*x1 (1-λ)*x2 avg_f λ*f(x1) (1-λ)*f(x2) print(ff({avg_x:.1f}){f(avg_x):.1f} ≤ {avg_f:.1f})4. 工程应用中的实战技巧掌握Jensen不等式的直观理解后来看几个实际应用中的经典场景机器学习中的损失函数设计交叉熵损失本质是-log(x)的Jensen不等式应用通过凸性保证优化过程的稳定性金融风险评估def risk_assessment(returns, weights): 用Jensen不等式验证投资组合风险 portfolio_return weights returns individual_risks np.array([r**2 for r in returns]) print(fVar(E[R]) {portfolio_return**2:.2f}) print(fE[Var(R)] {weights individual_risks:.2f}) # 对于凸函数x²前者≤后者信息论中的关键不等式KL散度的非负性证明互信息的非负性证明这些都可以看作Jensen不等式在特定凸函数下的实例在算法竞赛中有个经典技巧是构造合适的凸函数来放缩表达式。比如要证明 $$ \frac{ab}{2} \geq \sqrt{ab} $$ 只需取f(x)-ln(x)应用Jensen不等式 $$ -\ln(\frac{ab}{2}) \leq \frac{-\ln a -\ln b}{2} \Rightarrow \frac{ab}{2} \geq e^{\frac{\ln a \ln b}{2}} \sqrt{ab} $$