相关疑难解决方法(0)

random.choice的加权版本

我需要编写random.choice的加权版本(列表中的每个元素都有不同的被选中概率).这就是我想出的:

def weightedChoice(choices):
    """Like random.choice, but each element can have a different chance of
    being selected.

    choices can be any iterable containing iterables with two items each.
    Technically, they can have more than two items, the rest will just be
    ignored.  The first item is the thing being chosen, the second item is
    its weight.  The weights can be any numeric values, what matters is the
    relative differences between them.
    """
    space = {}
    current = 0
    for choice, weight …
Run Code Online (Sandbox Code Playgroud)

python optimization

209
推荐指数
11
解决办法
14万
查看次数

从元素具有权重的列表中选择k个随机元素

这里精美地描述没有任何权重(相等概率)的选择.

我想知道是否有办法将这种方法转换为加权方法.

我也对其他方法感兴趣.

更新:无需更换的采样

random algorithm math statistics probability

69
推荐指数
3
解决办法
3万
查看次数

从阵列加权随机选择

我想从数组中随机选择一个元素,但每个元素都有一个已知的选择概率.

所有机会在一起(在阵列中)总和为1.

您认为哪种算法最快,最适合大型计算?

例:

id => chance
array[
    0 => 0.8
    1 => 0.2
]
Run Code Online (Sandbox Code Playgroud)

对于这个伪代码,所讨论的算法应该在多个调用上统计地返回id上0的一个元素的id 上的四个元素1.

arrays random algorithm

69
推荐指数
7
解决办法
4万
查看次数

加速采样更快,无需更换

这个问题导致了一个新的R包: wrswoR

没有替换使用的R的默认采样sample.int似乎需要二次运行时间,例如,当使用从均匀分布中提取的权重时.这对于大样本量来说很慢.有人知道从R中可以使用的更快的实现吗?两个选项是"替换拒绝采样"(参见stats.sx上的这个问题)和Wong和Easton(1980)的算法(在StackOverflow答案中使用Python实现).

感谢Ben Bolker暗示C函数,该函数在被调用时sample.int具有内部调用replace=F和非均匀权重:ProbSampleNoReplace.实际上,代码显示了两个嵌套for循环(第420行random.c).

以下是根据经验分析运行时间的代码:

library(plyr)

sample.int.test <- function(n, p) {
    sample.int(2 * n, n, replace=F, prob=p); NULL }

times <- ldply(
  1:7,
  function(i) {
    n <- 1024 * (2 ** i)
    p <- runif(2 * n)
    data.frame(
      n=n,
      user=system.time(sample.int.test(n, p), gcFirst=T)['user.self'])
  },
  .progress='text'
)

times

library(ggplot2)
ggplot(times, aes(x=n, y=user/n)) + geom_point() + scale_x_log10() +
  ylab('Time per unit (s)') …
Run Code Online (Sandbox Code Playgroud)

algorithm performance r

48
推荐指数
2
解决办法
5619
查看次数

给定每个变量概率的列表变量

我一直在尝试编写一个在中间使用softmax激活功能的程序.

现在,我有一个这样的概率列表:

P[0.10,0.25,0.60,0.05]
Run Code Online (Sandbox Code Playgroud)

P中所有变量的总和始终为1.

考虑到附加概率,我想要一种方法来选择列表的索引.或者,换句话说,返回的函数

0 - 10% of the time
1 - 25% of the time
2 - 60% of the time
3 - 5% of the time
Run Code Online (Sandbox Code Playgroud)

我完全不知道从哪里开始.任何帮助,将不胜感激.:)

python probability

29
推荐指数
4
解决办法
3万
查看次数

如何生成与直方图匹配的点?

我正在研究一个模拟系统.我将很快获得实验数据(直方图),用于几个模拟输入的实际值分布.

当模拟运行时,我希望能够生成与测量分布匹配的随机值.我宁愿这样做而不存储原始直方图.有什么好方法

  1. 将直方图映射到表示分布的一组参数?
  2. 在运行时生成基于这些参数的值?

编辑:输入数据是几种不同类型事件的事件持续时间.我希望不同的类型具有不同的分布函数.

c algorithm probability histogram numerical-analysis

