質問

正のランダムな半正定行列を生成したい。私はアルゴリズム、またはできればC、matlab、javaまたは任意の言語でのアルゴリズムの単純な実装を探しています。

役に立ちましたか?

解決

  1. ランダム行列を生成
  2. それ自身の転置で乗算します
  3. 正の半正定行列が得られました。

サンプルコード(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

他のヒント

<!> quot; random <!> quot;の定義を明確にする必要があります。結果のマトリックスに対する制約は何ですか?係数を均一または正規分布にしたいですか?固有値に特定の分布を持たせたいですか? (など)

正の半正定値行列Mを生成するには、次のようないくつかの方法があります。

  1. 任意の行列Aを与え、M = A T Aを計算します(コレスキー分解
  2. 非負の対角成分を持つ任意の対角行列Sと、同じサイズの正規直交行列Qを与えて、M = QSQ T を計算します(特異値分解

数値的な理由から、希望するプロパティを持つ対角行列を生成し、次にハウスホルダーの反射(ランダムなベクトルvを生成し、単位長にスケーリング、H = I-2vv T ); K * Nを使用したいのではないかと思います。Nは行列Mのサイズで、Kは十分な自由度があることを保証する1.5〜3の数値です(これは推測しています)。

回転を与えるを使用して、正規直交行列Qを生成することもできます。1から2つの異なる値を選択しますからNに変換し、その軸のペアを中心にギブンズ回転を生成します。角度は0から2 * piまで均一に分布します。次に、これらのうちK * N(上記の段落と同じ推論)を使用すると、その組成からQが得られます。

編集: guess と思います(確かではありません)独立して生成され正規分布する係数がある場合、マトリックス全体は<!> quot; normal distributed < !> quot; (それがどのような意味でも)。少なくともベクトルには当てはまります。 (コンポーネントごとに1つずつ、N個の独立して生成されたガウスランダム変数により、ガウスランダムベクトルが得られます)これは、均一に分布したコンポーネントには当てはまりません。

選択した言語でランダム行列を生成できる場合、転置を掛けた行列が正の半正定であるというプロパティを使用することにより、ランダムな正の半正定行列を生成できます

Matlabでは、

と同じくらい簡単です
% Generate a random 3x3 matrix
    A = rand(3,3) 
% Multiply by its tranpose
    PosSemDef = A'*A 

正定値行列の自然分布は、 Wishart分布です。

A '* Aは、Aがランク欠損の場合にのみ、正の半定義行列を与えます。したがって、上記の回答およびウィキペディアからコピーされた回答は一般的に真実ではありません。正の半正定行列を計算するには、任意の長方形のm x n行列(m <!> lt; n)を取得し、その転置を掛けます。つまりBがm行n列の行列で、m <!> ltの場合。 n、B '* Bは半正定行列です。これがお役に立てば幸いです。

少し明確にするために(願っています)。 Aをランダム行列(たとえば、ランダムな正規変量で埋められたもの)、m <!> gt; = nのm x nとします。次に、Aがフルカラムランクの場合、A'Aは正定値になります。 Aがランク<!> ltの場合; nの場合、A'Aは半正定になります(ただし、 正定値)。

m <!> gt; = nのランダム正規行列は、ほぼ確実にフルランクになります。ランク不足のマトリックスを生成するには、他の列の線形結合である1つ以上の列を追加できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top