Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 随机选择直方图数据_Matlab_Random_Histogram_Cross Validation - Fatal编程技术网

Matlab 随机选择直方图数据

Matlab 随机选择直方图数据,matlab,random,histogram,cross-validation,Matlab,Random,Histogram,Cross Validation,我有一个输入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);

我有一个输入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)中

如果这是等效的,有没有更好的方法/内置方法

我的实际柱状图是300x300个箱子,包含大约6000000个数据点,它需要快速

谢谢你的帮助:)

编辑: 我所建议的代码位并不等同于从列表中随机抽取位置点样本,因为它不维护数据的总体概率密度函数。
将柱状图减半对于我的6000000点来说应该很好,但我希望有一种方法仍然适用于少数几点。

您可以使用
rand
randi
生成两个柱状图。第一种方法更有效,而第二种方法更随机

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;

您可以使用
rand
randi
生成两个直方图。第一种方法更有效,而第二种方法更随机

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);
要提取多个样本,您需要编写自己的find函数(为了提高效率,最好是二进制搜索),在一次调用中提取n个样本。这将为您提供一个指数向量(称为ix_vec),其选择概率与每个指数的直方图计数成比例

如果我们用X表示直方图中每个位置对应的数值,则随机样本为:

R1 = X(ix_vec);

对第二个随机样本集重复上述操作。

假设H是2D直方图。下面的代码提取一个随机索引,其概率与该索引处的计数成比例-我认为这就是您想要的

cc = cumsum(H(:));
if cc(1) ~= 0
    cc = [0; cc];
end
m = cc(end);
ix = find(cc > m*rand, 1);
要提取多个样本,您需要编写自己的find函数(为了提高效率,最好是二进制搜索),在一次调用中提取n个样本。这将为您提供一个指数向量(称为ix_vec),其选择概率与每个指数的直方图计数成比例

如果我们用X表示直方图中每个位置对应的数值,则随机样本为:

R1 = X(ix_vec);

对第二个随机样本集重复上述操作。

谢谢你,它与我建议的方法相同,只是更优雅,可能更有效。不过,我最初提出的方法的问题是,直方图表示一个概率密度函数,因此,一般形状需要保持不变,就像我从列表中随机抽取位置信息样本一样。在上面的方法中,我们很可能会从一个具有高PDF的容器中获得很少的数据,因为我们将获得大部分数据。对于一个趋于无穷大的数据集,该方法应该将每个直方图一分为二,并将每一半存储在两个不同的直方图中。虽然我认为直接将直方图减半可能不太准确。@user1153070我认为您应该指定所需内容。如果拆分方法(对半)是基于批准的纸张/书籍,那么您是对的,可以随心所欲。不过,我回答了你的问题,你想要一种有效的方法来随机分割数组。谢谢你,它与我建议的方法一样,只是更加优雅而且可能更有效。不过,我最初提出的方法的问题是,直方图表示一个概率密度函数,因此,一般形状需要保持不变,就像我从列表中随机抽取位置信息样本一样。在上面的方法中,我们很可能会从一个具有高PDF的容器中获得很少的数据,因为我们将获得大部分数据。对于一个趋于无穷大的数据集,该方法应该将每个直方图一分为二,并将每一半存储在两个不同的直方图中。虽然我认为直接将直方图减半可能不太准确。@user1153070我认为您应该指定所需内容。如果拆分方法(对半)是基于批准的纸张/书籍,那么您是对的,可以随心所欲。但是,我回答了您的问题,您需要一种有效的方法来随机拆分数组。