Go Gonum 的 LogProb 为什么适合累加独立样本似然
来源:17golang原创
时间:2026-10-30 22:40:04 485浏览 收藏
Gonum 的 LogProb 适合累加独立样本似然,因为独立样本的联合似然是各样本概率或密度的乘积,取自然对数后就变成逐项求和。这样可以避开大量小值连乘造成的下溢,并直接在对数尺度比较候选参数。应调用分布的 LogProb,而不是先 Prob 再 math.Log:后者可能在取对数前已经变成零。
官方地址:https://www.gonum.org/
解释规模增加后的连乘瓶颈
考虑一项离线评分任务:同一组观测值需要在多组候选参数下计算似然。样本较少时直接相乘看似方便,但样本增多后,每项都不为零也不能保证乘积仍可由 float64 表示。若两个候选都算成零,比较结果就失去了意义。
以每项数值为 0.01 的纯数学例子来看,1000 项的乘积是 10 的负 2000 次方,远小于 float64 的最小正数。对数和则约为 -4605.17。这个数字是公式推导,并非本文执行程序后的性能结果。改用对数求和首先解决的是表示范围,不是保证处理时间更短。
建立对数似然与独立性约定
固定候选参数 θ 后,如果各观测条件独立,则 L(θ)=∏f(xᵢ|θ),对数似然 ℓ(θ)=Σlog f(xᵢ|θ)。自然对数严格递增,所以在同一数据集上最大化 L 与最大化 ℓ 的参数排序一致;最小化优化器则通常接收负对数似然 -ℓ。

对 Normal,LogProb 返回的是概率密度的自然对数,而不是“精确取到这个实数的概率”。密度可以大于一,对数密度也可以为正。不要把 LogProb 一律要求为负数,更不能把它直接当作事件概率展示。接口含义见Normal.LogProb 官方文档。
Normal 的实现直接计算对数密度公式,Prob 则对 LogProb 结果取指数。这也是直接使用 LogProb 能避免一次不必要的指数与对数往返的原因,见Gonum 正态分布实现。
用 Gonum 累加正态样本评分
下面固定标准差为一,对同一组样本比较均值零和均值一。函数拒绝非有限输入,Sigma 使用标准差而非方差;补偿求和用于缓解累计舍入误差。它不是通用分布拟合器,也不会自动检查样本是否独立。
package main
import (
"fmt"
"math"
"gonum.org/v1/gonum/stat/distuv"
)
// NormalLogLikelihood 按固定参数计算一批条件独立样本的对数似然。
// 本例采取严格有限值策略,异常数值直接交给调用者处理。
func NormalLogLikelihood(x []float64, mu, sigma float64) (float64, error) {
finite := func(v float64) bool {
return !math.IsNaN(v) && !math.IsInf(v, 0)
}
if !finite(mu) || !finite(sigma) || sigma
按正态公式手算,均值零时三项平方偏差之和为 0.5;均值一时为 3.5,因此前者的对数似然应比后者高 1.5。这个差值可以帮助读者理解参数排序,本文没有执行示例或提供伪造输出。
空样本返回零,对应空乘积为一的数学约定;业务中“没有观测”应单独标记,不能将零评分当成模型优于其他有样本任务的证据。
将批次结果按统一参数汇总
样本很多时,可以按批次计算局部对数和,再由汇总层相加。每一批都必须使用相同模型版本、参数、单位和样本筛选规则,并记录样本数;重复批次会让数据被重复计分,漏批次会改变比较基准。

若各批分别重新拟合参数,再把各自最优对数和相加,得到的通常不是同一个固定参数模型的全体样本似然。要并行比较多个候选,需把候选参数标识与批次结果一起保存,分别汇总每个候选的数据。
上线后的观察项可以包括有效样本数、异常样本数、非有限评分出现次数、总对数似然及平均负对数似然。改变数据单位、清洗口径或候选模型定义后,应重新确认这些指标的可比性。本文只提供观察设计,不声称已有线上收益。
| 做法 | 含义 | 取舍 |
|---|---|---|
| 直接连乘 Prob | 原尺度联合密度或概率 | 长序列容易下溢或溢出 |
| 累加 LogProb | 对数尺度似然 | 适合比较,仍需数值范围管理 |
| 汇总批次对数和 | 同一模型的数据分块 | 须避免漏批、重复及配置混用 |
| 平均负对数似然 | 每样本平均损失 | 只在适当且一致的口径下比较 |
识别不可直接相加的情况
样本相关时还能直接累加吗?不能无条件使用边缘分布评分之和冒充真实联合似然。应建立联合分布或使用条件概率分解;若采用独立近似,需明确这是一项建模假设。
混合模型是不是把各分量的 LogProb 相加?不是。混合密度是分量密度的加权和,其对数通常需要稳定的 log-sum-exp 计算。样本间的乘积与同一样本的混合求和是不同运算。
为什么不在最后 Exp 回去?若只需比较参数,无须恢复原尺度;取指数可能再次下溢。需要似然比时,可先比较两个对数似然之差,同时仍要考虑指数范围。
LogProb 能保证永不出现 NaN 或无穷吗?不能。非法参数、极端值、支持域以外数据和累加范围都需要处理。某些分布返回负无穷可合理表示零概率;本文的正态示例选择将非有限结果报告为错误,并不要求所有模型一律采用这个策略。
直接计算对数评分、固定建模约定、按候选参数汇总批次,能让大样本似然比较保留可解释的数值;独立性、单位和数据口径仍需由应用明确管理。
-
502 收藏
-
502 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
135 收藏
-
457 收藏
-
493 收藏
-
273 收藏
-
237 收藏
-
386 收藏
-
316 收藏
-
456 收藏
-
105 收藏
-
391 收藏
-
303 收藏
-
419 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习