GUM补充件2:多输出量不确定度评定的蒙特卡洛方法解析
2026/9/6 23:28:30 网站建设 项目流程

简介:ISO IEC GUIDE 98-3 Suppl.2 2011 不确定度测量 第3部分 GUM 是针对测量不确定度评估与表达的权威国际指南,面向科研人员、工程测试、质量控制及计量检测从业者,用于规范测量结果不确定度的评定、合成与报告,解决测量数据可比性与可信度不足的问题。资源为单份PDF文档,压缩包共1个文件,大小约20.97MB,格式标准、便于查阅,适合作为案头工具书长期使用。指南系统介绍不确定度定义、GUM基本原则、测量模型、A类和B类标准不确定度、合成不确定度、扩展不确定度、报告与传播规则,并给出物理实验、化学分析、环境监测等应用实例,内容覆盖从基础概念到复杂计算传播的完整链条,实用性强。目前已有223人学习该资料。读者可获得国际标准原文,系统掌握测量不确定度评估的标准化方法,对提升实验室数据质量和跨实验室结果一致性具有直接参考价值。 做计量校准的朋友应该都有过这种经历:一台多通道测温仪送校,客户要的是每个通道修正值以及对应的扩展不确定度,八个通道就是八个输出量。按GUM法做,先得对每个通道分别建模、分别算A类B类分量、分别合成,最后报表里列一串结果——但仔细一想不对劲:这八个通道用的是同一支标准器、同一套测量系统,通道之间的结果本质上并不独立。可你要是问我它们之间相关的程度到底有多大,按传统GUM流程很难答得干脆。后来接触到ISO/IEC Guide 98-3 Supplement 2这份文件,才意识到这类“多个输出量联合评定”的问题,早在2011年就有了系统的解法。

这份补充文件的全名是Uncertainty of measurement — Part 3: Guide to the expression of uncertainty in measurement (GUM:1995) — Supplement 2: Extension to any number of output quantities,中文语境里常直接叫它GUM补充件2。它解决的不是“GUM算错了”,而是“GUM在很多场景下不够用、不好算、甚至算不准”的问题。这篇文章我就以自己读这份文件、用其中的方法处理实际校准数据的经验为线索,聊聊它到底补了什么、怎么用、有哪些坑。

1. 一份编号很长的文件,究竟补的是什么

先拆一下标题里这串编号。ISO/IEC Guide 98-3是GUM主文档的正式编号,对应的就是国际通行的《测量不确定度表示指南》。这份主文档从1995年发布以来,奠定了不确定度评定的基本框架:建立测量模型、做A类/B类评定、求合成标准不确定度、取包含因子算扩展不确定度、给出包含区间。

但GUM本身有两个先天的近似前提,恰恰是后来所有补充文件要修修补补的根源。

第一个前提是线性化近似。GUM的核心操作是对测量模型做一阶泰勒展开,把复杂的非线性模型在测量点附近“拉直”成一条直线,然后对这条直线做不确定度传播。模型接近线性时,这个近似非常好;模型非线性很强时,一阶近似丢掉的高阶项会导致合成标准不确定度明显偏离真实值。

第二个前提是对称分布假设。GUM的经典做法是用合成标准不确定度乘以包含因子k(通常取2),得到一个对称的包含区间。这个做法隐含了“输出量近似服从正态分布或t分布”的假设。但是当输入量的概率分布明显不对称,或者模型非线性把对称分布“扭曲”成不对称分布时,95%包含区间的一端其实比另一端长得多,用一个对称区间表达是不诚实的——它会让使用者高估或低估单侧的风险。

于是国际组织先后出了几个补充文件。Supplement 1(2008年发布)提出用蒙特卡洛方法(MCM)传播概率分布,专门处理单输出量的情况,也就是“我不再用一阶泰勒展开去近似,而是直接把输入量的概率分布经过模型‘播’到输出端”。Supplement 2(2011年发布)则把这套思路正式推广到任意数量的输出量——也就是我开头说的多通道、多参数、多输出量联合评定的场景。

国内很多同行对JJF 1059.1(对应GUM)和JJF 1059.2(对应Supplement 1的蒙特卡洛方法)比较熟,但对Supplement 2相对陌生。实际上,凡是涉及多个被测量同时评定、而且这些被测量共享输入量或存在相关性的场景,都是Supplement 2的用武之地。

2. 多输出量模型为什么让传统GUM法特别别扭

多输出量测量模型的数学形式是:

Y1 = f1(X1, X2, ..., Xn)
Y2 = f2(X1, X2, ..., Xn)
...
Ym = fm(X1, X2, ..., Xn)

也就是说,若干个输出量共享同一组输入量。共享输入量这件事,天然让输出量之间产生了相关性。一个很典型的例子是最小二乘拟合直线:

Y1 = a + b·t1
Y2 = a + b·t2

这里的a是截距,b是斜率。做最小二乘拟合的人都知道,a和b是强相关的,相关系数常常接近-1。如果你只在t1和t2两个温度点上报修正值,单看Y1、Y2各自的不确定度,GUM法完全能算;但如果你要验证这两个点之间的线性度、要判断Y1与Y2的差值是否在允许范围内,就必须知道Y1和Y2的协方差。单独对每个点做GUM评定,等于默认两个点之间毫无关联,这会直接导致“两个点差值的波动范围”被明显错估。

GUM法理论上也能处理多输出量。你需要先求每个输出量对每个输入量的偏导数,组成灵敏度矩阵;再按不确定度传播律,用灵敏度矩阵和输入量的协方差矩阵相乘,得到输出量的协方差矩阵。听起来不复杂,但实际操作非常容易出错。模型稍微复杂一点,灵敏度矩阵的推导就变成一场符号运算的噩梦;一旦某个偏导数算错,所有输出量之间的协方差全错,而且很难发现。

我自己的体会是,做单输出量评定时,GUM法虽然也要推导灵敏度系数,但算完一个就完了,错了也能从合成标准不确定度的量级上看出端倪。多输出量不是这样——你算出来的不是一组数,而是一个完整的协方差矩阵,矩阵里每个元素都可能是错的,但整体看去很“规整”,根本不知道哪里出了问题。更麻烦的是非线性较强的模型,一阶偏导本身就不够用了,灵敏度矩阵的前提都站不住。

所以多输出量模型的痛点不是“GUM给不出结果”,而是“传统方法给出一堆需要大量手工推导、难以验证、在非线性场景下还可能失真的结果”。

3. S2的解法思路:把输入分布直接“播”到输出端

Supplement 2采用的方法,本质上和Supplement 1一脉相承:不再对模型函数求导,而是让分布“穿过”模型

蒙特卡洛方法的核心逻辑其实特别朴素。你想知道输出量Y的分布长什么样,最简单粗暴的办法就是:从输入量X1、X2...Xn的分布里抽一组样本;把这组样本代入测量模型,算出一个Y;重复这个动作成千上万次;最后把这成千上万个Y的样本收集起来,直接拿它们估计均值、标准差、包含区间。当样本量足够大时,这些统计量就会收敛到真实值——这就是大数定律。

对于单输出量,这个方法的价值主要体现在非线性模型和明显不对称分布的情况。我有一个常举的例子:热敏电阻的Steinhart-Hart方程,输出温度是电阻值的非线性函数,而且这个函数在低温端和高温端的弯曲程度完全不同。用GUM法在室温附近做线性化,能得到一个还能接受的结果;在低温端做,合成标准不确定度与蒙特卡洛法算出来的明显有差距,因为一阶近似丢失了太多曲率信息。

Supplement 2把这种思路扩展到多输出量后,一个特别大的好处是:输出量之间的相关性根本不用你手动算

传统方法需要用偏导数和协方差矩阵去“推导”输出量之间的协方差;多元MCM则是从输入量的联合分布里抽一个样本向量,代入模型算出一个输出量向量;重复M次之后,输出量样本矩阵的协方差结构直接就在那里,你只需要做统计,不需要做微积分。输入量相关,没关系,直接按它们的联合分布抽样;模型非线性,也没关系,反正每次抽样都是把完整的模型函数式算一遍,不存在线性化误差。

具体实现的时候,如果输入量服从多元正态分布,可以用Cholesky分解来生成相关样本。代码逻辑很短:

import numpy as np # C 为输入量的协方差矩阵,mu 为输入量均值向量 L = np.linalg.cholesky(C) z = np.random.standard_normal((M, len(mu))) x = mu + z @ L.T # 每行是一个输入量样本向量

然后对每一行样本代入模型,得到M个输出量向量:

Y = np.apply_along_axis(model, 1, x)

这一下就把多输出量的联合分布样本拿出来了:Y的每一列对应一个输出量,任意两列之间的相关系数、协方差,直接调用np.corrcoefnp.cov就能算出来。S2在“多元”这件事上的核心贡献,就是把这种联合样本思维从单输出量推广成一套完整可落地的评定流程,包括M的确定方法、包含区域的构造方法、结果报告的格式要求,以及与GUM法结果的比较判据。

4. 按补充文件跑一遍多元MCM:步骤与注意事项

S2给出的操作流程,我按自己的实践习惯整理成六个步骤。

第一步,明确测量模型和输入量清单。把输出量和输入量的函数关系写清楚。多输出量的模型要特别注意:输出量之间是否共享输入量?输入量本身是否存在相关性?这两件事直接影响是否需要使用真正的多元MCM。

第二步,为每个输入量指定概率分布(PDF)。这一步是整个流程里的“艺术活”,也是最容易出错的地方。重复测量的数据通常给正态分布或t分布;仪器说明书上的最大允许误差通常给矩形分布或三角分布,而且矩形分布的半宽要取边界值而不是标准差;历史校准证书给的是扩展不确定度和包含因子,要反推成标准不确定度再对应到分布。把矩形分布当成正态分布处理,是新人最常犯的错误——两种分布在同样半宽下的标准偏差差了约1.73倍。

第三步,确定样本量M。S1/S2体系里,传统做法是直接取M=10^6,这个量级对大多数计量场景都够用。追求严谨的话,用自适应方法:先设一个较小的M(比如10^4),跑一遍,得到输出量估计值和包含区间;再把M翻倍,重新跑,比较两次包含区间端点的差异;如果差异小于你设定的容差,就认为结果稳定了。我自己习惯的做法是直接取10^6,同时记录随机数发生器类型和随机种子,保证结果可复现。

第四步,抽样并传播。从输入量的联合分布中抽取M个样本向量,逐一代入模型函数,得到M个输出量向量。这一步在Python里可以用numpy的向量化操作写得很干净,但要注意模型的实现方式——如果模型本身是个复杂的嵌套循环,10^6次调用可能会很慢,这时候可以采用分块计算,比如一次处理10^4个样本,分100批跑完。

第五步,汇总估计。对M个输出量向量做统计处理。输出量估计值就是样本均值;标准不确定度是样本标准差;输出量之间的协方差矩阵直接用样本协方差矩阵;包含区域则按文档给出的方法构造。这里必须注意,多输出量情形下的“包含区域”不是把每个输出量的包含区间简单拼成一个矩形,而是要在联合分布里寻找一个概率质量达到95%的区域。S2文档对包含区域的构造方式有具体说明,实际使用时按文档执行即可。Cov(Y1, Y2) = uA² + t1·t2·uB² + ρ·uA·uB·(t1 + t2)。对两三个输出量,手推还能扛;输出量一多,各种交叉项铺天盖地,想一想都头疼。

第六步,报告结果。按照S2的要求,报告里应包含:测量模型;输入量的PDF及来源;抽样数M;随机数发生器类型和种子;输出量估计值向量;标准不确定度向量;协方差矩阵或相关系数矩阵;包含概率对应的联合包含区域。这些信息加在一起,别人拿到你的报告才能复现你的计算过程。我见过不少只报“扩展不确定度”却不写任何计算过程信息的报告,这种报告在做计量比对时很难审计清楚。

这里补充一个验证手段。S2里提供了MCM结果与GUM法结果互相比较的判据:如果GUM法给出的95%包含区间与MCM给出的95%包含区间差异足够小(例如端点偏差小于某个容差),则可以说在这个场景下GUM法的结果是可信的;如果差异大,则说明线性化假设引入的误差不可忽略,应以MCM结果为准。我在实际项目里的经验是,模型越非线性、输入量分布越不对称,两者的差异越明显。

5. 我在实际项目里的几条经验和坑

用S2的多元MCM处理实际项目也有几年了,踩过不少坑,挑几个最典型的说说。

第一个坑是PDF类型选错。我接过一个项目,客户的校准规范里写“温度计最大允许误差±0.3°C”,让我评不确定度。有人直接把它当正态分布,取0.3/3=0.1°C作为标准不确定度。这其实是把“最大允许误差”当成了“扩展不确定度”。规范里给的是界限,没有给分布,就应该按矩形分布处理,标准不确定度是0.3/√3≈0.17°C,两者差了快一倍。PDF指定的差别会在MCM里直接放大到输出量分布上,所以源头不能马虎。

第二个坑是只报单点结果、忽略相关矩阵。好多校准软件输出的是每个通道单独的扩展不确定度,没有相关系数。对于单点使用场景这够用,但客户在做差值判断或线性度验证时就没有依据了。后来我处理这类数据都习惯顺手把输出量之间的协方差矩阵也打出来,用S2的方法这个成本很低——样本都抽出来了,np.cov一行代码的事。

第三个坑是M值不够大导致结果不稳定。我早期做MCM验证时,贪快取了M=10^4,结果同一个模型连续跑三次,95%包含区间端点每次都差不少。后来把M提到10^6,区间端点就稳定了。S2文档里自适应MCM方法的存在,就是因为这个稳定性问题。如果你发现同一条数据重复跑结果忽高忽低,先别怀疑程序,多半是M太小。

第四个坑是随机数质量问题。Excel老版本自带的随机数发生器质量不够好,用它做10^6量级的MCM容易出现长周期相关性。我的习惯是用Python的numpy.random.default_rng(),默认的梅森旋转算法(MT19937)周期足够长,均匀性也经过了大量验证。跑完后固定种子并写入报告,这样任何人在任何时候都能复现你的数据。

第五个坑是文档的算例值得反复读。Supplement 2正文的算例覆盖了温度测量、质量校准、射频功率等场景,里面有完整的输入量PDF设定、协方差矩阵处理方式、结果对比过程。说实话,我每次要处理一个多输出量新项目时,都会把相关算例翻出来对照一遍,比对着文档公式硬推效率高得多。

还有一点实际操作经验:用S2方法处理非线性模型时,记得检查一下GUM法结果和MCM结果差异大的位置出现在哪里。有时候差异集中在包含区间的某一侧,这往往意味着分布不对称,直接报对称扩展不确定度会误导用户。把两种结果并排放在一起审视,能帮你判断该信任哪个结果,以及为什么。

最后再分享一个小技巧。处理最小二乘拟合这类共享参数的多输出量模型时,可以先单独跑一次MCM拿到所有输出量的联合样本,然后不管客户要的是单点不确定度、两点差值、还是整条曲线的置信带,都能从同一批样本里直接算出来,不需要重新建模、重新采样。这比每次遇到新问题都从头推一遍GUM公式省太多时间了。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询