私は5つの変数A、V、h、l、bを持っていますが、これらはすべて異なる分布に由来しています。ラテンハイパーキューブサンプリングの方法で、各分布から1,000個の等分布サンプルを作成したいと思います。これは現実的な要求ですか?つまり、単純なランダム サンプリングよりも本当に優れているのでしょうか? matlabでこれを行う方法についての参考文献はありますか? このページは、サンプルを何らかの方法で変換する必要があることを示唆しています...
3 に答える
更新 #2: Statistics Toolbox の組み込み関数を使用したソリューション
基本的な問題は、サンプルを通常のグリッドに配置するかどうかです。そうでない場合は、組み込み関数lhsdesign
を使用できます。
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 にできるだけ近い数のサンプルを使用することをお勧めします。これにはかなりの時間がかかる可能性があります。ただし、結果のマトリックスを 1 回だけ作成して何度も使用する場合は、ためらわずに 24 時間実行してください。ここで説明されているように、割り込みコードを実装することもできます: In MatLab, is it possible to terminate a script, but save all its internal variables to workspace? それまでに得たサンプルの数を確認します。(テスト時は20分で900個のサンプルが取れました)
更新: メソッドの制限を示す例:
次の例は、質問者が喜んで何をすることができるか、および結果が実際にどのように見えるかを示しています。私も良い解決策に非常に興味があるので、私のものは限られており、「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 個すべてのサンプルを取得できるかどうかということです。生成されたサンプルを反復回数にわたってプロットすると、次のようになります。
...そのため、望ましい結果はほとんど得られないようです。
この回答は、解決策というより励みとしてご覧ください。