【问题标题】:MATLAB-How can I randomly select smaller values with higher probabilities?MATLAB-如何随机选择具有更高概率的较小值?
【发布时间】:2018-03-01 01:49:55
【问题描述】:

我有一个列向量“距离”,我想从这个向量中随机选择一个值,这样较小的值就有更高的被选中概率。到目前为止,我正在使用以下内容,其中“possible_cells”是随机选择的值:

w=(fliplr(1:numel(distances)))/100
possible_cells=randsample((sort(distances)),1,true,w)

基本上,我翻转了距离向量以创建选择概率“w”(如果我正确理解 randsample),因此最小值的被选中概率等于最大值。为了检查它的效果如何,我随机绘制了 50 个值,并通过使用直方图,我看到这些值比我预期的要高。有没有人知道如何做我上面描述的事情? 0 条评论

【问题讨论】:

    标签: matlab random


    【解决方案1】:

    这样的事情怎么样?

    让我们从长度不超过 20 的 10 个样本距离开始,以进行演示:

    d = randi(20,10,1);
    

    接下来,由于我们希望更小的值更有可能,让我们取这些距离的倒数:

    d_rec = 1./d;
    

    现在,让我们进行归一化,这样我们就可以创建一个分布来选择我们的距离:

    d_rec_norm = d_rec ./ sum(d_rec);
    

    这个新变量反映了选择每个给定距离的概率。现在来个小技巧……我们像这样选择距离:

    d_i = find(rand < cumsum(d_rec_norm),1);
    

    这将为我们提供我们选择的距离的索引。这背后的逻辑是,当对与每个距离(d_rec_norm)相关的归一化值进行累积求和时,我们会创建“箱”,其宽度与选择每个距离的可能性成正比。剩下的就是选择一个介于 0 和 1 之间的随机数 (rand) 并查看它属于哪个“bin”。

    我是这里的新发帖者,所以如果不清楚,请告诉我,我可以尝试改进我的解释。

    【讨论】:

    • 嗨@Larry522,在我得到d_i 之后,我对如何进行以及最后随机数的目的是什么感到有些困惑。 "distanced(d_i)" 给我一个与所选索引对应的值,随机数是怎么进来的?
    • 变量d_i 将是所选距离的索引。选择的实际距离为d(d_i)
    • 一个具体的数字示例可能有助于解释这是如何工作的......假设您的距离向量是d=[5 10]。然后,d_rec_norm=[0.6667 0.3333],它给出了我们想要选择每个距离的概率。 cumsum(d_rec_norm)=[0.6667 1.0000],它创建了“垃圾箱”。然后,rand 产生一个介于 0 和 1 之间的随机数。随机数有 66% 的机会介于 0 和 0.6667 之间,有 33% 的机会介于 0.6667 和 1 之间。d_i 的最后一位代码将找到我们的随机数落入哪个“bin”。这有帮助吗?
    • 我明白了。在我的特殊情况下,“d_rec_norm”有超过 1000 个非常小的数字(.01、.02 等),而“d_rec_norm”是一个零向量。你知道为什么会这样吗?
    • 原来“d_rec”的总和是 Inf。不知道为什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 2011-10-20
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    • 2021-04-27
    • 2012-12-04
    相关资源
    最近更新 更多