我有5个变量 A,V,h,l 和 b ,这些变量都来自不同的分布。我想通过拉丁超立方采样的方法从每个分布中制作1,000个均匀分布的样本。这是一个现实的要求,即它真的比简单的随机抽样更好吗?你有没有参考我如何在matlab中做到这一点?这page表明我需要以某种方式转换样本......
答案 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个: 其中颜色表示距离最近邻居的归一化距离。对于大多数点来说它很好(1),但由于有15个缺失的样本,有些点与其他点相距较远。
问题是:我怀疑在合理的时间内可以获得所有100个样本。当您将生成的样本绘制在迭代次数上时,您得到:
...所以想要的结果似乎难以获得......
请将此答案视为鼓励而非解决方案。
答案 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');
答案 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.