【问题标题】:random sampling from a 3-way data cube从 3 路数据立方体中随机抽样
【发布时间】:2013-11-03 14:59:48
【问题描述】:

想象一个 2 x 2 x 2 三向数据立方体:

data = [1 2; 3 4];
data(:,:,2) = [5 6; 7 8]

我希望从这个立方体(即 2x2 矩阵)生成一个行列切片,其中切片的每个元素都是通过随机采样其 3 模光纤(即第 n 模光纤是沿nth mode/dimension/way. 这个立方体中有 4 根 3 模光纤,其中一根是 f1 = [1 5],另一根是 f2 = [2 6],以此类推)。例如,一个切片可能变成:

slice = [5 2; 3 4]

不同的采样可能会导致切片:

slice = [1 2; 7 8]

有没有快速的方法来做到这一点?

我尝试使用 slice = datasample(data,1,3) 但此函数从多维数据集中随机选择一个行列切片(即 slice = [1 2; 3 4] 或 [5 6; 7 8] )。

【问题讨论】:

  • 不清楚,什么是三模光纤,第一个切片的采样与第二个切片的采样情况如何?请详细说明。
  • 第一个切片的采样与第二个切片的采样是一致的,因为在每个切片中,元素是通过对该元素所在的“纤维”进行采样而随机生成的(均匀采样)。对于例如,要生成元素 (1,1),您将从向量 [1 5] 中采样一个数字。谢谢
  • 我不明白第一个怎么可能是切片。对我来说,[5,2;7,4] 是对角线切片。
  • 我想生成一个 2x2 矩阵,因为 2x2 是通过立方体的一行/列切片。 2x2 矩阵中有 4 个元素。让我们取第一个元素 (1,1)。它的值应该来自向量的均匀随机抽样[1 5]。让我们转到下一个元素 (1,2)。它的值应该来自向量[2 6]。下一个元素是 (2,1),它的值应该来自向量 [3 7]。最后一个元素 (2,2) 需要一个从向量 [4 8] 中随机采样的值。我可以用循环来完成所有这些,但我想看看是否有更快/更简单的方法。再次感谢。
  • 我不确定您是否想要Nth 模式的通用解决方案,但我认为我的答案提供了这一点,使用randi 沿维度N 进行统一采样;

标签: matlab random-sample


【解决方案1】:

对任何nmode 尝试此解决方案(例如,nmode=3 是 3 模式):

data = cat(3,[1 2; 3 4],[5 6; 7 8]);
nmode = 3;
Dn = size(data,nmode);
modeSampleInds = randi(Dn,1,numel(data)/Dn); % here is the random sample
dp = reshape(permute(data,[nmode setdiff(1:ndims(data),nmode)]), Dn, []);
outSize = size(data); outSize(nmode)=1;
slice = reshape(dp(sub2ind(size(dp),modeSampleInds,1:size(dp,2))),outSize)

请注意,这不需要统计工具箱。它也可以完全推广到任何矩阵尺寸、维数和“N型光纤”。

如果需要,我很乐意解释每一行。

【讨论】:

    【解决方案2】:

    如果我理解正确,那么实际上很简单。您有四根 3 模光纤,并且您希望构建一个 2x2 矩阵,其中每个元素都从相应的光纤中采样。
    因此,您需要采样 4 次(每根纤维一个)2 种元素中的一种(每根纤维有两种元素):

    >> [h w fiberSize] = size(data); % make the solution more general
    >> fIdx = randsample( fiberSize, h*w ); % sample with replacements
    

    采样后,我们构造切片,为简单起见,我会将 3D 数据“展平”为 2D 矩阵

    >> fData = reshape( data, [], fiberSize );
    >> slice = fData( sub2ind( [h*w fiberSize], 1:(h*w), fIdx ) );
    >> slice = reshape( slice, [h w] ); % shape the slice
    

    【讨论】:

    • 有点复杂,因为采样不是来自 1:fiberSize。采样来自从立方体(特定于所讨论元素的第 3 模光纤)中获取的任意值向量。在示例中,我使用 1,2,3,4,5,6,7,8 填充立方体,但这只是将值放入其中。想象一下那里的任何随机值。我本可以更清楚地说明这一点。谢谢。
    • @val 这正是我使用sub2ind 将采样值 1:fiberSize` 转换为从data 提取的值的原因。请试一试我的代码,看看它是否符合您的需求。
    【解决方案3】:

    以下解决方案适用于任何立方体大小。不需要工具箱。

    N = size(data,1); %//length of side of cube
    r = randi(N,1,N^2)-1; %//this is the random sampling
    data_permuted = permute(data,[3 1 2]); %//permute so that sampling is along first dim
    slice = data_permuted((1:N:N^3)+r); %//sample using linear indexing 
    slice = reshape(slice.',N,N); %//reshape into a matrix
    

    【讨论】:

    • 这里的采样率为 1:N。采样应该是从特定于元件的 n 模光纤中任意采样的。 (见下面的 cmets)。我认为在这里我们特别坚持我的简单示例的结构。谢谢。
    • 这里的采样是 1:N 是什么意思?采样实际上是在每条 3 模光纤内的所有元素中随机进行的。这就是你想要的,不是吗?在您的示例 2x2x2 情况下, (1,1) 元素的值来自向量 [1 5] 的均匀随机采样(我仅使用您的值作为示例); (1,2) 元素来自向量 [2 6],依此类推。你真的尝试过我的代码吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多