簡體   English   中英

隨機選擇直方圖數據MATLAB

[英]randomly select histogram data MATLAB

我有一個輸入2D直方圖,我想用2倍交叉驗證。 問題是我不知道如何從直方圖中提取數據的兩個互斥的隨機樣本。 如果它是每個數據點的位置信息的幾個列表,那將很容易 - 以相同的方式對列表中的數據進行洗牌,並平均分割列表。

所以對於列表我會這樣做:

list1 = [1,2,3,3,5,6,1];
list2 = [1,3,6,6,5,2,1];

idx = randperm(length(list1)); % ie. idx = [4 3 1 5 6 2 7]
shlist1 = list1(idx); % shlist1 = [3,3,1,5,6,2,1]
shlist2 = list2(idx); % shlist2 = [6,6,1,5,2,3,1]

slist1 = shlist1(1:3); % slist1 = [3,3,1]
elist1 = shlist1(4:6); % elist1 = [5,6,2,1]
slist2 = shlist2(1:3); % slist2 = [6,6,1]
elist2 = shlist2(4:6); % elist2 = [5,2,3,1]

但如果將這些相同的數據作為直方圖呈現給我

hist = [2 0 0 0 0 0]
       [0 0 0 0 0 1]
       [0 1 0 0 0 0]
       [0 0 0 0 0 0]
       [0 0 0 0 1 0]
       [0 0 2 0 0 0]

我希望結果是這樣的

hist1 = [0 0 0 0 0 0]
        [0 0 0 0 0 1]
        [0 1 0 0 0 0]
        [0 0 0 0 0 0]
        [0 0 0 0 0 0]
        [0 0 1 0 0 0]

hist2 = [2 0 0 0 0 0]
        [0 0 0 0 0 0]
        [0 0 0 0 0 0]
        [0 0 0 0 0 0]
        [0 0 0 0 1 0]
        [0 0 1 0 0 0]

這樣,數據的不同部分是隨機的,並且均等地分配給兩個新的直方圖。

這相當於取每個bin hist(i,j)的隨機整數高度,並將其添加到hist1(i,j)中的等效bin,以及與hist2(i,j)的差異?

% hist as shown above
hist1 = zeros(6);
hist2 = zeros(6);
for i = 1:length(hist(:,1))*length(hist(1,:))
    randNum = rand;
    hist1(i) = round(hist(i)*randNum);
    hist2(i) = hist(i) - hist1(i);
end

如果這是相同的,有沒有更好的方法/內置的方式呢?

我的實際直方圖是300x300箱,包含大約6,000,000個數據點,需要快速。

謝謝你的幫助 :)

編輯:我建議的代碼位不等於從列表中隨機抽取位置點,因為它不保持數據的整體概率密度函數。 對於我的6,000,000點,將直方圖減半應該沒問題,但是我希望有一種方法可以用於幾點。

您可以使用randrandi生成兩個直方圖。 第一種方法更有效,但第二種方法更隨機。

h    = [[2 0 0 0 0 0]
       [0 0 0 0 0 1]
       [0 1 0 0 0 0]
       [0 0 0 0 0 0]
       [0 0 0 0 1 0]
       [0 0 2 0 0 0]];

%using rand    
h1 = round(rand(size(h)).*h);
h2 = h - h1;

%using randi
h1 = zeros(size(h));
for k = 1:numel(h)
    h1(k) = randi([0 h(k)]);
end
h2 = h - h1;

假設H是您的2D直方圖。 以下代碼提取單個隨機索引,其概率與該索引處的計數成比例 - 我認為這是您想要的。

cc = cumsum(H(:));
if cc(1) ~= 0
    cc = [0; cc];
end
m = cc(end);
ix = find(cc > m*rand, 1);

要提取多個樣本,您需要編寫自己的查找函數(最好是效率的二進制搜索),在一次調用中提取n個樣本。 這將為您提供一個索引向量(稱為ix_vec),其選擇概率與每個索引處的直方圖計數成比例。

然后,如果我們用X表示直方圖中每個位置對應的數值,那么隨機樣本是:

R1 = X(ix_vec);

重復第二個隨機樣本集。

暫無
暫無

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

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