2017-03-22 118 views
1

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

所以對於一個列表我這樣做:

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點是正確的,但我希望有一種方法可以在幾個點上仍然有效。

回答

0

您可以使用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; 
+0

非常感謝 - 它和我提出的方法一樣,只是更優雅,可能更高效。 儘管我最初提出的方法存在的問題是直方圖表示概率密度函數,因此如果我從列表中隨機抽取位置信息,則需要保留一般形狀。在上述方法中,我們很可能會從具有較高PDF的二進制文件中獲取很少的數據,因爲我們要獲取大部分數據。 – user1153070

+0

對於趨於無窮的數據集,該方法應將每個直方圖分成兩半,並將每一半存儲在兩個不同的直方圖中。雖然我認爲直接將直方圖減半可能並不準確。 – user1153070

+0

@ user1153070我想你應該指定你想要的。如果拆分方法(減半)基於批准的紙張/書本,那麼您就是對的,並按照您的要求做。不過,我回答了你的問題,你想要一個有效的方法來隨機分裂數組。 – rahnema1

0

假設H是你的二維直方圖。下面的代碼提取一個概率與該索引的計數成正比的隨機索引 - 我認爲這是你想要的。

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); 

重複用於第二隨機樣本集合。