[英]Weighted sampling without replacement using gonum
Weighted
及其相对方法.Take()
看起来与你想要的完全一样。
来自doc:
func NewWeighted(w []float64, src *rand.Rand) Weighted
NewWeighted
为权重w
返回Weighted
。 如果src
为nil
,则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.