簡體   English   中英

使用gonum無需更換的加權采樣

[英]Weighted sampling without replacement using gonum

我有一大堆物品和另一個相同大小的重量數組。 我想根據第二個數組的權重從第一個數組中取代而不進行替換。 有沒有辦法用gonum做到這gonum

Weighted及其相對方法.Take()看起來與你想要的完全一樣。

來自doc:

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

NewWeighted為權重w返回Weighted 如果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])
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM