5个独立分布的拉丁超立方抽样

时间:2013-09-25 15:02:39

标签: matlab

我有5个变量 A,V,h,l b ,这些变量都来自不同的分布。我想通过拉丁超立方采样的方法从每个分布中制作1,000个均匀分布的样本。这是一个现实的要求,即它真的比简单的随机抽样更好吗?你有没有参考我如何在matlab中做到这一点?这page表明我需要以某种方式转换样本......

3 个答案:

答案 0 :(得分:4)

更新#2:使用统计工具箱内置功能的解决方案

基本问题是您是否希望样品在常规网格上。如果没有,您可以为您的案例使用内置函数lhsdesign suggested here

p = 1000   % Number of points
N = 5   % Number of dimensions
lb = [1 1 1 1 1]; % lower bounds for A,V,h,l and b
ub = [10 10 10 10 10]; % upper bounds for A,V,h,l and b
X = lhsdesign(p,N,'criterion','correlation');
D = bsxfun(@plus,lb,bsxfun(@times,X,(ub-lb)));

'criterion','correlation'会为您提供所需的“平等分配”。

然后

D包含参数的不规则坐标分布。


首先我认为你们正在寻找常规网格上的样本,这似乎是一项艰巨的任务。我试图修改D = round(bsxfun...)以上的方法,但它不会给你满意的结果。所以对于这种情况,我仍然在这里提出我的初步想法:

以下解决方案远非快速而优雅,但它至少是一种解决方案。

% For at least 1000 samples M=6 divisions are necessary
M = 6;
N = 5;
% the perfect LHC distribution would have 1296 samples for M=6 divisions
% and 5 dimensions
counter_max = M^(N-1); %=1296

% pre-allocation
D = zeros(6,6,6,6,6);
counter = 0;

while counter < 1000
    c = randi(6,1,5);
    if ( sum( D( c(1) , c(2) , c(3) , c(4) ,  :    )) < 1 && ...
         sum( D( c(1) , c(2) , c(3) ,   :  , c(5)  )) < 1 && ...   
         sum( D( c(1) , c(2) ,   :  , c(4) , c(5)  )) < 1 && ...   
         sum( D( c(1) ,   :  , c(3) , c(4) , c(5)  )) < 1 && ...   
         sum( D(   :  , c(2) , c(3) , c(4) , c(5)  )) < 1  )

     D(c(1),c(2),c(3),c(4),c(5)) = 1;

     X(counter,:) = c;
     counter = counter+1;

    end
end

X最终包含所有样本的坐标。

如你所见,我使用了一个带有基础if条件的while循环。你希望1000个样本,这是一个真实的数字,可以在合理的时间内完成。我实际上会建议你使用尽可能接近1296的样本数量。这可能需要你很长时间。但是,当您创建一次结果矩阵并一次又一次地使用它时,请不要犹豫,24小时运行它。您还可以实现此处所述的中断代码:In MatLab, is it possible to terminate a script, but save all its internal variables to workspace?并查看您在此之前获得的样本数量。 (我在测试的20分钟内得到900个样本)

更新:显示方法限制的示例:

以下示例将说明OP可能愿意做什么以及结果实际应该是什么样子。因为我对一个好的解决方案也很感兴趣,所以我的有限并且无法提供“100%的结果”。

想象一个带有N=3分区的多维数据集(M=10)。

M = 10;
N = 3;
counter_max = M^(N-1);   %=100 maximum number of placeable samples

% pre-allocations
D = zeros(10,10,10);
counter = 0;

while counter < counter_max
    c = randi(10,1,3);
    % if condition checks if there is already a sample in the same row,
    % coloumn or z-coordinate, 
    if ( sum( D( c(1) , c(2) ,   :  )) < 1 && ...   
         sum( D( c(1) ,   :  , c(3) )) < 1 && ...   
         sum( D(   :  , c(2) , c(3) )) < 1  )

       %if not a new sample is generated
       D(c(1),c(2),c(3)) = 1;
       counter = counter+1;
       X(counter,:) = c;

    end
end

在大约10000次迭代之后,获得以下分布,其中包含100个可能放置的样本中的85个: enter image description here 其中颜色表示距离最近邻居的归一化距离。对于大多数点来说它很好(1),但由于有15个缺失的样本,有些点与其他点相距较远。

问题是:我怀疑在合理的时间内可以获得所有100个样本。当您将生成的样本绘制在迭代次数上时,您得到: enter image description here

...所以想要的结果似乎难以获得......

请将此答案视为鼓励而非解决方案。

答案 1 :(得分:1)

通过组合一维拉丁超立方体样本(LHS),可以为高阶尺寸的规则网格制作全套LHS。例如,想象一下3X3 LHS(即2-D和3格)。首先,您只需为常规网格制作一维LHS。一维(1,0,0),(0,1,0),(0,0,1)。然后,将一维LHS组合成二维维LHS。

1、0、0

0,1,0

0,0,1

0,1,0

1、0、0

0,0,1

...等等

也可以使用相同的方法(通过组合2-D LHS)创建用于3-D的LHS。

3X3有12种可能的LHS。通常,可能的LHS的数量为N x((M-1)!)^(M-1)。 (N =个分区,M =尺寸)

以下代码显示了3-D和10格的LHS。

此代码仅生成一个LHS。

结果是随机的。

100%的结果需要0.001288秒

clear;
clc;

M = 3; % dimension
N = 10; % division

Sel2 = ':,';
stop = 0;

P_matrix = repmat([num2str(N),','],1,M);
P_matrix = P_matrix(1:end-1);
eval(['P = zeros(', P_matrix, ');']);

P(1,1) = 1;
tic

while stop == 0
for i = 1 : M-1
    for j = 2:N
        if i == 1
            P(end    , j, 1) = P(1    , j-1, 1);
            P(1:end-1, j, 1) = P(2:end, j-1, 1);
        else
            Sel_2 = repmat(Sel2,1,i-1);
            Sel_2 = Sel_2(1:end-1);
            eval(['P(', Sel_2, ',end    , j, 1)     = P(', Sel_2 , ', 1    , j-1, 1);']);
            eval(['P(', Sel_2, ',1:end-1    , j, 1) = P(', Sel_2 , ', 2:end, j-1, 1);']);
        end
    end
    if i == 1
        P(:,:,1) = P(randperm(N),:,1);
    elseif i <M-1
        Sel_2 = repmat(Sel2,1,i);
        Sel_2 = Sel_2(1:end-1);
        eval(['P(',Sel_2,',:,1) = P(',Sel_2,',randperm(N),1);']);
    else
        Sel_2 = repmat(Sel2,1,i);
        Sel_2 = Sel_2(1:end-1);
        eval(['P(',Sel_2,',:) = P(',Sel_2,',randperm(N));']);
    end
end

% you can add stop condition
stop = 1;
end
toc

[x, y, z] = ind2sub(size(P),find(P == 1));
scatter3(x,y,z);
xlabel('X');
ylabel('Y');
zlabel('Z');

Result

答案 2 :(得分:0)

此代码给出的结果与本讨论中接受的结果相同。 看看吧!

n=1000; p=5; 
distr=lhsdesign(n,p); %creates LHS of n samples on each of your p dimensions 
% Then, you can choose any inverted distribution. in this case it is the Discrete Uniform Distribution
Parameters=[unidinv(distr(:,1),UB1) unidinv(distr(:,2),UB2) ...  
            unidinv(distr(:,3),UB3) unidinv(distr(:,4),UB4) ...
            unidinv(distr(:,5),UB5) ];
%At the end, you'll do a simple work of indexing.