簡體   English   中英

如何從概率條形圖生成隨機向量?

[英]How do I generate random vectors from a bar graph of probabilities?

我生成了一個條形圖,它計算16位二進制字符串的每一位中的1的數量:

在此輸入圖像描述

我想生成300個16位的二進制向量,大致遵循上述分布。

最初,我的代碼依賴於概率數組gengen ,它計算每個位中出現1的次數。 我生成了一個300x16值的隨機矩陣,將每個值的值與概率進行比較,並將其分配給1和0.這類似於加權硬幣方法。

但是,我收到的分發幾乎是統一的。

gengen = [30, 28, 30, 30, 30, 26, 28, 28, 29, 23, 17, 8, 10, 12, 7, 6]

len = 16; % string length

% probability for 1 in each bit
prob_gengen = gengen./30;
% generate 100 random strings 
moreStrings = rand(300,len);
samplemore = []
for i = 1:300
  for k = 1:16
    disp(i)
    disp(k)
    if (prob_gengen(k) > moreStrings(i,k))
        samplemore(i,k) = 1;
    else
        samplemore(i,k) = 0;
    end
  end
end
G = reshape(samplemore,[16,300])

此代碼繪制了最終分布:

colormap('default')
subplot(3,1,1)
bar(sum(G,2)); % summing along rows using DIM = 2
xlabel('Frequency Bin ');
title('Generator (16b) Generated');

在此輸入圖像描述

如何獲得類似於第一個條形圖的分布? 代碼本身在MATLAB中,但我認為Python實現也可以工作。

我相信錯誤的主要來源是你為獲得G做的重塑步驟。 如果要將數據從300 x 16矩陣重新組織為16 x 3矩陣,則應轉置 使用reshape分解舊的300個元素列,並將它們分散到新的16個元素列中。

但是,您可以使用bsxfun執行所有這些操作而不使用bsxfun

gengen = [30, 28, 30, 30, 30, 26, 28, 28, 29, 23, 17, 8, 10, 12, 7, 6];
len = 16;
prob_gengen = gengen./30;
binvecs = bsxfun(@le, rand(300, len), prob_gengen);
bar(sum(binvecs, 1));

這是條形圖,看起來很像你上面的第一個條形圖:

在此輸入圖像描述

這個怎么運作...

首先,使用rand在0和1之間創建一個300乘16的均勻生成的隨機值集。 接下來,您將要檢查每列中的隨機值與prob_gengen向量中的概率。 例如, 16列具有0.2的概率,這意味着(平均)要在該列中的值的五分之一為1個五分之四為零。 您可以通過檢查隨機生成的值是否小於或等於此概率閾值來執行此操作。 使用bsxfun根據需要擴展矢量prob_gengen以對所有行進行比較。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM