[英]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.