正のランダム半正定行列を生成したい。私はアルゴリズムを探しています。より好ましくは、C、matlab、Java、または任意の言語でのアルゴリズムの単純な実装を探しています。
6 に答える
- 乱数行列を生成する
- 自身の転置を掛ける
- 正の半正定行列が得られました。
コード例 (Python):
import numpy as np
matrixSize = 10
A = np.random.rand(matrixSize, matrixSize)
B = np.dot(A, A.transpose())
print 'random positive semi-define matrix for today is', B
「ランダム」の定義を明確にする必要があります。結果のマトリックスに対する制約は何ですか? 係数を均一または正規分布にしますか? 固有値に特定の分布を持たせたいですか? (等。)
正の半正定値行列 M を生成するには、次のような多くの方法があります。
- 任意の行列 A を与えて、M = A T A を計算します (コレスキー分解を構築します)
- 非負の対角要素を持つ任意の対角行列 S と、同じサイズの正規直交行列 Q を指定して、M = QSQ Tを計算します (特異値分解を構築します) 。
数値的な理由から、目的のプロパティを持つ対角行列を生成し、次にハウスホルダー反射の数の合成として Q を生成することで、おそらく 2 番目のアプローチを選択します(ランダムなベクトル v を生成し、単位長にスケーリングし、H = I - 2vv T ); 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 が m 行 n 列の行列で、m < n の場合、B'*B は半正定行列です。これが役立つことを願っています。