【问题标题】:Matlab - binary vector with high concentration of 1s (or 0s)Matlab - 高浓度 1(或 0)的二进制向量
【发布时间】:2011-02-02 17:00:37
【问题描述】:

生成数量为 X、大小为 N、浓度为 1(或类似地为 0)且范围从非常低到非常高的随机二进制向量的最佳方法是什么?

使用 randint 或 unidrnd(如this question)将生成具有均匀分布的二进制向量,这不是我在这种情况下所需要的。

任何帮助表示赞赏!

【问题讨论】:

  • 当您说浓度范围“从非常低到非常高”时,您是什么意思?这是否意味着您计算的每个向量都比最后一个向量具有更多的 1(或 0),或者 1(或 0)的浓度从向量的一端到另一端变得更大?
  • 我的意思是我需要一些向量具有高浓度的 1,但也需要一些向量具有非常低的 1 浓度 - 从非常高到非常低

标签: matlab random


【解决方案1】:

Laserallan 的方法是要走的路。

对于一个有 10 个元素和 70% 的元素是随机分布的向量,你可以这样写

randVec = rand(10,1)<0.7;

编辑如果你想要长度为 N 的 X 个向量,并且数量越来越多,你可以写

thresVec = linspace(0,1,X);  %# thresholds go from 0 (all 0) to 1 (all 1)  
randVec = bsxfun(@lt,rand(N,X),threshVec); %# vectors are per column

请注意,randVec 是一个逻辑数组。根据你想用它做什么,你可能想像这样将它转换成双倍

randVec = double(randVec);

【讨论】:

  • 1s 数量增加的解决方案会很好 Jonas - tnx 提供帮助!
【解决方案2】:

使用

rand(N,1)<p   %# 0 < p < 1

会给你一个 Nx1 向量,其中 平均 N*p 个(其他地方为零) - 但在某些运行中,你可能会得到一个与你预期不同的向量(例如,它可能全为零......可能是非常低的机会,但仍然是非零机会)。

如果你想要完全 A 1 和 B 0,你可以这样做:

rand_vec = [ones(A, 1); zeros(B, 1)];
rand_vec = rand_vec(randperm(A+B));

然后你可以设置A和B来匹配你的需要。

编辑:
现在我更好地理解了你的问题: 假设您有一个向量 p,其中包含人口中 1 的所需比例,N 是每个向量中的元素数。

rand_mat = rand(N, size(p,2)) < repmat(p', [1,N])';

会给你一个 Nx(size(p,2)) 矩阵,其中第 i 列是一个向量,其中有 p(i) 个(平均如上文所述),其余为零。

【讨论】:

    【解决方案3】:

    我不是 matlab 专家,但一种应该很容易实现的方法是生成浮点随机数的向量(最好在 1 到 0 的范围内),然后将高于某个阈值的值设置为 1 和低于0。 假设您想要 30% 的值,将所有高于 0.7 的值设置为 1,将低于 0 的值设置为 0。

    【讨论】:

    • 问题是我希望高/低密度的分布在整个人群中也是随机的
    • 如果您可以将上下限的分布表示为 x 的函数,其中 x 是向量中特定元素的索引,您可以将其用作选择是否在位置的值的阈值x 应该是 1 或 0。
    【解决方案4】:

    您可以对均匀分布的二进制向量使用位或运算,但我怀疑您最终得到的确切分布会有点复杂。

    【讨论】:

    • 听起来像是一个很好的预感 - 我会在相邻位之间随机运行 OR 操作吗?如果我得到大量的高密度规则(对于 1 和 0),我很高兴,有点与 OR 我想我会在均匀分布上得到大部分 1。我可以在 1/3 的人口上运行 OR,在另外三分之一上运行 AND,其余的都可以吗? :)
    • 我在考虑对两个独立的均匀分布进行位或运算,例如,创建一个具有 75% 1s 的数字,(然后您可以使用第三个独立均匀分布得到 62.5% 1s,例如例子)。您应该能够使用一种二进制搜索方法合理地直接生成任何密度。如果原始值不是真正均匀分布,尽管此方法可能非常不稳定。