正定値行列を生成するための単純なアルゴリズム
Simple Algorithm Generating Positive Semidefinite Matrices
解決:
- ランダム行列を生成する
- それ自身の転置を掛ける
- 正の半確定行列が得られました。
サンプルコード(Python):
import numpy as np matrixSize = 10 A = np.random.rand(matrixSize、matrixSize)B = np.dot(A、A.transpose())print '今日のランダムな正の半定義行列は'、B
「ランダム」の定義を明確にする必要があります。結果の行列に対する制約は何ですか?係数を均一または正規分布にしますか?固有値に特定の分布を持たせたいですか? (NS。)
正の半定値行列Mを生成するには、次のようないくつかの方法があります。
- 任意の行列Aが与えられた場合、M = Aを計算します。NSA(コレスキー分解の構築)
- 非負の対角要素を持つ任意の対角行列Sと、同じサイズの正規直交行列Qが与えられた場合、M = QSQを計算します。NS(特異値分解の構築)
数値的な理由から、おそらく2番目のアプローチを選択するのは、目的のプロパティを持つ対角行列を生成し、次にハウスホルダー反射の数の合成としてQを生成することです(ランダムベクトルvを生成し、単位長にスケーリングし、H = I-2vvNS); K * Nを使用したいと思うかもしれません。ここで、Nは行列Mのサイズであり、Kは十分な自由度を確保するために1.5〜3の数値です(これを推測しています)。
ギブンス回転を使用して直交行列Qを生成することもできます。1からNまでの2つの異なる値を選択し、その軸のペアを中心に、角度が0から2 * piまで均一に分布するギブンス回転を生成します。次に、これらのK * Nを取り(上記の段落と同じ理由)、それらの構成はQを生成します。
編集:私は 推測してみて (わからない)独立して生成され、正規分布している係数がある場合、行列は全体として「正規分布」になります(それが意味するものは何でも)。少なくとも、ベクトルには当てはまります。 (N個の独立して生成されたガウス確率変数(各コンポーネントに1つ)は、ガウス確率ベクトルを提供します)これは、均一に分散されたコンポーネントには当てはまりません。
選択した言語でランダム行列を生成できる場合は、行列にその転置を掛けたものが正の半定義であるというプロパティを使用して、ランダムな正の半確定行列を生成できます。
Matlabではそれは同じくらい簡単でしょう
%ランダムな3x3行列を生成しますA = rand(3,3)%その転置を乗算しますPosSemDef = A '* A