go - 使用 gonum 无需替换的加权采样
问题描述
我有一大堆物品和另一组相同大小的权重。我想根据第二个数组的权重从第一个数组中进行采样而不进行替换。有没有办法做到这一点gonum
?
解决方案
Weighted
它的相对方法.Take()
看起来和你想要的完全一样。
从文档:
func NewWeighted(w []float64, src *rand.Rand) Weighted
NewWeighted
返回 aWeighted
的权重w
。如果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])
}
推荐阅读
- ios - 拥有一个带有多个 UICollection 视图部分的主要粘性标题?Xcode - 斯威夫特
- firebase - 云函数影响读/写配额
- android - ViewPager 位置无法正常工作
- windows - 如何在输出中获取输入基名?
- jsoup - 维基百科使用 jsoup 抓取纯文本和超链接
- javascript - promise.all 在 firebase 中使用 getDownloadURL()
- mysql - 使用本机反应显示来自 MYSQL 数据库的特定值
- javascript - Bootstrap 4登陆页面添加的右侧图像无法正确放置
- spring-boot - 我们可以使用弹簧重试处理嵌套异常吗?
- android - 在 Tensorflow 中对检测到的对象执行点击事件