加权抽样,无需使用gonum进行替换



我有一个很大的项目数组和另一个相同大小的权重数组。我想根据第二个数组的权重从第一个数组中采样而无需替换。有没有办法使用gonum来做到这一点?

Weighted及其相对方法看起来.Take()完全符合您的要求。

从文档中:

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

NewWeighted返回权重wWeighted。如果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])
}

相关内容

  • 没有找到相关文章

最新更新