尧图精选

用 manim 从零讲透极大似然估计:动画教学全攻略

🕒 发布时间:2026/9/7 11:03:17 📁 来源:尧图网络
这次我们来看一个不是模型、也不是工具而是一套把“极大似然估计MLE”从零讲透的 manim 教学动画项目。它的价值在于用动画把抽象的统计推导变成肉眼可见的推导过程适合正在学机器学习和统计学的人也适合想用 manim 做知识类动画的开发者。这个项目最核心的几个特点如下使用 manim3Blue1Brown 开源的教学动画引擎编写数学公式、函数图像、推导过程全部代码化可复现、可修改。讲解路径是“直觉 → 例子 → 公式 → 对数变换 → 求导 → 扩展”不是直接扔出极大似然估计的定义。渲染门槛低不需要独立 GPU普通办公电脑即可完成视频渲染。支持命令行批量渲染多个场景适合把一个完整教程拆成多个短视频分集。输出为 MP4 视频方便直接用于课程、B 站/公众号配图、个人知识库。这篇文章会带你把 manim 环境装好、写出第一个 MLE 场景、把“硬币估计”这个经典例子拆成 6 个动画分镜、跑通渲染命令最后解决中文字体、LaTeX、性能这些实际部署中一定会遇到的坑。看完之后你既能复习一遍极大似然估计的核心推导也能独立制作属于自己的数学动画教程。1. 极大似然估计教学动画核心能力速览能力项说明项目类型数学概念可视化教学项目动画引擎manim3Blue1Brown 开源教学动画引擎讲解主题极大似然估计MLE从直觉到公式推导运行环境本地 Python 项目全平台支持Windows / macOS / LinuxGPU 需求无特殊要求manim 默认使用 CPU 渲染动画显存占用无特定显存要求主要看 CPU 与内存启动方式manim 命令行渲染启动接口 APImanim Python API每个 Scene 类就是一个动画单元批量任务支持一次命令渲染多个 Scene输出格式MP4 视频H.264 编码适合场景数学课教学、机器学习概念讲解、知识类视频制作从规格表能看出来这个项目最大的优势是门槛足够低不需要高端显卡只要 Python 环境和几个系统依赖就能跑。相比跑大模型动不动几十 GB 显存manim 动画渲染几乎不构成硬件压力。2. 适用场景与使用边界极极大似然估计是机器学习和统计学的交汇点理解 MLE 是理解线性回归、逻辑回归、朴素贝叶斯的基础。这个 manim 项目适合以下人群刚学机器学习想搞清楚“为什么逻辑回归要最大化对数似然”的人。正在做教学视频、课程 PPT需要把推导过程做得足够直观的老师或内容创作者。想学 manim 动画开发拿一个相对完整的主题练手的人。它能解决的问题也很明确用视觉动画把“似然函数为什么长这样”“为什么要取对数”“为什么求导等于 0 就能得到估计值”这些问题讲清楚。动画的优势在于你可以把一连串推导步骤分解成多个动效观众不会被屏幕上同时出现的一大堆公式吓到。使用边界同样需要说清楚manim 输出的是预先渲染好的视频不是交互式网页。如果你想做“可拖拽参数”的交互演示应该去选 Plotly、Observable 或 Streamlit。极大似然估计的严格数学证明例如渐近正态性、一致性动画并不能替代完整推导只适合做直觉铺垫。本项目的核心是“教学表达”不是“算法库”。如果只是算 MLE直接用 scipy.optimize 或 statsmodels 更高效没必要渲染成视频。版权与合规方面也提一句manim 本身采用 MIT 协议可自由使用与修改但你自己制作教学视频时使用的背景音乐、图标、字体、示例图片都要确认授权。教程中用到的示例数据如果来自公开数据集要保留原始来源说明。3. manim 本地部署环境准备在写完整分镜之前先把环境搭好。这个步骤不需要太高理论门槛照着清单检查一遍即可。前置条件清单检查项推荐配置说明操作系统Windows 10/11、macOS、主流 Linux 发行版manim 跨平台Python 版本3.9 及以上新版本 manim 要求 Python 3.9包管理器pip / conda二选一即可系统依赖ffmpeg视频合成必须可选依赖LaTeXTeX Live / MiKTeX / MacTeX渲染数学公式建议安装磁盘空间建议预留 5GB 以上临时文件和输出视频需要空间Python 环境准备建议使用虚拟环境避免和其他项目的依赖冲突。在项目根目录执行python -m venv venvWindows 激活虚拟环境venv\Scripts\activatemacOS / Linux 激活虚拟环境source venv/bin/activate激活后安装 manimpip install manim安装完成后确认 manim 是否可用manim --version如果输入manim提示命令找不到但 pip 安装成功说明当前 Python 的 Scripts 目录没有加入 PATH。这时可以改用模块方式调用python -m manim --versionffmpeg 的安装方式取决于操作系统。Windows 用户可以用 wingetwinget install ffmpegmacOS 用户用 Homebrewbrew install ffmpegUbuntu / Debian 用户sudo apt update sudo apt install ffmpegLaTeX 的安装体积比较大但数学公式渲染离不开它。如果暂时不想装完整版manim 允许你用纯文本Text替代MathTex但效果会差不少。这里建议一步到位公式动画是这个项目的核心LaTeX 值得装。装好之后用下面的命令验证依赖是否齐全。先写一个最小可运行脚本opening_scene.pyfrom manim import * class MaxLikelihoodOpening(Scene): def construct(self): title Text(极大似然估计) self.play(Write(title)) self.wait(2)然后渲染manim -pql opening_scene.py MaxLikelihoodOpening-p表示渲染完成后自动打开预览-ql表示低质量快速渲染适合开发阶段调试。如果这个脚本能输出一个写着“极大似然估计”的视频并且中文字体没有变方块说明环境已经通了大半。下面就可以开始写正式的 MLE 分镜了。4. 安装部署与第一个场景渲染manim 渲染一个完整的教学视频工程上建议把每个分镜拆成独立Scene类放在同一个文件里然后用一条命令批量渲染。这样便于局部修改不必整片重新渲染。先看最小工作流的组成文件或目录作用mle_full.py存放所有分镜 Scene 类的 Python 脚本media/manim 自动生成存放输出视频和缓存manim.cfg可选统一配置输出目录和质量一个最简单的 Scene 代码结构如下from manim import * class OpeningScene(Scene): def construct(self): title Text(极大似然估计从零讲透) subtitle Text(Maximum Likelihood Estimation, colorBLUE) subtitle.next_to(title, DOWN) self.play(Write(title)) self.play(FadeIn(subtitle)) self.wait(2)渲染这个场景manim -pql mle_full.py OpeningScene如果要在项目根目录统一管理输出可以创建manim.cfg[CLI] quality medium output_dir ./media/videos保存后再次运行渲染命令产物会输出到media/videos/。再往后你可以随时用-o参数指定输出文件名manim -qm mle_full.py OpeningScene -o 01_opening从部署角度看manim 把“运行脚本 → 生成视频”封装成了非常标准的命令链路。你不需要关心Mobject内部是怎么逐帧绘制的只需要把关注点放在每个分镜里画面的组织上。5. 极大似然估计从零讲透分镜与动画设计整个教学项目的核心是把极大似然估计的推导过程拆成分镜。下面这套分镜设计是经过教学实践验证的路径覆盖了从直觉到公式再到扩展的完整过程。分镜编号场景类名讲解主题画面核心元素1OpeningScene提出问题抛硬币 10 次7 次正面硬币 Dot 布局、概率文字2LikelihoodScene写出似然函数 L(p) p^7(1-p)^3MathTex 公式3LogLikelihoodScene为什么取对数连乘 → 连加 的动画转换4DerivativeScene求导、置零、求解 p0.7导数公式推导步骤5GaussianScene从离散走向连续正态分布均值的 MLE正态曲线 样本点6SummarySceneMLE 本质总结核心结论逐条浮现5.1 分镜 1硬币实验开场这个镜头要和观众建立直觉。画面上放一枚硬币下面列出实验数据抛 10 次7 次正面3 次反面。问题是在“不知道硬币是否公平”的前提下你觉得正面概率 p 最可能是多少。动画操作class OpeningScene(Scene): def construct(self): coin Circle(radius1, colorYELLOW) coin_label MathTex(p).move_to(coin) experiment Text(抛 10 次正面 7 次, colorBLUE) experiment.next_to(coin, DOWN * 3) self.play(Create(coin)) self.play(Write(coin_label)) self.play(Write(experiment)) self.wait(2)这段代码不负责解决数学问题只负责把“具体问题”摆在观众面前。为什么一定要从硬币开始因为极大似然估计的“离散情形”最容易建立直觉。当观众接受了“正面概率是 p”这个设定后面的似然函数水到渠成。5.2 分镜 2写出似然函数这是整个项目的第一个关键推导点。从概率角度如果正面概率是 p那么“10 次中 7 次正面”的概率是class LikelihoodScene(Scene): def construct(self): formula MathTex( rL(p) C_{10}^{7} p^{7} (1-p)^{3} ) self.play(Write(formula)) self.wait(2) conclusion Text(让这个概率最大的 p就是最合理的估计) conclusion.next_to(formula, DOWN) self.play(FadeIn(conclusion)) self.wait(2)这里要注意一个细节组合数 C(10,7) 在求导过程中是常数不会影响最终的 argmax 结果。动画里可以先用完整的公式然后在求导前做一个“常数项不影响最大化”的动作把组合数淡化处理。这样逻辑链条更严谨。5.3 分镜 3为什么要取对数这是极大似然估计教学中最容易略过、但最重要的动机部分。屏幕上先展示一般形式的似然函数class LogLikelihoodScene(Scene): def construct(self): likelihood MathTex( rL(\theta) \prod_{i1}^{n} f(x_i; \theta) ) log_likelihood MathTex( r\ell(\theta) \sum_{i1}^{n} \log f(x_i; \theta) ) log_likelihood.next_to(likelihood, DOWN) self.play(Write(likelihood)) self.wait(1) self.play( TransformMatchingTex(likelihood, log_likelihood) ) self.wait(2)TransformMatchingTex 是 manim 里处理公式变换的利器。它会把 L(θ) 变成 ℓ(θ)把连乘变成连加。观众能直接看到“log 把乘积变和”这个操作是怎样发生的。6. 功能测试与渲染效果验证项目写完后不要急着直接渲染 1080p 正式版。先跑功能测试确认每个分镜都符合预期。功能测试维度测试项测试目的判定标准基础渲染测试验证 Slide 能否出片生成 MP4 且长度符合预期公式渲染测试验证 LaTeX 表达是否正常公式无解析错误、无缺失中文字体测试验证 Text 中文不乱码中文正常显示无方块动画节奏测试验证 wait 时长是否合适画面不急促、不拖沓批量渲染测试验证多 Scene 一次出片每个 Scene 独立生成视频单个场景渲染测试命令manim -ql mle_full.py LikelihoodScene -o 02_likelihood渲染完成后打开视频检查这几个点公式是否显示完整。如果出现Missing character或空框多半是 LaTeX 宏包缺失。动画播放是否卡顿。如果画面有明显的瞬时跳变可以加大wait时间或者把动画拆成更多步骤。中文是否正常。如果中文显示为方块需要用Text(..., font...)指定系统中文字体。指定字体的示例title Text(极大似然估计, fontMicrosoft YaHei)macOS 可以换成fontPingFang SCLinux 可以根据系统已安装字体调整。更通用的做法是from manim import Text title Text(极大似然估计)配合系统字体配置或者传入font_path指向具体字体文件title Text(极大似然估计, font_path/path/to/your/font.ttf)功能测试通过之后再跑正式渲染能节省大量时间。7. Python API 接口与多场景批量渲染manim 的“接口”不同于 Web 服务的 HTTP API它的编程接口是 Python 类和方法。这里有一个工程化思路把每个分镜做成独立Scene放在一个模块里再用一条命令行批量产出。批量渲染多个分镜manim -qm mle_full.py OpeningScene LikelihoodScene LogLikelihoodScene DerivativeScene GaussianScene SummaryScene命令执行后manim 会按顺序渲染每一个 Scene并在media/videos/mle_full/下生成对应名称的 MP4 文件。这样做的好处是每个分镜视频都是独立文件后续剪辑时可以自由组合顺序不需要重新渲染。如果你希望用 Python 脚本控制渲染过程而不是依赖命令行可以在Scene的construct中手动设置渲染参数from manim import config config.pixel_width 1280 config.pixel_height 720 config.frame_rate 30然后编写一个更工程化的打包脚本render_all.pyimport subprocess scenes [ OpeningScene, LikelihoodScene, LogLikelihoodScene, DerivativeScene, GaussianScene, SummaryScene, ] for scene in scenes: subprocess.run( [manim, -qm, mle_full.py, scene], checkTrue )这种脚本方式适合把整个教程纳入 CI/CD 流程。比如每次修改脚本后自动批量渲染或者通过配置文件维护分镜顺序。8. 资源占用与渲染性能观察manim 是 CPU 渲染为主的应用对显卡没有硬依赖这和跑深度学习模型完全是两回事。但它的性能瓶颈依然存在主要集中在 CPU 峰值能力和内存占用上。观察维度观察方法说明CPU 使用率Windows 任务管理器 / Linux top 或 htop渲染时多核会持续高负载内存占用任务管理器 /free -h场景 Mobject 越多内存占用越高GPU 占用基本可以忽略manim 默认不调用 CUDA渲染时长对比-ql/-qm/-qh三档质量越高耗时成倍增加磁盘占用查看media/videos/目录长视频和 4K 渲染对磁盘压力更大manim 的渲染质量参数参数分辨率帧率适用阶段-ql854x48015开发和分镜预览-qm1280x72030日常测试、快速发布-qh1920x108060正式教学视频-qk3840x216060需要超清输出的场景一个常用的经验是开发阶段统一使用-ql或-qm正式发布前才用-qh渲染一遍。如果你在manim.cfg里把 quality 设置为 high每次测试都会很耗时所以建议至少准备两套配置或者在命令行显式指定质量参数。如果 CPU 较弱帧数高会导致渲染时长明显增加可以考虑把config.frame_rate降到 30 来平衡画质与速度。画面中存在大量复杂几何运算的变换渲染时间也会明显增长这时可以把一个长动画拆成多个短动画。从教学效果来说3 到 5 秒一个动效观众理解压力也小得多。9. 常见问题与排查方法下面是使用 manim 制作极大似然估计教程时最容易遇到的问题按概率从高到低排列。问题现象可能原因排查方式解决方案提示manim: command not foundmanim 安装成功但 Scripts 目录不在 PATH执行python -m manim --version验证改用python -m manim运行或将 Python Scripts 目录加入 PATH渲染报错LaTex not found系统未安装 TeX 发行版在命令行执行latex --version安装 TeX Live / MiKTeX / MacTeX或者暂时用Text代替MathTex中文显示为方块系统没有匹配的中文字体检查Text渲染字体在Text中指定font或font_path渲染速度慢一直用-qh或-qk在调试看耗时是否与质量参数强相关开发用-ql正式发布用-qh画面对象重叠混乱没有组织 Mobject 位置截图定位重叠对象使用next_to、arrange、VGroup规划布局视频无声音数学动画默认不生成音轨用播放器查看音轨信息后期用剪辑软件加配音、音乐批量渲染只出了一个视频命令行 Scene 类名写错了检查类名与 class 定义是否完全一致用空格分隔多个 Scene 类名公式渲染有缺失字符LaTeX 宏包缺失查看终端日志中的 LaTeX 报错在MathTex中使用tex_template补充宏包最常踩的坑是环境和字体。如果你只是照着网上的旧教程装过 manim记得确认版本不是始祖版。直接用新版pip install manim即可不需要额外安装manimlib。如果碰到公式解析问题比如某个命令在 LaTeX 中无效可以先把公式放到独立 MathTex 里测试确认没问题再合并到复杂场景中。这种单点测试的思路和大模型部署中“先最小化复现再排查”的思路是一致的。10. 最佳实践与使用建议最后给一套工程化建议适合真正要把这个项目做成系列视频的人。第一先写分镜表再写代码。不要边写代码边想内容。分镜表至少包含“画面元素、旁白内容、屏幕文字、时长”四列。极大似然估计这个主题看似简单但一旦拍脑袋开工很容易出现公式顺序错乱的问题。先花半小时把 6 个分镜的文字稿写出来再动手写 Scene效率能提升一倍。第二固定使用低质量参数预览。开发阶段一直用-ql把动画节奏和位置调准。确认没有问题后最后用-qh渲染正式版。这样既能保证修改效率也不会浪费大量 CPU 时间。第三场景文件按模块拆分。分镜多了以后建议按目录组织mle_tutorial/ scenes/ __init__.py opening.py likelihood.py log_likelihood.py derivative.py gaussian.py summary.py media/ videos/ manim.cfg render_all.py代码维护方面注意 manim 的 API 在不同版本间有变化。如果你在旧版本项目中看到TextMobject、VGroup等写法和新版本不同直接按新版本语法调整即可。写完后运行一次渲染测试确保每个场景都能稳定出片。第四批量任务一定要加日志和失败重试。manim 渲染虽然不像大模型推理那样容易随机失败但批量渲染 20 个分镜时场景中某个临时素材缺失会导致任务中断。render_all.py里给subprocess.run加异常捕获渲染失败时记录日志并继续下一个场景。import subprocess scenes [OpeningScene, GaussianScene] for scene in scenes: result subprocess.run( [manim, -qm, mle_full.py, scene], capture_outputTrue, textTrue ) if result.returncode ! 0: with open(render_error.log, a, encodingutf-8) as f: f.write(fScene {scene} failed\n) f.write(result.stderr) print(f{scene} 渲染失败已记录日志) else: print(f{scene} 渲染完成)自动清理临时文件也有必要。manim 会在渲染过程中生成大量中间文件学习测试阶段体积不大但系列教程做到第十集以后media/目录会膨胀到几十 GB。建议每完成一集清空一次缓存只保留最终视频。第五素材与授权要严格遵守边界。用 manim 做极大似然估计教学一般不需要外部图片但如果你计划给视频配背景音乐、使用特定字体务必确认授权范围。涉及公开数据集的案例也要在视频说明中标注来源。最后合规提醒必须放在心里反复强调制作教学视频发布到公开平台建议用自己独立绘制的图表素材如果引用第三方材料必须获得授权并注明出处。这既是版权要求也是对读者负责。对大多数人来说这个项目最值得尝试的点在于用一套代码同时完成“学 MLE”和“学 manim”两件事。最先验证的功能是-ql渲染链路和中文公式显示。最容易踩的坑是 LaTeX 缺失和字体丢失。后续想扩展可以把线性回归、逻辑回归、朴素贝叶斯的推导也用同一套路做成系列动画互相复用分镜模板和渲染配置。建议收藏备用动手做一个属于自己的分镜时再翻回来对照。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →