正のランダムな半確定行列を生成したい。私はアルゴリズム、またはより好ましくはC、matlab、Javaまたは任意の言語でのアルゴリズムの単純な実装を探しています。
サンプルコード(Python):
from scipy import random, linalg
matrixSize = 10
A = random.Rand(matrixSize,matrixSize)
B = numpy.dot(A,A.transpose())
print 'random positive semi-define matrix for today is', B
「ランダム」の定義を明確にする必要があります。結果の行列に対する制約は何ですか?係数を均一または正規分布にしますか?固有値に特定の分布を持たせたいですか? (等。)
正の半定値行列Mを生成するには、次のようないくつかの方法があります。
数値的な理由から、私はおそらく、目的のプロパティを持つ対角行列を生成し、次にQをいくつかの ハウスホルダー反射 の合成として生成することによって2番目のアプローチを選択します(ランダムベクトルvを生成します、単位長にスケール、H = I-2vvT); K * Nを使用したいと思うかもしれません。ここで、Nは行列Mのサイズであり、Kは十分な自由度を確保するために1.5〜3の数値です(これを推測しています)。
ギブンス回転 を使用して直交行列Qを生成することもできます。1からNまでの2つの異なる値を選択し、その軸のペアを中心に、角度が0から均一に分布するギブンス回転を生成します。 〜2 * pi。次に、これらのK * Nを取り(上記の段落と同じ理由)、それらの構成はQを生成します。
編集:私は推測(わからない)あなたが独立して生成され、正規分布している係数を持っているなら、全体としての行列は「正規分布」(それが意味するものは何でも)。少なくとも、ベクトルには当てはまります。 (コンポーネントごとに1つずつ、N個の独立して生成されたガウス確率変数はガウス確率ベクトルを提供します)これは、一様分布のコンポーネントには当てはまりません。
選択した言語でランダム行列を生成できる場合は、行列にその転置を掛けたものが正の半確定であるというプロパティを使用して、ランダムな正の半確定行列を生成できます。
Matlabではそれは同じくらい簡単でしょう
% Generate a random 3x3 matrix
A = Rand(3,3)
% Multiply by its tranpose
PosSemDef = A'*A
正の半定値行列の自然分布は ウィッシャート分布 です。
A '* Aは、Aがランクが不足している場合にのみ、正の半欠損行列を与えます。したがって、上記の回答とウィキペディアからコピーされた回答は一般的に真実ではありません。正の半定値行列を計算するには、任意の長方形のm x n行列(m <n)を取り、その転置を乗算します。つまりBがmx nの行列で、m <nの場合、B '* Bは半定値行列です。これがお役に立てば幸いです。
少し明確にするために(私は願っています)。 Aをランダム行列(たとえば、ランダムな正規変量が入力されている)、m x n、m> = nとします。次に、Aが完全な列ランクの場合、A'Aは正定値になります。 Aのランクがn未満の場合、A'Aは正定値になります(ただし正定値ではありません)。
M> = nのランダム正規行列は、ほぼ確実にフルランクになります。ランクが不足している行列を生成するには、他の列の線形結合である1つ以上の列を追加できます。