この問題のルールは、実際に GLn のサブセットを見ているため、かなり具体的です 。行ベクトルと列ベクトルが特定の形式を持っている必要があります (これらのベクトルを有効と呼びます。以下の例を参照してください)。ルールは次のとおりです。
長さ n の有効な非ゼロ ベクトルを一様に無作為に選択できます。
有効な vector が与えられると、関数 を使用して、
v1, v2, ..., vk
それらが形成する部分列が有効な vector のプレフィックスであるかどうか (たとえば[v1_1 v2_1 ... vk_1]
、有効な vector の最初の k エントリとして発生するかどうか) を判断できますisPrefix
。有効なベクトル v1、v2、...、vk が与えられた場合、関数 を使用してそれらが線形従属であるかどうかを判断できます
areIndependent
。
目標は、GLn のこのサブセットから均一にランダムにサンプリングすることです。失敗する素朴な解決策は次のとおりです。
Step 1: Select a valid v1 uniformly at random.
If isPrefix(v1) then Go to Step 2.
Otherwise repeat Step 1.
Step 2: Select a valid v2 uniformly at random.
If areIndependent(v1,v2) & isPrefix(v1,v2), then go to Step 3.
Otherwise, repeat Step 2.
...
Step n: Select a valid vn uniformly at random.
If areIndependent(v1,v2,...,vn) & isPrefix(v1,v2,...,vn), then END.
Otherwise, repeat Step n.
areIndependent(v1,v2,...,vk) & isPrefix(v1,v2,...,vk)
この解決策の問題点は、正しく戻る可能性があまり高くないイベントで無限ループに陥る可能性TRUE
があることですが、この k タプルを線形に独立した有効な n タプルに完成させる方法がないことです。これの一般的な例は、TRUEk=n-1
である一意の有効なベクトルvn
があるが、このベクトルは前の n-1 ベクトルから独立していない場合です。isPrefix(v1,v2,...,vn)
したがって、このループに陥っている場合は、1 つまたは 2 つのステップをバックアップするために何らかの方法で追加する必要がありますが、いつループするかは必ずしもわかりません。私はこれらの線に沿った解決策を探しています:有効なベクトルの分布に依存する可能性のある明示的な関数でステップ k が何度も失敗した場合は、ステップ k-1 に戻ります (または、さらに明示的な方法で)。f(k)
f
提案、コメント、参照などは大歓迎です! ありがとう!
例:
私は実際に、サンプリングの進め方に関する一般的な参考資料またはガイドラインを探しています。これを実行したい有効なベクトルの例がいくつかありますが、すべての例をリストして SO コミュニティに解決策をハッシュしてもらうよりも、最終的には自分で実行できる方が役に立ちます。ただし、具体的に、関連する難しさの感覚をつかむために、ここに 1 つの例を示します。
交互符号行列: ベクトルは、そのエントリがすべて 0、-1、1 であり、ゼロ以外のエントリが 1 と -1 の間で交互に繰り返され、エントリの合計が 1 である場合に有効です。たとえば、すべての順列行列は有効なベクトルで構成されます。 、および以下も含まれます。
0 1 0
1 -1 1
0 1 0
Distinct Entries : ベクトルは、別個のエントリを持つ場合に有効です。この条件は列だけでなく行にも適用されるため、これは特に厄介です。
これを見てくれたすべての人々に再び感謝します!