【问题标题】:How to evenly distribute data in a matrix by a column? [closed]如何按列均匀分布矩阵中的数据? [关闭]
【发布时间】:2021-03-23 10:35:48
【问题描述】:

如果我有一个像下面这样的矩阵:

X = [...
 1  2   3; 
 1  4   5; 
 1  6   7; 
 1  8   9; 
 0  10  11; 
 0  12  13; 
 1  14  15]

我想均匀地分布内容,所以我有这样的东西,第一列中的0s 在整个数据集中相当均匀地分布,但行保持在一起:

Y = [...
 1  2   3; 
 1  4   5; 
 0  10  11; 
 1  6   7; 
 1  8   9;  
 0  12  13; 
 1  14  15]

(旁注这是一个虚构的例子,我使用的是更大的数据集)

我的意思是均匀分布,如果我要分解数据集,无论我在哪里划分数据集,我都希望 1 与 0 的比率相同。因此,如果前 5 行数据中有 4 个 1 和 1 个 0,我希望接下来的 10 行数据中有 8 个 1 和 2 个 0。

【问题讨论】:

  • “均匀分布”是什么意思?这是一个非常模糊的描述。这是随机洗牌吗?或者是否有特定的零散布定义?
  • @CrisLuengo,我的意思是均匀分布,如果我要分解数据集,无论我在哪里划分数据集,我都希望 1 与 0 的比率相同。因此,如果前 5 行数据中有 4 个 1 和 1 个零,我希望接下来的 10 行数据中有 8 个 1 和 2 个零。
  • 但是如果行数不能除以0的个数怎么办?
  • 不需要很精确,尽量展开就好。

标签: arrays algorithm matlab matrix dataset


【解决方案1】:

如果只想随机移动行,可以使用randperm:

Y = X(randperm(size(X, 1)), :)
Y =

     1     8     9
     0    12    13
     1    14    15
     1     4     5
     0    10    11
     1     2     3
     1     6     7

虽然如果有大量行,0 和 1 可以预期几乎均匀分布,但这并不能保证。

只有当 0 和 1 的数量相等时,它们才能均匀分布。在这种情况下,它们可以一一排列:

X = [...
 1  2   3; 
 1  4   5; 
 0  6   7; 
 1  8   9; 
 0  10  11; 
 0  12  13; 
 1  14  15];
Y= zeros(size(X));
Y(1:2:end, :) = X(X(:, 1)==1, :);
Y(2:2:end, :) = X(X(:, 1)==0, :)
Y =

     1     2     3
     0     6     7
     1     4     5
     0    10    11
     1     8     9
     0    12    13
     1    14    15

但在您的情况下,0 和 1 的数量不相等,您可以结合上述方法。例如在您的测试用例中,首先交替排列两个 1 和两个 0,然后随机分布剩余的 3 个 1(已采取相反的步骤实现):

Y = zeros(size(X));
I0 = find(~X(:, 1));
n0 = length(I0);
I1 = find(X(:, 1));
n1 = length(I1);
nRandom = abs(n0-n1);
nAlter = min(n0, n1);

filled = randperm(size(X, 1), nRandom);
if n0 > n1
   Y(filled, :) = X(I0(nAlter+1:end), :);
else
   Y(filled, :) = X(I1(nAlter+1:end), :);
end

empty = setdiff(1:size(X, 1), filled);
Y(empty(1:2:nAlter*2), :) = X(I1(1:nAlter), :);
Y(empty(2:2:nAlter*2), :) = X(I0(1:nAlter), :)

【讨论】:

    【解决方案2】:

    在数据子集分布中强制实现某种一致性的最简单方法是对行进行排序(请参阅sortrows),然后通过交替行拆分数据。例如,分成 3 个相等的组:

    X = sortrows(X);
    X1 = X(1:3:end,:);
    X2 = X(2:3:end,:);
    X3 = X(3:3:end,:);
    

    这确实会影响日落:X1 的值总是小于 X2,等等。

    【讨论】:

      猜你喜欢
      • 2011-03-02
      • 1970-01-01
      • 2021-05-26
      • 2014-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-05
      • 2018-05-18
      相关资源
      最近更新 更多