查看单个帖子
旧 2019-12-10, 20:41   #1
poster
高级会员
 
注册日期: 2019-11-21
帖子: 3,006
声望力: 66
poster 正向着好的方向发展
帖子 MATLAB中的加权随机数

如何从向量a随机选取N个数字,并将权重分配给每个数字?

比方说:

a = 1:3; % possible numbers weight = [0.3 0.1 0.2]; % corresponding weights 在这种情况下,拾取1的概率应该比拾取2高3倍。

所有权重的总和可以是任何值。



回答:

R = randsample([1 2 3], N, true, [0.3 0.1 0.2]) randsample包含在统计工具箱中

否则,您可以使用某种轮盘赌选择过程。看到这个类似的问题 (尽管不是特定于MATLAB的)。这是我的单行实现:

a = 1:3; %# possible numbers w = [0.3 0.1 0.2]; %# corresponding weights N = 10; %# how many numbers to generate R = a( sum( bsxfun(@ge, rand(N,1), cumsum(w./sum(w))), 2) + 1 ) 说明:

考虑间隔[0,1]。我们为列表中的每个元素( 1:3 )分配一个与每个元素的重量成比例的长度子区间;因此, 1 get和长度0.3/(0.3+0.1+0.2)间隔,其他都一样。

现在,如果我们生成一个在[0,1]上具有均匀分布的随机数,则[0,1]中的任何数字都具有相等的被拾取概率,因此子间隔的长度确定了随机数落入每个间隔。

这符合我在上面做的事情:选择一个数字X〜U [0,1](更像N数字),然后以向量化的方式找出它属于哪个间隔。

您可以通过生成足够大的序列N=1000来检查上述两种技术的结果:

>> tabulate( R ) Value Count Percent 1 511 51.10% 2 160 16.00% 3 329 32.90% 或多或少与归一化权重w./sum(w)匹配[0.5 0.16667 0.33333]



更多&回答...
poster 当前离线   回复时引用此帖