我有一個輸入二維直方圖,我想用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點是正確的,但我希望有一種方法可以在幾個點上仍然有效。
非常感謝 - 它和我提出的方法一樣,只是更優雅,可能更高效。 儘管我最初提出的方法存在的問題是直方圖表示概率密度函數,因此如果我從列表中隨機抽取位置信息,則需要保留一般形狀。在上述方法中,我們很可能會從具有較高PDF的二進制文件中獲取很少的數據,因爲我們要獲取大部分數據。 – user1153070
對於趨於無窮的數據集,該方法應將每個直方圖分成兩半,並將每一半存儲在兩個不同的直方圖中。雖然我認爲直接將直方圖減半可能並不準確。 – user1153070
@ user1153070我想你應該指定你想要的。如果拆分方法(減半)基於批准的紙張/書本,那麼您就是對的,並按照您的要求做。不過,我回答了你的問題,你想要一個有效的方法來隨機分裂數組。 – rahnema1