繁体   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