我有一大堆物品和另一组相同大小的权重。我想根据第二个数组的权重从第一个数组中采样而不替换。有没有办法使用 gonum 做到这一点?

最佳答案

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

从文档:



因此 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])
}

关于go - 使用 gonum 进行无替换加权采样,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50866502/

10-11 07:44