Go Gonum distuv 怎样计算正态分布尾部概率
来源:17golang原创
时间:2026-10-30 20:58:52 230浏览 收藏
在 Go 里用 Gonum 处理正态分布时,尾部概率不要自己先写误差函数。gonum.org/v1/gonum/stat/distuv 的 Normal 已经提供了 CDF(x) 和 Survival(x):前者表示随机变量小于等于 x 的累计概率,后者表示大于 x 的右尾概率。需要右尾时直接调用 Survival,可读性也比手写 1-CDF(x) 更好。
官方地址:https://pkg.go.dev/gonum.org/v1/gonum/stat/distuv
把观测值先放回它所属的分布,再决定看左尾还是右尾:左侧用CDF,右侧用Survival,双侧则分别计算两端再相加。
Mu是正态分布的均值,Sigma是标准差。CDF(x)适合“低于阈值”的累计概率。Survival(x)适合“超过阈值”的右尾概率。
先判断要查哪一侧的概率
我在把统计规则写成程序时,最容易混淆的是“超过阈值”和“低于阈值”。如果随机变量记为 X,CDF(x) 对应的是 P(X≤x);Survival(x) 对应的是 P(X>x)。例如检测分数超过 80 的比例属于右尾,应该让 x=80 传给 Survival。

用 Mu 和 Sigma 构造 Normal
Normal 的 Mu 和 Sigma 描述的是原始观测值的分布。若业务数据的均值是 70、标准差是 8,那么阈值 86 就直接作为 x 传入;不需要先手动把 86 改成 z 分数。只有在你已经拿到标准化后的 z 分数,并且分布本身是标准正态分布时,才使用 Mu: 0、Sigma: 1。
package main
import (
"fmt"
"gonum.org/v1/gonum/stat/distuv"
)
func main() {
// 用业务数据的均值和标准差描述原始正态分布。
dist := distuv.Normal{Mu: 70, Sigma: 8}
threshold := 86.0
// Survival 返回超过阈值的右尾概率。
rightTail := dist.Survival(threshold)
// CDF 返回不超过阈值的累计概率,和右尾互为补集。
leftTail := dist.CDF(threshold)
fmt.Printf("P(X>%.0f)=%.6f\n", threshold, rightTail)
fmt.Printf("P(X
这段写法的重点不是把输出保留到多少位,而是让变量名和概率方向一致。实际项目中可以根据报表要求再做百分比格式化,但不要把小数直接当成百分数展示。

单侧、左侧和双侧尾部怎么写
右尾是 dist.Survival(x),左尾是 dist.CDF(x)。双侧检验不能只看一边:先计算阈值距离均值的标准化距离,再把对称的两端概率相加。对于均值为 70、标准差为 8 的分布,观测值 86 距离均值两个标准差;如果要表达“离均值至少这么远”的双侧概率,可以计算下侧 70-16 和上侧 70+16 两个阈值的概率。
// 双侧尾部只对称适用;阈值必须按同一个 Mu 和 Sigma 换算回原始尺度。
lower := dist.Mu - 2*dist.Sigma
upper := dist.Mu + 2*dist.Sigma
// 两端概率分别取左尾和右尾,再合并为双侧概率。
twoTail := dist.CDF(lower) + dist.Survival(upper)
fmt.Printf("P(|X-Mu|>=2*Sigma)=%.6f\n", twoTail)
如果你的业务阈值不是围绕 Mu 对称,不能套用上面的双侧公式;那时应明确两个实际阈值,分别计算两端事件。更极端的 x 也不意味着一定报错,应该把概率解释为接近 0 或 1 的数值,并在业务层决定展示精度。
容易出错的边界
第一,Sigma 是标准差,必须为正;把方差直接填入会改变分布形状。第二,Prob(x) 是概率密度,不是“小于 x 的概率”,累计概率应使用 CDF。第三,Survival(x) 的语义是互补 CDF,写告警规则时要把“超过阈值”的自然语言和代码保持一致。第四,不要把静态说明图当成真实输出,数值结果仍应由你的输入数据、精度和业务定义决定。
常见问题
正态分布右尾概率应该调用哪个方法?
调用 distuv.Normal 的 Survival(x),它直接表达 P(X>x)。只有需要左侧累计概率时才调用 CDF(x)。
已经有 z 分数还要重新设置均值吗?
如果 z 分数对应标准正态分布,可以使用 Mu: 0、Sigma: 1。如果手里的值还是原始业务量,就应使用原始分布的均值和标准差。
为什么不统一写成 1 减 CDF?
数学上右尾是互补概率,但库提供的 Survival 更直接,也能避免把概率方向写反;文章和代码都更容易复查。
-
860 收藏
-
843 收藏
-
826 收藏
-
809 收藏
-
792 收藏
-
Golang · Go教程 | 17分钟前 | JSON · 错误处理 · 数据校验 · Go教程 · Go 嵌套错误 JSONSchema JSON Schema ValidationError 校验错误 JSON Pointer357 收藏
-
258 收藏
-
497 收藏
-
149 收藏
-
251 收藏
-
493 收藏
-
357 收藏
-
288 收藏
-
368 收藏
-
388 收藏
-
327 收藏
-
235 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习