詹森不等式:理解‘平均’失效的数学本质 1. 项目概述从一杯不均匀的糖水说起你有没有试过泡一杯糖水但没搅匀上层甜得发腻底层却淡而无味。这时候整杯水的“平均甜度”其实既不等于最甜那口也不等于最淡那口而是介于两者之间——但具体落在哪儿取决于糖分布的“形状”。这个直觉背后藏着一个数学上极其精炼、应用上又无比宽广的工具凸性Convexity和它最锋利的武器——詹森不等式Jensen’s Inequality。这篇文章要讲的不是教科书里干巴巴的定义和证明而是我带本科生做数学建模时反复用到的一套“思维扳手”。它能把看似风马牛不相及的问题拧到同一个逻辑轴上为什么投资组合的预期收益不能简单加权平均为什么机器学习里的损失函数要设计成凸的为什么说“平均身高”不能代表一个班级的健康状况答案都指向同一个内核函数的弯曲方向决定了“平均的函数值”和“函数的平均值”谁大谁小。詹森不等式就是这个大小关系的精确判决书。而我们最熟悉的算术-几何平均不等式AM-GM不过是它在一个特定函数对数函数上的自然推论。我试过用计算器手动验证几十组数字也带着学生用Python画过上百张凸函数图像每一次都印证这不是一个需要死记硬背的公式而是一种观察世界弯曲本质的视角。如果你正在学微积分、概率论、优化理论或者只是想搞懂为什么“平均”这个词在现实里常常失效那么这篇内容就是为你准备的。它不需要你精通实分析但要求你愿意把“凹”和“凸”这两个字从几何图形里拎出来放进日常的决策逻辑中。2. 核心原理拆解为什么“弯曲方向”能决定不等号朝向2.1 凸函数的两种等价定义图像法与弦线法初学者最容易被“凸函数”这个词绊倒因为中文里“凸”字给人的直观印象是“向外鼓”但数学定义恰恰相反一个函数 f 是凸的当且仅当它的图像上任意两点之间的连线弦始终位于图像本身之上。这个定义听起来拗口但用一杯咖啡来理解就非常清晰。想象你在咖啡表面撒了一层可可粉粉末的分布高度构成了一个函数 f(x)。如果这杯咖啡是“凸”的那就意味着无论你取哪两个点 A 和 B用一根细线把它们连起来这根线永远悬在可可粉表面之上绝不会有一段陷进粉末里。反过来如果函数是“凹”的concave那根弦就会沉到图像下面去。这个“弦在线上”的定义等价于另一个更代数化的定义对任意 x₁, x₂ 和任意 λ ∈ [0,1]都有 f(λx₁ (1−λ)x₂) ≤ λf(x₁) (1−λ)f(x₂)。这个式子左边是“先平均输入再求函数值”右边是“先求函数值再加权平均”。不等号的方向直接揭示了凸函数的核心行为模式它让“先平均再计算”变得比“先计算再平均”更保守、更小。这就是整个詹森不等式的种子。提示很多教材会把“凸”和“凹”的定义搞反根源在于不同学科的传统。在数学分析和优化领域我们严格采用“弦在线上为凸”的定义。你可以用 f(x) x² 来验证取 x₁−1, x₂1, λ0.5左边 f(0)0右边 0.5×1 0.5×1 10 ≤ 1成立所以 x² 是凸的。而 f(x) √x 在 x0 上是凹的因为它的弦总在图像下方。2.2 詹森不等式的诞生从两点到 n 点的自然推广两点的不等式是詹森不等式的“胚胎”。当我们把 λ 看作一个权重把 (1−λ) 看作另一个权重那么 λ 和 (1−λ) 就构成了一组和为 1 的非负数。这立刻启发我们能不能把这种加权平均的思想推广到任意多个点答案是肯定的而且推广过程非常自然。假设我们有 n 个点 x₁, x₂, ..., xₙ以及一组对应的权重 w₁, w₂, ..., wₙ满足 wᵢ ≥ 0 且 Σwᵢ 1。那么对于一个凸函数 f詹森不等式断言f(w₁x₁ w₂x₂ ... wₙxₙ) ≤ w₁f(x₁) w₂f(x₂) ... wₙf(xₙ)这个公式看起来复杂但它的几何意义和两点情形一模一样左边是“按权重 wᵢ 混合所有输入点后再喂给函数 f”右边是“先把每个点 xᵢ 喂给 f 得到 f(xᵢ)再按同样权重 wᵢ 混合这些输出”。不等号依然指向“先混合再计算”更小。这个推广不是凭空而来的。它的证明依赖于数学归纳法而关键的一步正是利用了两点情形作为归纳基础。你可以把它想象成搭积木两点是第一块基石三点可以看作是“先用权重把前两点合成一个新点再把这个新点和第三点用两点不等式处理”以此类推。每一步都稳稳地建立在前一步之上。我带学生做这个证明时会让他们亲手用 w₁0.2, w₂0.3, w₃0.5 和 f(x)eˣ 来计算一遍数值结果会像锤子一样敲进脑子里左边是 e^(0.2×1 0.3×2 0.5×3) e^2.3 ≈ 9.97右边是 0.2×e¹ 0.3×e² 0.5×e³ ≈ 0.2×2.72 0.3×7.39 0.5×20.09 ≈ 13.489.97 ≤ 13.48铁证如山。2.3 为什么凸性是詹森不等式成立的充要条件这里有一个深刻但常被忽略的点詹森不等式不仅在凸函数上成立它还是凸函数的“身份证”。也就是说如果一个函数 f 对所有可能的权重和点集都满足上述不等式那么 f 必定是凸函数。这是一个双向箭头凸 ⇔ 詹森不等式恒成立。这个“充要性”为什么重要因为它把一个抽象的几何性质图像的弯曲方向转化成了一个可操作、可验证的代数判据。在实际应用中我们往往不直接去画图看弦线而是去检验这个不等式是否成立。例如在机器学习中我们设计一个损失函数 L(θ)希望它关于参数 θ 是凸的以保证梯度下降能找到全局最优解。最直接的办法就是尝试构造几组不同的 θ 值和权重代入詹森不等式进行数值验证。如果多次验证都成立那我们就有了很强的信心这个函数是“友好”的。注意这个充要性只在定义域是凸集convex set的前提下才成立。所谓凸集就是集合中任意两点的连线其上的所有点也都属于该集合。比如全体实数 R、区间 [0,1]、二维平面上的一个圆盘都是凸集而一个圆环中间挖空就不是凸集因为取内外边缘上两点连线会穿过空洞。我们在使用詹森不等式时必须时刻确认我们选取的所有 xᵢ 都落在 f 的定义域内且这个定义域本身就是一个凸集。这是很多初学者栽跟头的地方。3. AM-GM 不等式的深度推导从对数函数的凹性出发3.1 关键洞察AM-GM 是詹森不等式在 f(x) −ln x 上的特例AM-GM 不等式即对于任意 n 个正实数 a₁, a₂, ..., aₙ有(a₁ a₂ ... aₙ)/n ≥ ⁿ√(a₁a₂...aₙ)左边是算术平均Arithmetic Mean右边是几何平均Geometric Mean。这个不等式优美得像一首诗但它的证明方法五花八门从归纳法到拉格朗日乘数法各有千秋。而詹森不等式提供了一条最简洁、最富洞察力的路径其核心在于一个看似微小的转换我们不去直接处理 aᵢ而是去处理它们的对数。为什么是对数因为几何平均的对数等于各个数对数的算术平均。这是一个基本的对数运算法则ln(ⁿ√(a₁a₂...aₙ)) (1/n)(ln a₁ ln a₂ ... ln aₙ)这个等式把乘积的根号神奇地转化成了和的平均。现在如果我们设 f(x) −ln x那么 f 就是一个凹函数因为 ln x 是凸的负号翻转了弯曲方向。而凹函数的詹森不等式就是凸函数不等式的“镜像”f(w₁x₁ ... wₙxₙ) ≥ w₁f(x₁) ... wₙf(xₙ)不等号方向翻转。3.2 推导全过程一步到位的代数魔术现在让我们把 f(x) −ln x 和等权重 wᵢ 1/n 代入凹函数的詹森不等式左边f((1/n)a₁ (1/n)a₂ ... (1/n)aₙ) −ln((a₁ a₂ ... aₙ)/n)右边(1/n)f(a₁) (1/n)f(a₂) ... (1/n)f(aₙ) (1/n)(−ln a₁) ... (1/n)(−ln aₙ) −(1/n)(ln a₁ ... ln aₙ) −ln(ⁿ√(a₁a₂...aₙ))由于 f 是凹的詹森不等式给出左边 ≥ 右边即−ln((a₁ ... aₙ)/n) ≥ −ln(ⁿ√(a₁...aₙ))接下来两边同时乘以 -1不等号方向再次翻转ln((a₁ ... aₙ)/n) ≤ ln(ⁿ√(a₁...aₙ))最后因为自然对数函数 ln x 是严格递增的所以我们可以对不等式两边同时取指数即应用 eˣ 函数不等号方向保持不变(a₁ ... aₙ)/n ≥ ⁿ√(a₁...aₙ)推导完成。整个过程只有四步没有复杂的归纳假设也没有繁琐的代数变形它像一次精准的外科手术切开了 AM-GM 的本质AM-GM 的成立根本原因在于对数函数的凹性以及“平均”这一操作在凹函数下所表现出的“放大效应”。我让学生们把这四步写在一张卡片上随身携带每次看到 AM-GM 就拿出来默念一遍效果远胜于死记硬背。3.3 实操验证用三组数字亲手感受“平均的对数”与“对数的平均”理论再完美也需要数值的锤炼。我习惯用三组极具对比性的数字来验证这个推导确保它不是纸面上的幻觉。第一组极端不均等a₁1, a₂100AM (1100)/2 50.5GM √(1×100) 10AM/GM 5.05差距巨大。此时ln(AM) ln(50.5) ≈ 3.92而 (ln1 ln100)/2 (0 4.605)/2 2.30253.92 2.3025完全符合 ln(AM) ln(GM)。第二组全部相等a₁a₂...aₙ5AM GM 5等号成立。此时ln(AM) ln(5) ≈ 1.6094(Σln aᵢ)/n (n×ln5)/n ln5完全相等。这验证了詹森不等式中“等号成立当且仅当所有 xᵢ 相等”的条件。第三组三个数a₁2, a₂3, a₃6AM (236)/3 11/3 ≈ 3.6667GM ³√(2×3×6) ³√36 ≈ 3.3019AM/GM ≈ 1.11。计算 ln(AM) ≈ ln(3.6667) ≈ 1.299而 (ln2 ln3 ln6)/3 (0.693 1.099 1.792)/3 ≈ 3.584/3 ≈ 1.1951.299 1.195依然成立。这三组数据覆盖了不等、相等、多点三种典型场景每一次计算都在强化一个信念詹森不等式不是一个孤立的定理它是连接函数形态与数值关系的一座坚实桥梁。4. 实操应用与核心环节实现从理论到真实世界的四次落地4.1 应用一投资组合的预期效用——为什么“平均收益”会骗人金融学里有个经典悖论一个投资有 50% 概率赚 100%50% 概率亏 50%。它的期望收益率是 0.5×100% 0.5×(−50%) 25%。看起来很诱人对吧但如果你真投进去一年后你的财富会变成要么 ×2赚100%要么 ×0.5亏50%。连续两年最可能的结果是先翻倍再腰斩或者先腰斩再翻倍最终都是回到原点。长期来看你的财富增长率为零而不是 25%。这个问题的根源就在于财富增长是一个乘法过程而我们的直觉却习惯用加法平均去思考。詹森不等式在这里大显身手。设财富增长因子为随机变量 R其取值为 2 或 0.5各占 50%。投资者的效用满意度通常被建模为财富的对数函数 U(W) ln W因为对数效用体现了“边际效用递减”这一基本人性——赚第二个 100 万带来的快乐远小于赚第一个 100 万。那么长期的期望效用是 E[ln R] 0.5×ln2 0.5×ln0.5 0.5×0.693 0.5×(−0.693) 0。而“效用的期望值”是 ln(E[R]) ln(0.5×2 0.5×0.5) ln(1.25) ≈ 0.223。由于 ln x 是凹函数詹森不等式告诉我们E[ln R] ≤ ln(E[R])即 0 ≤ 0.223。这解释了为什么用“平均收益率”对应 ln(E[R])来评估投资是危险的因为它高估了真实的、基于效用的长期回报E[ln R]。真正的“凯利准则”Kelly Criterion最大化 E[ln R]而非 E[R]其数学根基正是此处的詹森不等式。4.2 应用二机器学习中的损失函数设计——凸性如何保障训练稳定在训练一个神经网络时我们定义一个损失函数 L(θ)其中 θ 是模型的所有参数。我们的目标是找到一个 θ*使得 L(θ*) 最小。如果 L(θ) 是一个凸函数那么任何局部最小值都必然是全局最小值。这就为梯度下降等优化算法提供了坚实的理论保障只要一直往下走就一定能走到谷底。那么如何设计一个凸的损失函数詹森不等式给出了一个强大的构造工具复合函数的凸性判定。一个经典的例子是 Softmax 分类器的交叉熵损失Cross-Entropy Loss。其形式为 L(θ) −Σ yᵢ ln(pᵢ)其中 yᵢ 是真实标签one-hot 编码pᵢ 是模型预测的概率。这个函数本身是凸的其凸性证明就依赖于詹森不等式。更一般地如果我们有一个凸函数 g和一个仿射函数即线性函数加常数h(θ) Aθ b那么复合函数 g(h(θ)) 仍然是凸的。而神经网络的前向传播本质上就是一系列仿射变换权重矩阵乘法加偏置和非线性激活函数的复合。因此选择一个凸的激活函数如 ReLU和一个凸的损失函数如平方误差、交叉熵就能通过詹森不等式链式地保证整个损失函数的凸性或近似凸性从而让训练过程更加稳健。我在调参时如果发现损失曲线反复震荡、无法收敛第一反应就是检查损失函数的凸性假设是否被破坏这往往能快速定位到是数据预处理如未归一化还是激活函数选择如用了非凸的 tanh 在深层出了问题。4.3 应用三信息论中的 KL 散度——凸性如何定义“距离”KL 散度Kullback-Leibler Divergence是衡量两个概率分布 P 和 Q 差异的核心指标定义为 D_KL(P||Q) Σ pᵢ ln(pᵢ/qᵢ)。它虽然不满足距离的对称性和三角不等式但却有一个极其重要的性质D_KL(P||Q) ≥ 0且等号成立当且仅当 P Q。这个性质的证明正是詹森不等式的教科书级应用。关键在于我们将 KL 散度重写为D_KL(P||Q) Σ pᵢ ln(pᵢ) − Σ pᵢ ln(qᵢ) −H(P) Σ pᵢ ln(1/qᵢ)其中 H(P) 是 P 的熵。注意到 Σ pᵢ 1且 pᵢ ≥ 0所以 {pᵢ} 构成了一组合法的权重。而函数 f(x) −ln x 是凸的。于是我们令 xᵢ qᵢ/pᵢ那么根据詹森不等式f(Σ pᵢ xᵢ) ≤ Σ pᵢ f(xᵢ)即−ln(Σ pᵢ (qᵢ/pᵢ)) ≤ Σ pᵢ (−ln(qᵢ/pᵢ))左边−ln(Σ qᵢ) −ln(1) 0 右边Σ pᵢ (−ln qᵢ ln pᵢ) −Σ pᵢ ln qᵢ Σ pᵢ ln pᵢ −Σ pᵢ ln qᵢ − H(P) D_KL(P||Q)因此0 ≤ D_KL(P||Q)证毕。这个证明的精妙之处在于它没有陷入复杂的微积分而是用一个权重平均的视角将 KL 散度的非负性还原为一个基本的凸性事实。这让我在教授信息论时能跳过那些令人望而生畏的变分法直接用学生已经掌握的詹森不等式建立起对 KL 散度本质的理解。4.4 应用四物理学中的热力学第二定律——凸性与不可逆性的隐秘联系在统计物理中熵 S 是一个核心概念它被定义为 S −k_B Σ pᵢ ln pᵢ其中 pᵢ 是系统处于第 i 个微观状态的概率。热力学第二定律指出一个孤立系统的熵永不减少。这个宏观的、不可逆的演化规律其微观根源竟然也深植于凸性之中。考虑一个系统从初始分布 P⁰ 演化到终态分布 P¹。根据吉布斯不等式Gibbs inequality对于任意两个概率分布 P 和 Q有 −Σ pᵢ ln pᵢ ≤ −Σ pᵢ ln qᵢ等号成立当且仅当 P Q。这个不等式正是詹森不等式在 f(x) x ln x 上的应用f 是凸的。它表明对于一个固定的“参考分布” Q当 P 变化时−Σ pᵢ ln qᵢ 这个量在 P Q 时取得最小值而这个最小值恰好就是 −Σ qᵢ ln qᵢ即 Q 的熵。在热力学中一个孤立系统会自发地向“最概然分布”演化而这个最概然分布正是在给定约束如总能量守恒下使熵 S −k_B Σ pᵢ ln pᵢ 最大的那个分布。由于 f(p) −p ln p 是一个凹函数注意符号最大化一个凹函数等价于最小化一个凸函数其最优解的唯一性和稳定性都由凸性分析所保证。因此熵增原理这个支配着宇宙演化的终极法则其数学骨架竟然是由詹森不等式所支撑的凸性分析。我在给物理系学生讲这部分时会把熵的公式写在黑板上然后问“如果我把 ln 换成 log₁₀结论还成立吗”答案是肯定的因为不同底数的对数只差一个常数倍不改变凸性。这个小小的提问总能引发一场关于数学结构普适性的热烈讨论。5. 常见问题与排查技巧实录踩过的坑与独家避坑指南5.1 常见误区一“所有‘碗状’函数都是凸的”——定义域陷阱这是初学者掉进最多次的坑。看到 f(x) 1/x 的图像在 x0 时是向下弯曲的“碗状”就认为它是凸的。但这是错误的。f(x) 1/x 的二阶导数是 f(x) 2/x³当 x0 时f(x)0所以它在 (0, ∞) 上确实是凸的。但问题在于它的定义域是 (−∞, 0) ∪ (0, ∞)这是一个不连通的集合更不是一个凸集因为取 x₁−1 和 x₂1它们的中点 x0 并不在定义域内。所以我们只能说 f(x) 1/x 在 (0, ∞) 上是凸的或者在 (−∞, 0) 上是凸的但不能笼统地说“1/x 是凸函数”。我的排查技巧每次遇到一个新函数第一件事不是画图而是明确写出它的自然定义域并判断这个定义域是否为凸集。对于单变量函数凸集就是区间开、闭、半开半闭均可。如果定义域是多个区间的并集那它就不是凸集詹森不等式在此处不适用。我曾见过一个学生试图对 f(x) √|x| 在 x−1 和 x1 之间应用詹森不等式结果得到荒谬的结论根源就在于他忽略了 |x| 的定义域虽然是 R凸集但 √|x| 在 x0 处不可导而詹森不等式并不要求可导只要求凸性所以这个例子其实是成立的——这又引出了下一个误区。5.2 常见误区二“凸函数必须处处可导”——不可导点的处理凸函数可以有“尖角”比如 f(x) |x|。它在 x0 处不可导但它绝对是凸的因为它的图像是一个 V 字任意两点的弦都在图像之上。詹森不等式对这种函数依然有效。事实上凸函数的一个重要性质是它在定义域内部处处存在左导数和右导数且左导数不大于右导数。我的实操心得当你遇到一个有“拐点”的函数时不要急于否定它的凸性。相反应该用定义法去验证任取两点计算弦的方程再与函数值比较。对于 f(x) |x|取 x₁−1, x₂2, λ0.5左边 f(0.5) 0.5右边 0.5×1 0.5×2 1.50.5 ≤ 1.5成立。多试几组信心就来了。在编程实现时我习惯用numpy生成大量随机点对和权重进行蒙特卡洛验证这比手工计算更可靠。5.3 常见误区三“权重必须是等概率的”——加权平均的灵活性很多初学者在推导 AM-GM 时只记得等权重 wᵢ 1/n从而误以为詹森不等式只能处理“平均”。这是巨大的误解。詹森不等式的威力恰恰在于它的加权普适性。例如在经济学中计算一个国家的“加权平均通胀率”不同商品的权重是其在 CPI 篮子中的占比在信号处理中对一个噪声信号进行滤波滤波器的系数就是一组精心设计的权重。我的独家技巧我会教学生一个“权重可视化”法。把权重 wᵢ 想象成天平上的砝码把 xᵢ 想象成砝码的位置。那么左边 f(Σwᵢxᵢ) 就是“把所有砝码按位置放好找到天平的平衡点再把这个平衡点的坐标代入 f”。右边 Σwᵢf(xᵢ) 就是“先把每个砝码单独放到 f 的曲线上读出它的高度再按砝码重量加权平均这些高度”。凸性保证了前者总是小于或等于后者。这个类比让抽象的权重瞬间变得可触摸。5.4 常见误区四“等号成立只需要所有 xᵢ 相等”——凸集边界条件詹森不等式等号成立的条件标准表述是“当且仅当所有 xᵢ 相等或者 f 是线性函数”。但还有一个隐藏条件所有 xᵢ 必须落在 f 的同一个“线性片段”上。对于严格凸函数如 x², eˣ等号成立确实只在所有 xᵢ 相等时发生。但对于一个分段线性凸函数比如 f(x) max(0, x)它在 x≤0 时是常数 0线性在 x≥0 时是斜率为 1 的直线也是线性。那么如果我取 x₁−1, x₂1权重各 0.5左边 f(0) 0右边 0.5×f(−1) 0.5×f(1) 0.5×0 0.5×1 0.50 0.5不等号严格成立。但如果我取 x₁−2, x₂−1都在 x≤0 区间那么 f(x₁)f(x₂)0左边 f(−1.5)0右边 0.5×0 0.5×0 0等号成立尽管 x₁ ≠ x₂。我的避坑指南在严谨的证明或关键应用中永远要检查 f 的“线性区域”。一个快速的方法是看 f 的二阶导数如果存在是否恒为零。如果 f(x) ≡ 0 在某个区间上成立那么 f 在该区间上就是线性的等号可以在该区间内的任意点集上成立。这个细节在优化算法的收敛性分析中至关重要它决定了我们能否在非单点解上获得最优值。6. 实操工具与代码验证用 Python 把抽象概念变成可视结果6.1 工具选型解析为什么选择 NumPy Matplotlib 而非 SymPy在验证数学不等式时符号计算Symbolic Computation和数值计算Numerical Computation各有优劣。SymPy 能给出严格的代数证明但它在处理高维、复杂函数或随机采样时速度慢且容易内存溢出。而我们的目标不是发表一篇纯数学论文而是快速、直观、可交互地理解詹森不等式的含义。因此我坚定地选择了 NumPy 和 Matplotlib 这套“轻骑兵”组合。NumPy 提供了高效的数组运算和随机数生成让我们能在毫秒内生成百万级别的随机样本Matplotlib 则能将抽象的不等式关系转化为一目了然的图像。我编写的验证脚本核心思想是生成大量随机的 xᵢ 和 wᵢ计算左边和右边的值然后绘制散点图。如果所有点都落在 yx 线的下方或之上就直观地验证了不等式。这种“眼见为实”的方式对学生和工程师的冲击力远超一长串的代数推导。6.2 核心代码实现一个可直接运行的验证脚本以下是我日常使用的、经过充分测试的 Python 脚本。它包含了详细的注释你可以直接复制粘贴到 Jupyter Notebook 中运行。import numpy as np import matplotlib.pyplot as plt # 设置随机种子保证结果可重现 np.random.seed(42) # 定义我们要验证的凸函数 f(x) x^2 def f(x): return x ** 2 # 生成随机数据n 个点每个点在 [-2, 2] 区间内 n 1000 x_values np.random.uniform(-2, 2, n) # 生成随机权重n 个非负数和为 1 # 方法生成 n 个指数分布随机数再归一化 w_weights np.random.exponential(scale1.0, sizen) w_weights w_weights / np.sum(w_weights) # 归一化 # 计算左边f(加权平均) weighted_mean_x np.sum(w_weights * x_values) left_side f(weighted_mean_x) # 计算右边加权平均的 f(x) f_x_values f(x_values) right_side np.sum(w_weights * f_x_values) # 打印结果验证不等式 print(f左边 f(Σw_i x_i) f({weighted_mean_x:.4f}) {left_side:.4f}) print(f右边 Σw_i f(x_i) {right_side:.4f}) print(f不等式成立: {left_side right_side}) # 进行大规模蒙特卡洛验证 num_trials 10000 left_results np.zeros(num_trials) right_results np.zeros(num_trials) for i in range(num_trials): # 每次试验生成新的随机 x 和 w x_trial np.random.uniform(-2, 2, n) w_trial np.random.exponential(sizen) w_trial w_trial / np.sum(w_trial) weighted_mean np.sum(w_trial * x_trial) left_results[i] f(weighted_mean) right_results[i] np.sum(w_trial * f(x_trial)) # 绘制散点图横轴是左边纵轴是右边 plt.figure(figsize(10, 8)) plt.scatter(left_results, right_results, s0.1, alpha0.6, colorsteelblue) plt.plot([0, np.max(right_results)], [0, np.max(right_results)], r--, linewidth2, labely x (等号线)) plt.xlabel(f(Σw_i x_i) [左边]) plt.ylabel(Σw_i f(x_i) [右边]) plt.title(詹森不等式验证f(x) x²) plt.legend() plt.grid(True, alpha0.3) plt.show() # 计算违反不等式的比例应该为 0 violations np.sum(left_results right_results) print(f在 {num_trials} 次试验中违反不等式的次数: {violations})这段代码的输出会显示一个漂亮的散点图所有点都密密麻麻地聚集在 yx 线的下方形成一条清晰的“云带”。这比任何文字描述都更有说服力。我建议你修改f(x)函数试试f(x) np.exp(x)、f(x) -np.log(x)注意 x0甚至f(x) np.abs(x)亲眼看看不同凸函数下的云带形状有何不同。这种动手实践是把知识刻进肌肉记忆的唯一途径。6.3 进阶技巧用动画展示“权重变化”对不等式的影响为了更深入地理解权重的作用我编写了一个简单的动画脚本它展示了当两个点 x₁ 和 x₂ 固定时权重 λ 从 0 变化到 1 的过程中左边和右边的值是如何变化的。from matplotlib.animation import FuncAnimation # 固定两个点 x1, x2