J'aimerais pouvoir générer efficacement des matrices de corrélation positive semi-définie (PSD). Ma méthode ralentit considérablement lorsque j'augmente la taille des matrices à générer.
- Pourriez-vous suggérer des solutions efficaces? Si vous connaissez des exemples dans Matlab, je vous en serais très reconnaissant.
- Lors de la génération d'une matrice de corrélation PSD, comment choisir les paramètres pour décrire les matrices à générer? Une corrélation moyenne, écart type de corrélations, valeurs propres?
random-generation
correlation-matrix
Eduardas
la source
la source
Réponses:
Vous pouvez le faire en arrière: chaque matrice (l’ensemble de toutes les matrices PSD p × p symétriques ) peut être décomposée en tant queC∈Rp++ p×p
où O est une matrice orthonorméeC=OTDO O
Pour obtenir , d' abord générer une base aléatoire ( v 1 , . . . , V p ) (où v i sont des vecteurs aléatoires, typiquement dans ( - 1 , 1 ) ). De là, en utilisant le procédé d'orthogonalisation de Gram-Schmidt pour obtenir ( u 1 , . . . . , U p ) = OO (v1,...,vp) vi (−1,1) (u1,....,up)=O
possède un certain nombre de packages qui peuvent effectuer l'orthogonalisation GS d'une base aléatoire de manière efficace, même pour les grandes dimensions, par exemple le package "far". Bien que vous trouviez l'algorithme GS sur wiki, il vaut probablement mieux ne pas réinventer la roue et opter pour une implémentation de matlab (il en existe sûrement, je ne peux en recommander aucune).R
Enfin, est une matrice diagonale dont tous les éléments sont positifs (encore une fois, c’est facile à générer: générez p nombres aléatoires, positionnez-les, triez-les et placez-les à la diagonale d’une matrice identité p sur p ).D p p p
la source
Un article Génération de matrices de corrélation aléatoire à base de vignes et de méthode d'oignon étendu par Lewandowski, Kurowicka et Joe (LKJ), 2009, fournit un traitement et une présentation unifiés des deux méthodes efficaces de génération de matrices de corrélation aléatoire. Les deux méthodes permettent de générer des matrices à partir d'une distribution uniforme dans un certain sens défini ci-dessous, sont simples à mettre en œuvre, rapides et présentent l'avantage supplémentaire d'avoir des noms amusants.
Une matrice symétrique réelle de taille avec des unités sur la diagonale a d ( d - 1 ) / 2 éléments uniques hors diagonale et peut donc être paramétrée comme un point dans R d ( d - 1 ) / 2 . Chaque point de cet espace correspond à une matrice symétrique, mais tous ne sont pas définis positivement (comme doivent l'être les matrices de corrélation). Les matrices de corrélation forment donc un sous-ensemble de R d ( d - 1 ) / 2ré× d ré( d- 1 ) / 2 Rré( d- 1 ) / 2 Rré( d- 1 ) / 2 (en réalité un sous-ensemble convexe connecté) et les deux méthodes peuvent générer des points à partir d’une distribution uniforme sur ce sous-ensemble.
Je vais fournir ma propre implémentation MATLAB de chaque méthode et les illustrer avec .ré= 100
Méthode de l'oignon
La méthode de l'oignon provient d'un autre document (référence n ° 3 dans LKJ) et tire son nom du fait que les matrices de corrélation sont générées en commençant par la matrice et en le développant colonne par colonne et ligne par ligne. La distribution résultante est uniforme. Je ne comprends pas vraiment le calcul derrière la méthode (et préfère la deuxième méthode de toute façon), mais voici le résultat:1 × 1
Ci-dessous et en dessous, le titre de chaque sous-parcelle indique les valeurs propres les plus petites et les plus grandes, ainsi que le déterminant (produit de toutes les valeurs propres). Voici le code:
Méthode de l'oignon étendu
Les LKJ modifient légèrement cette méthode afin de pouvoir échantillonner les matrices de corrélation partir d’une distribution proportionnelle à [ d e tC . Plus le η est grand , plus le déterminant sera grand, ce qui signifie que les matrices de corrélation générées s'approcheront de plus en plus de la matrice d'identité. La valeur η = 1 correspond à une distribution uniforme. Sur la figure ci-dessous, les matrices sont générées avec η = 1 , 10 , 100 , 1000 , 10[ d e tC ]η- 1 η η= 1 .η= 1 , 10 , 100 , 1000 , 10000 , 100000
Pour une raison quelconque d'obtenir un déterminant du même ordre de grandeur que dans la méthode de l'oignon à la vanille, je dois mettre et non pas η = 1 (comme l'affirme LKJ). Je ne sais pas où est l'erreur.η= 0 η= 1
Méthode de la vigne
La méthode de la vigne a été proposée à l'origine par Joe (J en LKJ) et améliorée par LKJ. Je l’aime plus, parce que c’est conceptuellement plus facile et aussi plus facile à modifier. L'idée est de générer corrélations partielles (elles sont indépendantes et peuvent avoir n'importe quelle valeur de [ - 1 , 1 ]ré( d- 1 ) / 2 [ - 1 , 1 ] sans contrainte) puis convertissez-les en corrélations brutes via une formule récursive. Il est pratique d'organiser le calcul dans un certain ordre. Ce graphe est appelé "vigne". De manière importante, si des corrélations partielles sont échantillonnées à partir de distributions bêta particulières (différentes pour différentes cellules de la matrice), la matrice résultante sera distribuée de manière uniforme. Là encore, LKJ introduit un paramètre supplémentaire à échantillonner à partir d’une distribution proportionnelle à [ d e tη . Le résultat est identique à l'oignon étendu:[ d e tC ]η- 1
Méthode de la vigne avec échantillonnage manuel des corrélations partielles
Notez que dans ce cas, la distribution n'est pas garantie d'être invariante à la permutation, aussi permutez-vous de manière aléatoire de manière aléatoire les lignes et les colonnes après la génération.
Voici comment les histogrammes des éléments hors diagonale recherchent les matrices ci-dessus (la variance de la distribution augmente de façon monotone):
Mise à jour: utilisation de facteurs aléatoires
Et le code:
Voici le code d'emballage utilisé pour générer les chiffres:
la source
Une caractérisation encore plus simple est celle de la matrice réelleUNE , UNETUNE est positif semi-défini. Pour voir pourquoi c'est le cas, il suffit de prouver queyT( UnTA ) y≥ 0 pour tous les vecteurs y (de la bonne taille, bien sûr). C'est trivial:yT( UnTA ) y= ( A y)TUn y= | | Un y| | ce qui est non négatif. Donc, dans Matlab, essayez simplement
Selon l’application, il se peut que cela ne vous donne pas la distribution des valeurs propres souhaitée; La réponse de Kwak est bien meilleure à cet égard. Les valeurs propres de
X
cet extrait de code doivent correspondre à la distribution de Marchenko-Pastur.Pour simuler les matrices de corrélation des actions, supposons une approche légèrement différente:
la source
En variante à la réponse du kwak: générer une matrice diagonaleré avec des valeurs propres non négatives aléatoires à partir d'une distribution de votre choix, puis effectuez une transformation de similarité A = Q D QT avec Q une matrice orthogonale pseudo-aléatoire distribuée par Haar .
la source
Vous n'avez pas spécifié de distribution pour les matrices. Deux distributions communes sont les distributions de Wishart et inverses de Wishart. La décomposition de Bartlett donne une factorisation de Cholesky d'une matrice de Wishart aléatoire (qui peut également être résolue efficacement pour obtenir une matrice de Wishart inverse aléatoire).
En fait, l'espace de Cholesky est un moyen pratique de générer d'autres types de matrices de PSD aléatoires, car il vous suffit de vous assurer que la diagonale est non négative.
la source
La méthode la plus simple est celle ci-dessus, qui consiste à simuler un ensemble de données aléatoires et à calculer le gramian . Un mot de prudence: la matrice résultante ne sera pas uniformément aléatoire, en ce sens que sa décomposition, disonsUTSU Les rotations ne seront pas réparties conformément à la mesure de Haar. Si vous souhaitez disposer de matrices PSD "uniformément réparties", vous pouvez utiliser l'une des approches décrites ici .
la source
Si vous souhaitez mieux contrôler votre matrice PSD symétrique générée, par exemple générer un jeu de données de validation synthétique, vous disposez d'un certain nombre de paramètres. Une matrice PSD symétrique correspond à une hyper-ellipse dans l'espace à N dimensions, avec tous les degrés de liberté correspondants:
Ainsi, pour une matrice à 2 dimensions (c.-à-d. Ellipse 2d), vous aurez 1 rotation + 2 axes = 3 paramètres.
Si les rotations rappellent les matrices orthogonales, c’est un train correct, car la construction est à nouveauΣ = O D OT , avec Σ étant la matrice Sym.PSD produite, O la matrice de rotation (qui est orthogonale), et ré la matrice diagonale, dont les éléments diagonaux contrôleront la longueur des axes de l'ellipse.
Le code Matlab ci-après représente 16 ensembles de données distribués gaussiens bidimensionnels basés surΣ , avec un angle croissant. Le code pour la génération aléatoire de paramètres est dans les commentaires.
Pour plus de dimensions, la matrice Diagonal est simple (comme ci-dessus), et leU découler de la multiplication des matrices de rotation.
la source
Une méthode peu coûteuse et amusante que j’ai utilisée pour tester consiste à générer m N (0,1) n-vecteurs V [k], puis à utiliser P = d * I + Somme {V [k] * V [k] '} en tant que matrice nxn psd. Avec m <n, cela sera singulier pour d = 0, et pour petit d aura un nombre de condition élevé.
la source