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

Go Gonum stat 怎样计算带权重的均值和方差

来源:17golang原创

时间:2026-10-30 20:55:49 368浏览 收藏

Go Gonum stat 可用 stat.Mean(x, weights) 计算带权均值,用 stat.MeanVariance 同时取得均值与样本方差;需要总体方差时用 stat.PopMeanVariance 或 stat.PopVariance。真正需要先决定的是权重含义:频数、概率比例和可靠性权重不能默认使用同一套方差修正。

项目官方地址:https://github.com/gonum/gonum

先确定权重代表频数还是比例

我会先在数据字段旁写清“这一列是次数还是比例”,再选函数。例如某个观测值出现两次,频数为2;把三个分组的重要程度写成20%、30%、50%,则是另一种权重含义。它们都能参与加权平均,但样本方差的分母不能靠字段名猜测。

本文的完整程序只处理非负整数频数。这样,x 中的一项与 counts 中同下标的一项构成“数值及其重复次数”,无需把相同数据重复存储。可靠性加权、复杂抽样设计以及其他无偏修正不包含在该程序的约定里。

数值切片与频数切片的静态对应关系
静态结构图:输入分组中的x与counts按下标对应,接口分组展示均值和方差函数的依赖关系,不代表执行流程。

确认接口支持与分母口径

令总权重为W,均值为m,加权离差平方和为S。加权均值是加权数值总和除以W;Gonum的 MeanVariance 使用 S/(W-1),PopMeanVariance 使用 S/W。在本文的频数场景,前者对应展开重复观测后的样本方差,后者描述这组数据自身的总体方差。

接口返回内容选择场景
Mean加权均值只需要中心位置
MeanVariance均值与样本方差频数样本,总频数大于1
PopMeanVariance均值与总体方差描述当前数据的加权离散程度
Variance / PopVariance对应口径的方差只需要方差

这里是Go包接口,不涉及浏览器兼容表。接入项目时固定Gonum模块版本,并使用该版本文档确认接口;不要把仓库主分支等同于已部署版本。

编写最小完整示例

下面的入口代码可放进已经配置Gonum依赖的Go模块。输入限制是本文自己的业务封装,目的是把频数数据的问题尽早转成error;不声称库会替调用方检查所有业务条件。

package main

import (
    "fmt"
    "math"
    "gonum.org/v1/gonum/stat"
)

// frequencyStats专用于非负整数频数;不替代调查权重的统计设计。
func frequencyStats(x, counts []float64) (mean, sample, population float64, err error) {
    if len(x) == 0 || len(x) != len(counts) {
        return 0, 0, 0, fmt.Errorf("数据不能为空且必须与频数等长")
    }
    total := 0.0
    for i, value := range x {
        count := counts[i]
        // 在业务入口拒绝非法数值,避免把NaN当作统计结果保存。
        if math.IsNaN(value) || math.IsInf(value, 0) ||
            math.IsNaN(count) || math.IsInf(count, 0) ||
            count 

示例数据等价于四个观测值:4、10、10、16。按算术推导,均值为10,离差平方和为72,所以样本方差为24,总体方差为18。这里给的是预期数值说明,本文没有执行程序或生成运行截图。

如果只需要均值和一种方差,保留相应的组合接口即可;例子额外计算总体方差,是为了让两种统计口径能够直接对照,并非要求每个业务都计算两遍。

加权离差平方和与两种方差分母的静态组成图
静态结构图:样本口径与总体口径共享S和W的定义,但分母分别为W-1和W;图中没有性能数据或运行输出。

兼容普通等权数据与异常输入

原始样本每行只出现一次时,可以直接传 nil 作为权重,库按每项权重1处理。非nil权重必须与数据切片等长;空切片和nil不是可互换的业务输入。如果把数据排序或筛选,权重也必须跟着同一条记录移动,不能只操作x。

本文封装拒绝空数据、负频数、非整数频数以及非有限数值,并要求总频数大于1。零频数允许存在,但所有频数为零不能计算均值。只有一个有效观测时,可以有总体方差口径,却不能套用本例同时返回样本方差的入口,应由业务单独设计只求总体统计的函数。

库函数通常直接返回浮点结果,并不提供与本文封装相同的error接口。因此在业务层决定哪些输入可接受,比在计算后把所有异常结果替换成0更容易保留真实含义。0方差本来就可能是合法结果,不应同时代表“没有数据”。

处理数值范围和常见疑问

我不建议先把频数归一化到总和1,再直接交给样本方差接口。归一化保持了加权均值和总体方差,却改变了 W-1 这个分母。总权重为1时分母为零,已经失去本文频数样本的统计解释。

大量重复观测可以用频数表示来减少输入条目,但不要据此承诺具体加速倍数。浮点数也有精度和范围限制:非常大的次数无法保证整数精确表示,极大数值的乘积或平方可能溢出。遇到这类数据应先决定合适的数值尺度、计数存储和误差容忍度;有限结果检查也不等于精度保证。

权重必须加起来等于1吗?

计算加权均值不需要。频数应保留次数含义;概率分布的离散程度可选择总体口径,但不要把概率权重当作重复样本数。

把所有频数乘二,为什么样本方差变了?

在频数解释下,这相当于重复了整批观测,总样本量发生变化,样本修正也改变。均值和总体方差保持不变并不要求样本方差也保持不变。

只保存均值够不够以后计算总方差?

通常不够。分组均值会丢失组内离散信息。合并统计需要保留总频数和相应离差统计量,不能把组均值当作原始观测直接套用本例。

技术依据:Gonum stat官方接口文档、官方均值与方差实现。

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