Frage

Ich mag positive Zufall semidefinit Matrizen erzeugen. Ich suche einen Algorithmus oder bevorzugter eine einfache Implementierung des Algorithmus in C, Matlab, Java oder einer beliebigen Sprache.

War es hilfreich?

Lösung

  1. erzeugen Zufallsmatrix
  2. multiplizieren sie mit seiner eigenen Umsetzung
  3. Sie haben eine positive Halb definite Matrix erhalten.

Beispiel-Code (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

Andere Tipps

Sie müssen sich auf Ihre Definition von „random“ klar sein. Was sind Ihre Einschränkungen auf der resultierende Matrix? Wollen Sie die Koeffizienten gleichmäßig oder normal verteilt werden? Haben Sie die Eigenwerte wollen eine bestimmte Verteilung haben? (Etc.)

Es gibt eine Reihe von Möglichkeiten, positive semidefinite Matrizen M zu erzeugen, einschließlich:

  1. eine willkürliche Matrix A gegeben, berechnet M = A T A (Konstruktion eines Cholesky-Zerlegung )
  2. eine beliebige Diagonalmatrix S mit nicht negativen Diagonaleinträge gegeben und eine orthonormale Matrix Q der gleichen Größe, berechnen M = QSQ T (Konstruktion eines Singulärwertzergliederung )

Bei numerischen Gründen würde ich wahrscheinlich den zweiten Ansatz wählen, indem die Diagonalmatrix mit den gewünschten Eigenschaften zu erzeugen, dann Q wie die Zusammensetzung einer Reihe von Householder-Reflexion (generieren eines Zufallsvektors v, Skala Einheitslänge, H = I - 2VV T ); Ich vermute, Sie würden wollen, K * N verwenden, wobei N die Größe der Matrix M und K eine Zahl zwischen 1,5-3 (Ich bin auf dieser erraten), die sicherstellt, dass es genügend Freiheitsgrade hat.

Sie können auch eine orthonormale Matrix Q mit Givens-Rotationen erzeugen: pick 2 verschiedene Werte von 1 eine Givens-Rotation zu diesem Paar von Achsen mit einem Winkel gleichmäßig von 0 bis 2 * pi verteilt und N erzeugen. Dann nehmen Sie K * N dieser (gleiche Argumentation wie oben Absatz) und deren Zusammensetzung Ausbeuten Q.

edit: Ich würde erraten (nicht sicher), dass, wenn Sie Koeffizienten aufweisen, die unabhängig voneinander erzeugt werden und normalverteilt, dann wäre die Matrix als Ganzes „normalverteilt“ (was immer das bedeutet ). Es ist wahr, für Vektoren, zumindest. (N unabhängig generierten Gaußsche Zufallsvariablen, ein für jede Komponente gibt Ihnen eine Gauß'sche Zufallsvektor) Das für nicht wahr ist gleichmäßig verteilten Komponenten.

Wenn Sie eine Zufallsmatrix in der gewählten Sprache erzeugen können, dann durch die Eigenschaft verwenden, die eine Matrix mit ihrer Transponierten multipliziert positiv semi-Definte, können Sie eine zufällige positive semidefinit matix erzeugen

In Matlab wäre es so einfach sein wie

% Generate a random 3x3 matrix
    A = rand(3,3) 
% Multiply by its tranpose
    PosSemDef = A'*A 

Natürliche Verteilungen auf positive semidefinite Matrizen sind Wishart Verteilungen .

A '* A eine positive semidefite Matrix iff geben und nur dann, wenn ein Rang-Mangel ist. So sind die Antworten oben angegeben und dass aus wikipedia kopiert sind im Allgemeinen nicht wahr. Zu berechnen, eine positive semidefinite Matrix einfach um jeden rechteckigen m mal n Matrix (m

ein wenig zu klären (hoffe ich). Es sei A eine Zufallsmatrix sein (beispielsweise durch zufälliges bevölkerten normales variates), m x n mit m> = n. Dann, wenn ein Vollspaltenrang ist, wird A'A positiv definite sein. Wenn A von Rang ist

Eine zufällige normale Matrix mit m> = n wird fast sicher vollen Rang sein; einen Rang-defizienten Matrix eine generieren kann eine oder mehrere Spalten anhängen, die Linearkombinationen von anderen Spalten sind.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top