Isso não é um bug.
Como exploramos (extensivamente) nos comentários, há duas coisas acontecendo. A primeira é que as colunas de U são restritas para atender aos requisitos de SVD: cada uma deve ter comprimento unitário e ser ortogonal a todas as outras. Vendo U como uma variável aleatória criada a partir de uma matriz aleatória X através de um algoritmo SVD específico, observamos que esses k(k+1)/2 restrições funcionalmente independentes criar dependências estatísticas entre as colunas deU .
Essas dependências podem ser reveladas em maior ou menor grau, estudando as correlações entre os componentes de U , mas surge um segundo fenômeno : a solução SVD não é única. No mínimo, cada coluna de U pode ser negada independentemente, fornecendo pelo menos 2k soluções distintas com k colunas. Uma forte correlação (superior a 1/2 ) pode ser induzido alterando os sinais das colunas de forma adequada. (Uma maneira de fazer isso é dada no meu primeiro comentário à resposta da Amoeba neste tópico: forço todas asvocêeu eu, i = 1 , … , k para ter o mesmo sinal, tornando-os todos negativos ou positivos com igual probabilidade.) Por outro lado, todas as correlações podem desaparecer escolhendo os sinais aleatoriamente, independentemente, com probabilidades iguais. (Dou um exemplo abaixo na seção "Editar".)
Com cuidado, podemos parcialmente discernir esses dois fenômenos ao ler matrizes de dispersão dos componentes de você . Certas características - como a aparência de pontos quase uniformemente distribuídos em regiões circulares bem definidas - desmentem uma falta de independência. Outros, como gráficos de dispersão que mostram correlações claras diferentes de zero, obviamente dependem de escolhas feitas no algoritmo - mas tais escolhas são possíveis apenas devido à falta de independência em primeiro lugar.
O teste final de um algoritmo de decomposição como SVD (ou Cholesky, LR, LU, etc.) é se ele faz o que afirma. Nesta circunstância, é suficiente verificar que quando retorna a SVD triplo de matrizes ( U, D , V) , que X é recuperado, até erro de ponto flutuante antecipado, pelo produto vocêD V′ ; que as colunas de você e de V são ortonormais; e que D é diagonal, seus elementos diagonais não são negativos e estão organizados em ordem decrescente. Eu apliquei esses testes ao svd
algoritmo emR
e nunca achei que estivesse errado. Embora isso não seja garantia de que esteja perfeitamente correto, essa experiência - que acredito ser compartilhada por muitas pessoas - sugere que qualquer bug exigiria algum tipo extraordinário de entrada para se manifestar.
O que se segue é uma análise mais detalhada de pontos específicos levantados na questão.
Usando R
o svd
procedimento, primeiro você pode verificar se, à medida que k aumenta, as correlações entre os coeficientes de você tornam mais fracas, mas ainda são diferentes de zero. Se você simplesmente realizasse uma simulação maior, descobriria que são significativas. (Quando k = 3 , 50000 iterações devem ser suficientes.) Ao contrário do que afirma a pergunta,as correlações "não desaparecem completamente".
Segundo, uma maneira melhor de estudar esse fenômeno é voltar à questão básica da independência dos coeficientes. Embora as correlações tendam a ser próximas de zero na maioria dos casos, a falta de independência é claramente evidente. Isto é feito mais aparente através do estudo da distribuição multivariada completa dos coeficientes de você . A natureza da distribuição surge mesmo em pequenas simulações nas quais as correlações diferentes de zero ainda não podem ser detectadas. Por exemplo, examine uma matriz de dispersão dos coeficientes. Para tornar isso viável, defino o tamanho de cada conjunto de dados simulado como 4 e mantive k = 2 , desenhando1000realizações da matriz 4 × 2você , criando uma matriz 1000 × 8 . Aqui está sua matriz completa do gráfico de dispersão, com as variáveis listadas por suas posições em você :
A varredura da primeira coluna revela uma interessante falta de independência entre você11 e a outra vocêeu j : veja como o quadrante superior do gráfico de dispersão com você21 está quase vazio, por exemplo; ou examine a nuvem elíptica inclinada para cima que descreve a relação ( u11, u22) e a nuvem inclinada para baixo para a ( u21, u12)par 12 ). Um exame mais atento revela uma clara falta de independência entre quase todos esses coeficientes: muito poucos deles parecem remotamente independentes, embora a maioria deles apresente correlação quase zero.
(NB: A maioria das nuvens circulares são projeções de uma hiperesfera criada pela condição de normalização, forçando a soma dos quadrados de todos os componentes de cada coluna a serem unidos.)
Matrizes de gráficos de dispersão com k = 3 e k = 4 exibem padrões semelhantes: esses fenômenos não estão confinados a k = 2 , nem dependem do tamanho de cada conjunto de dados simulado: eles apenas ficam mais difíceis de gerar e examinar.
As explicações para esses padrões vão para o algoritmo usado para obter você na decomposição de valor singular, mas sabemos que esses padrões de não independência devem existir pelas propriedades definidoras devocê : uma vez que cada coluna sucessiva é (geometricamente) ortogonal à anterior outras, essas condições de ortogonalidade impõem dependências funcionais entre os coeficientes, o que se traduz em dependências estatísticas entre as variáveis aleatórias correspondentes.
Editar
Em resposta aos comentários, vale a pena observar até que ponto esses fenômenos de dependência refletem o algoritmo subjacente (para calcular um SVD) e o quanto eles são inerentes à natureza do processo.
Os padrões específicos de correlações entre coeficientes dependem muito das escolhas arbitrárias feitas pelo algoritmo SVD, porque a solução não é única: as colunas de você sempre podem ser multiplicadas independentemente por - 1 ou 1 . Não há maneira intrínseca de escolher o sinal. Assim, quando dois algoritmos SVD fazem escolhas diferentes (arbitrárias ou talvez aleatórias) de sinal, eles podem resultar em diferentes padrões de gráficos de dispersão dos valores ( ueu j, uEu′j′) . Se você quiser ver isso, substitua a stat
função no código abaixo por
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
}
Este primeiro reordena aleatoriamente as observações x
, executa SVD e aplica a ordem inversa u
para corresponder à sequência de observação original. Como o efeito é formar misturas de versões refletidas e rotacionadas dos gráficos de dispersão originais, os gráficos de dispersão na matriz parecerão muito mais uniformes. Todas as correlações de amostra serão extremamente próximas de zero (por construção: as correlações subjacentes são exatamente zero). No entanto, a falta de independência ainda será óbvia (nas formas circulares uniformes que aparecem, particularmente entre vocêi , j e vocêi , j′ ).
A falta de dados em alguns quadrantes de alguns dos gráficos de dispersão originais (mostrados na figura acima) decorre de como o R
algoritmo SVD seleciona sinais para as colunas.
Nada muda sobre as conclusões. Como a segunda coluna de você é ortogonal à primeira, ela (considerada uma variável aleatória multivariada) é dependente da primeira (também considerada como uma variável aleatória multivariada). Você não pode ter todos os componentes de uma coluna independentes de todos os componentes da outra; tudo o que você pode fazer é examinar os dados de maneiras que obscurecem as dependências - mas a dependência persistirá.
Aqui está o R
código atualizado para lidar com os casos k > 2 e desenhar uma parte da matriz do gráfico de dispersão.
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=".")