登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  Golang >  Go问答

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 与最大化 ℓ 的参数排序一致;最小化优化器则通常接收负对数似然 -ℓ。

固定参数与独立样本的对数似然结构
静态结构图:模型分组包含固定参数与独立性假设,评分分组关联样本、LogProb 及对数和;连线表示数学依赖,不表示执行步骤。

对 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 或无穷吗?不能。非法参数、极端值、支持域以外数据和累加范围都需要处理。某些分布返回负无穷可合理表示零概率;本文的正态示例选择将非有限结果报告为错误,并不要求所有模型一律采用这个策略。

直接计算对数评分、固定建模约定、按候选参数汇总批次,能让大样本似然比较保留可解释的数值;独立性、单位和数据口径仍需由应用明确管理。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>