11
推荐指数
1
解决办法
2330
查看次数

高效的算法随机选择频率项目

给定一组n字频对:

[ (w0, f0), (w1, f1), ..., (wn-1, fn-1) ]

在哪里是一个单词,是整数频率,以及频率的总和,wifi∑fi = m

我想使用伪随机数生成器(pRNG)来选择p单词,以便选择任何单词的概率与其频率成正比:wj0, wj1, ..., wjp-1

P(wi = wjk) = P(i = jk) = fi / m

(注意,这是替换选择,因此每次可以选择相同的单词).

到目前为止,我已经提出了三种算法:

  1. 创建一个大小数组m,并填充它以便第一个条目,下一个条目,等等,所以最后的条目是.f0w0f1w …

random algorithm big-o

10
推荐指数
2
解决办法
1914
查看次数

根据概率从python列表中选择元素

我正在创建一个python脚本,从这里的男性名字列表中随机选择1000个名字:http://www.census.gov/genealogy/www/data/1990surnames/names_files.html

这样做很好,花花公子,但我希望它能根据人口普查文本文件(第二栏)提供的概率列选择名称.

在过去的几个小时里,我一直试图围绕这一点,但我没有取得任何实际进展,甚至寻找其他答案.

任何人都可以帮助我或指出我正确的方向吗?提前致谢 :)

python

6
推荐指数
1
解决办法
1854
查看次数

Python随机列表理解

我有一个类似于的列表:

[1 2 1 4 5 2 3 2 4 5 3 1 4 2] 
Run Code Online (Sandbox Code Playgroud)

我想从此列表中创建一个x随机元素列表,其中所选元素都不相同.困难的部分是我想通过使用列表理解来做到这一点......如果x = 3,那么可能的结果是:

[1 2 3]
[2 4 5]
[3 1 4]
[4 5 1]
Run Code Online (Sandbox Code Playgroud)

等等...

谢谢!

我应该指定我不能将列表转换为集合.抱歉! 我需要随机选择的数字进行加权.因此,如果1在列表中出现4次,3在列表中出现2次,那么1是被选中的两倍......

python

5
推荐指数
2
解决办法
6961
查看次数

如何以一定比例随机选择

我想在两个选择之间随机选择*概率不等.

例如,当用户按下按钮时,25%的时间会发出声音A,75%的时间发出声音B.我可以手动执行简单的比例,如1:4和2:4但我遇到了麻烦比例如3:5.

考虑这个问题的一般方法是什么?

*我的意思是一个一个地看着不可预测.我注意到任何带有随机字样的问题都会得到一个Mensa的学生.

random algorithm probability

3
推荐指数
1
解决办法
965
查看次数

使用Walker的Alias方法进行加权随机选择


我正在寻找这种算法
(算法将从一个元素列表中随机选择,其中每个元素具有不同的被挑选概率(权重))
并且只发现python和c实现,在我做了C#之后,有点不同(但是我觉得更简单)我想我应该分享它,我也需要一个F#imlementation,如果有人可以做到它请发表答案

using System;
using System.Collections.Generic;
using System.Linq;

namespace ChuckNorris
{
    class Program
    {
        static void Main(string[] args)
        {
            var oo = new Dictionary<string, int>
                         {
                             {"A",7},
                             {"B",1},
                             {"C",9},
                             {"D",8},
                             {"E",11},
                         };

            var rnd = new Random();
            var pick = rnd.Next(oo.Values.Sum());

            var sum = 0;
            var res = "";

            foreach (var o in oo)
            {
                sum += o.Value;
                if(sum >= pick)
                {
                    res = o.Key;
                    break;
                }
            }

            Console.WriteLine("result is "+  res);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果有人可以在F#中重拍它,请发布您的代码

.net c# f# probability

3
推荐指数
2
解决办法
1546
查看次数

如何从Perl中的数组中获取加权随机选择?

我需要从数组中随机添加一些元素.我是通过随机化索引来做到这一点的$array[int(rand(100))].我希望更频繁地出现一些元素.我该怎么做?

我想到了在阵列中多次重复这些元素的愚蠢解决方案,但我相信你们可以做得更好.

random perl

2
推荐指数
1
解决办法
2595
查看次数