1. 从“只给最优参数,不给误差”的拟合痛点说起
做科学计算和数据分析的人,大概率都经历过这样一个阶段:手里有一组观测数据,心里有一个参数化模型,想根据数据反推模型参数。早期大家用scipy.optimize.curve_fit解决,输入数据和函数形式,吐出几个最优参数和协方差矩阵,完事。但这套流程在真实数据面前有几个很麻烦的边界,一旦踩到就让人头大。
第一个麻烦是没法加先验知识。比如你明明知道某个参数的物理意义决定了它不可能为负,但在curve_fit里处理这种约束就得靠参数变换或者硬编码边界,写起来非常绕。第二个麻烦是它对似然面的假定太强。curve_fit给出的误差基于一个隐含假说:似然函数在最优值附近长得像一个高斯山包,协方差矩阵就是这座山的曲率。一旦你的似然面出现强相关性、长尾、甚至双峰,这个误差估计就和实际对不上号了。第三个麻烦是它只能给你一个点估计,无法告诉你参数分布的长相,更没法做模型比较。
所以当这类需求出现时,我一般会转向emcee。emcee是Python生态里最经典的MCMC采样库,核心功能非常纯粹:你给它一个能计算“某组参数下模型与数据合理程度”的函数,它返回一大堆按照这个合理程度分布采样的参数组合。有了这堆样本,参数最优值、置信区间、参数间相关性、边缘分布形态全都能估计出来。这篇东西我不打算写官方文档式的API罗列,而是尽量把一个真实项目里emcee要用的功能、参数、坑和判断方法讲透,适合刚接触MCMC、想尽快上手处理参数估计和不确定性分析的人参考。
1.1 最大似然拟合的边界在哪里
先用自己的话复述一下为什么curve_fit不够用。curve_fit本质上是在最大化一个高斯似然,输出结果是最大似然估计,以及由似然函数曲率近似出来的参数协方差。在二维参数空间里,这等于在你的最大似然点附近套了一个椭圆,用它去描述参数的不确定性。如果真实问题的参数分布差不多就是个椭圆,那这套近似没问题;但现实数据往往不配合:参数之间高度相关时椭圆会拉成一条细窄的带状,而当似然面有不止一个峰时,你在本地峰附近套的椭圆完全忽略了另一个峰,置信区间就严重失真。
举一个实际例子。拟合一条直线y = mx + b,如果x的数据范围很窄,斜率m和截距b在参数平面里就是一条几乎沿着对角线方向拉长的细条分布。此时curve_fit给出的两个参数误差单独看可能都不大,但如果你用这对参数随机撒点画一堆直线,会发现它们在高x区域发散得很厉害,因为m和b的联合分布不是独立椭圆。MCMC这类采样方法则是直接在完整参数空间里随机游走,把真实分布的形状一点一点“画”出来,而不是用一个椭圆去强行近似,这正是它在这种场景下的优势。
当然,MCMC不是一个优化器,不要指望它像L-BFGS那样快速找到某个局部最优。它对每个参数组合算的是一个概率值,然后据此决定接受还是拒绝,最终产出的是一大堆样本点,这些样本点的密度反映了后验概率密度。这类方法的定位是“给参数分布画像”,而不是“找一个最好答案”。
1.2 MCMC要回答的问题和emcee的定位
MCMC要回答的核心问题,用最直白的话说就是:在给定数据和模型的前提下,哪些参数组合更可信?它不直接告诉你“最优解是哪一组”,而是给你一组从后验分布里抽取的样本。后验概率密度高的区域,样本点自然就密;概率密度低的区域,样本点就稀。所以当你拿到样本后做直方图、做百分位数、画等值线,都是在描述这个分布本身。
在众多MCMC实现里,emcee是入手门槛相对低的一个。它的设计思路和传统Metropolis-Hastings不同,采用多个walker协作采样,几乎不需要用户手动调提议分布宽度,而且对参数相关性的容忍度高。这种特性让它在天文学、物理学、生物学、金融建模等领域被广泛使用,因为这些问题里的参数往往天然强相关。emcee的入口只有一个核心类EnsembleSampler,功能边界很清晰:做采样、存链、算自相关时间、支持断点续跑。你不需要了解太多马尔可夫链理论的细节就能跑起来,但如果你完全不理解它在干什么,后面排查问题时就会一头雾水。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. emcee不是又一个Metropolis采样器:仿射不变集合采样原理
很多人第一次接触MCMC都是从Metropolis-Hastings开始的:从一个初始点出发,用一个高斯分布生成候选点,计算接受率,然后决定是否移动。这个方案看着简单,但一旦遇到参数空间是那种狭长的“山谷”形状,就知道有多痛苦了。高斯提议分布的宽度需要人工反复调试:太窄了,步子小,采样器在局部区域磨蹭,样本高度自相关;太宽了,候选点大部分落在低概率区域,被拒绝的概率高,走不动路。更麻烦的是,如果参数维数升高,这种随机游走的低效问题会被放大。
2.1 传统Metropolis-Hastings的先天不足
用一个生活类比来解释这个缺陷。想象你在一个很长的山脊上散步,目标是尽可能多地走到山脊的各个地方。如果每次迈步的幅度是固定的,那步伐太小时你半天走不了多远,步伐太大时你又总是跨到山脊外面去。更糟糕的是,如果山脊的宽度在不同地方不一样,你没法找到一个统一的步长同时适配所有区域。传统Metropolis-Hastings的提议分布就是这个“步长设置”,它在高维、强相关、多尺度的问题里几乎必然遇到调参地狱。
emcee的思路完全不同。它运行的不是一个采样器,而是一组采样器同时工作。这一组采样器里的每个个体称为一个walker,它们共享目标分布,但在参数空间里各自独立地游走。更新某个walker时,不是基于固定的高斯提议分布,而是从这一组walker里随机挑一个其他个体作为参照,沿这两个点的连线方向生成候选位置。这样就天然实现了“步长自适应”:在狭窄区域,walker
