douhui9192 2018-06-14 21:58
浏览 51
已采纳

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

I have a big array of items and another array of weights of the same size. I would like to sample without replacement from the first array based on the weights from the second array. Is there a way to do this using gonum?

  • 写回答

1条回答 默认 最新

  • dpndp64206 2018-06-14 22:54
    关注

    Weighted and its relative method .Take() look exactly like what you want.

    From the doc:

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

    NewWeighted returns a Weighted for the weights w. If src is nil, rand.Rand is used as the random source. Note that sampling from weights with a high variance or overall low absolute value sum may result in problems with numerical stability.

    func (s Weighted) Take() (idx int, ok bool)
    

    Take returns an index from the Weighted with probability proportional to the weight of the item. The weight of the item is then set to zero. Take returns false if there are no items remaining.

    Therefore Take is indeed what you need for sampling without replacement.

    You can use NewWeighted to create a Weighted with the given weights, then use Take to extract one index with probability based on the previously set weights, and then select the item at the extracted index from your array of samples.


    Working example:

    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])
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 全志H618ROM新增分区
  • ¥20 jupyter保存图像功能的实现
  • ¥15 在grasshopper里DrawViewportWires更改预览后,禁用电池仍然显示
  • ¥15 NAO机器人的录音程序保存问题
  • ¥15 C#读写EXCEL文件,不同编译
  • ¥15 MapReduce结果输出到HBase,一直连接不上MySQL
  • ¥15 扩散模型sd.webui使用时报错“Nonetype”
  • ¥15 stm32流水灯+呼吸灯+外部中断按键
  • ¥15 将二维数组,按照假设的规定,如0/1/0 == "4",把对应列位置写成一个字符并打印输出该字符
  • ¥15 NX MCD仿真与博途通讯不了啥情况