繁体   English   中英

使用gonum无需更换的加权采样

[英]Weighted sampling without replacement using gonum

我有一大堆物品和另一个相同大小的重量数组。 我想根据第二个数组的权重从第一个数组中取代而不进行替换。 有没有办法用gonum做到这gonum

Weighted及其相对方法.Take()看起来与你想要的完全一样。

来自doc:

 func NewWeighted(w []float64, src *rand.Rand) Weighted 

NewWeighted为权重w返回Weighted 如果srcnil ,则rand.Rand用作随机源。 注意,从具有高方差或总体低绝对值和的权重中采样可能导致数值稳定性的问题。

 func (s Weighted) Take() (idx int, ok bool) 

Take返回从加权的概率成比例的项的权值的索引。 然后将项目的权重设置为零 Take返回false ,如果没有剩余的项目。

因此, Take确实是您无需更换即可获得的样品。

您可以使用NewWeighted创建Weighted给定的权重,然后使用Take提取基于预先设定的权重概率一个指数,然后从你的样品阵列所取出的索引在选择项目。


工作范例:

package main

import (
    "fmt"
    "time"

    "golang.org/x/exp/rand"

    "gonum.org/v1/gonum/stat/sampleuv"
)

func main() {
    samples := []string{"hello", "world", "what's", "going", "on?"}
    weights := []float64{1.0, 0.55, 1.23, 1, 0.002}

    w := sampleuv.NewWeighted(
        weights,
        rand.New(rand.NewSource(uint64(time.Now().UnixNano())))
    )

    i, _ := w.Take()

    fmt.Println(samples[i])
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM