Ce n'est pas un bug.
Comme nous l'avons exploré (en détail) dans les commentaires, deux choses se produisent. La première est que les colonnes de U sont contraintes pour répondre aux exigences SVD: chacune doit avoir une longueur unitaire et être orthogonale à toutes les autres. Affichage d'un U comme une variable aléatoire créée à partir d' une matrice aléatoire X via un algorithme de SVD particulier, nous notons donc que ces k ( k + 1 ) / 2 contraintes fonctionnellement indépendantes créer des dépendances statistiques entre les colonnes de U .
Ces dépendances pourraient être révélées plus ou moins en étudiant les corrélations entre les composantes de U , mais un deuxième phénomène émerge : la solution SVD n'est pas unique. Au minimum, chaque colonne de U peut être négativement indépendante, donnant au moins 2k solutions distinctes avec k colonnes. De fortes corrélations (excédant 1 / 2 ) peut être induite en changeant les signes des colonnes de manière appropriée. (Une façon de le faire est donnée dans mon premier commentaire à la réponse d'Amoeba dans ce fil: je force tous les uje je,i=1,…,k pour avoir le même signe, les rendant tous négatifs ou tous positifs avec une probabilité égale.) En revanche, toutes les corrélations peuvent être faites pour disparaître en choisissant les signes au hasard, indépendamment, avec des probabilités égales. (Je donne un exemple ci-dessous dans la section "Modifier".)
Avec des soins, nous pouvons discerner partiellement ces deux phénomènes lors de la lecture des matrices de diagramme de dispersion des composants de U . Certaines caractéristiques - telles que l'apparition de points répartis de manière presque uniforme dans des régions circulaires bien définies - démentent un manque d'indépendance. D'autres, tels que les diagrammes de dispersion montrant des corrélations claires non nulles, dépendent évidemment des choix effectués dans l'algorithme - mais de tels choix ne sont possibles qu'en raison du manque d'indépendance en premier lieu.
Le test ultime d'un algorithme de décomposition comme SVD (ou Cholesky, LR, LU, etc.) est de savoir s'il fait ce qu'il prétend. Dans ce cas, il suffit de vérifier que lorsque SVD renvoie le triple des matrices (U,D,V) , que X est récupéré, jusqu'à l'erreur en virgule flottante anticipée, par le produit UD V′ ; que les colonnes de U et de V sont orthonormées; et que ré est diagonal, ses éléments diagonaux sont non négatifs et sont disposés en ordre décroissant. J'ai appliqué de tels tests à l' svd
algorithme dansR
et je ne l'ai jamais trouvé erroné. Bien que ce ne soit pas une assurance qu'il est parfaitement correct, une telle expérience - qui, je crois, est partagée par un grand nombre de personnes - suggère que tout bogue nécessiterait une sorte d'entrée extraordinaire pour être manifeste.
Ce qui suit est une analyse plus détaillée des points spécifiques soulevés dans la question.
En utilisant R
la svd
procédure de, vous pouvez d'abord vérifier qu'à mesure que k augmente, les corrélations entre les coefficients de U s'affaiblissent, mais elles sont toujours non nulles. Si vous deviez simplement effectuer une simulation plus large, vous constateriez qu'ils sont importants. (Lorsque k = 3 , 50000 itérations devraient suffire.) Contrairement à l'affirmation de la question, les corrélations ne "disparaissent pas complètement".
Deuxièmement, une meilleure façon d'étudier ce phénomène est de revenir à la question fondamentale de l' indépendance des coefficients. Bien que les corrélations tendent à être proches de zéro dans la plupart des cas, le manque d'indépendance est clairement évident. Ceci est rendu plus évident en étudiant la distribution à plusieurs variables complète des coefficients de U . La nature de la distribution émerge même dans de petites simulations dans lesquelles les corrélations non nulles ne peuvent pas (encore) être détectées. Par exemple, examinez une matrice de nuage de points des coefficients. Pour rendre cela possible, j'ai défini la taille de chaque jeu de données simulé à 4 et j'ai gardé k = 2 , dessinant ainsi 1000réalisations de la matrice 4 × 2U , créant une matrice 1000 × 8 . Voici sa matrice de nuage de points complète, avec les variables répertoriées par leur position dans U :
Le fait de parcourir la première colonne révèle un manque d'indépendance intéressant entre u11 et les autres uje j : regardez par exemple comment le quadrant supérieur du nuage de points avec u21 est presque vide; ou examiner le nuage elliptique incliné vers le haut décrivant la relation ( u11, u22) et le nuage incliné vers le bas pour la paire ( u21, u12) . Un examen attentif révèle un manque d'indépendance évident entre presque tous ces coefficients: très peu d'entre eux semblent indépendants à distance, même si la plupart d'entre eux présentent une corrélation proche de zéro.
(NB: la plupart des nuages circulaires sont des projections d'une hypersphère créée par la condition de normalisation forçant la somme des carrés de tous les composants de chaque colonne à l'unité.)
Les matrices de nuages de points avec k = 3 et k = 4 présentent des schémas similaires: ces phénomènes ne se limitent pas à k = 2 , ni ne dépendent de la taille de chaque jeu de données simulé: ils deviennent plus difficiles à générer et à examiner.
Les explications de ces modèles vont à l'algorithme utilisé pour obtenir U dans la décomposition en valeurs singulières, mais nous savons que de tels modèles de non-indépendance doivent exister par les propriétés très définissantes de U : puisque chaque colonne successive est (géométriquement) orthogonale à la précédente celles-ci, ces conditions d'orthogonalité imposent des dépendances fonctionnelles parmi les coefficients, ce qui se traduit par des dépendances statistiques parmi les variables aléatoires correspondantes.
Éditer
En réponse aux commentaires, il peut être intéressant de noter dans quelle mesure ces phénomènes de dépendance reflètent l'algorithme sous-jacent (pour calculer une SVD) et dans quelle mesure ils sont inhérents à la nature du processus.
Les modèles spécifiques de corrélations entre les coefficients dépendent beaucoup des choix arbitraires faits par l'algorithme SVD, car la solution n'est pas unique: les colonnes de U peuvent toujours être indépendamment multipliées par - 1 ou 1 . Il n'y a aucun moyen intrinsèque de choisir le signe. Ainsi, lorsque deux algorithmes SVD font des choix de signe différents (arbitraires ou peut-être même aléatoires), ils peuvent entraîner des motifs différents de diagrammes de dispersion des valeurs ( uje j, uje′j′) . Si vous souhaitez voir cela, remplacez la stat
fonction dans le code ci-dessous par
stat <- function(x) {
i <- sample.int(dim(x)[1]) # Make a random permutation of the rows of x
u <- svd(x[i, ])$u # Perform SVD
as.vector(u[order(i), ]) # Unpermute the rows of u
}
Ce premier réordonne au hasard les observations x
, effectue la SVD, puis applique l'ordre inverse à u
pour correspondre à la séquence d'observation d'origine. Comme l'effet est de former des mélanges de versions réfléchies et tournées des diagrammes de dispersion d'origine, les diagrammes de dispersion dans la matrice seront beaucoup plus uniformes. Toutes les corrélations de l'échantillon seront extrêmement proches de zéro (par construction: les corrélations sous-jacentes sont exactement nulles). Néanmoins, le manque d'indépendance restera évident (dans les formes circulaires uniformes qui apparaissent, notamment entre ui , j et ui , j′ ).
Le manque de données dans certains quadrants de certains des diagrammes de dispersion d'origine (illustrés dans la figure ci-dessus) provient de la façon dont l' R
algorithme SVD sélectionne les signes pour les colonnes.
Rien ne change dans les conclusions. Parce que la deuxième colonne de U est orthogonale à la première, elle (considérée comme une variable aléatoire multivariée) dépend de la première (également considérée comme une variable aléatoire multivariée). Vous ne pouvez pas avoir tous les composants d'une colonne indépendants de tous les composants de l'autre; tout ce que vous pouvez faire est de regarder les données de manière à masquer les dépendances - mais la dépendance persistera.
Voici un R
code mis à jour pour gérer les cas k > 2 et dessiner une partie de la matrice de nuage de points.
k <- 2 # Number of variables
p <- 4 # Number of observations
n <- 1e3 # Number of iterations
stat <- function(x) as.vector(svd(x)$u)
Sigma <- diag(1, k, k); Mu <- rep(0, k)
set.seed(17)
sim <- t(replicate(n, stat(MASS::mvrnorm(p, Mu, Sigma))))
colnames(sim) <- as.vector(outer(1:p, 1:k, function(i,j) paste0(i,",",j)))
pairs(sim[, 1:min(11, p*k)], pch=".")