Gostaria de poder gerar com eficiência matrizes de correlação semidefinido positivo (PSD). Meu método diminui drasticamente à medida que aumenta o tamanho das matrizes a serem geradas.
- Você poderia sugerir soluções eficientes? Se você conhece algum exemplo no Matlab, ficaria muito grato.
- Ao gerar uma matriz de correlação do PSD, como você selecionaria os parâmetros para descrever as matrizes a serem geradas? Uma correlação média, desvio padrão de correlações, autovalores?
random-generation
correlation-matrix
Eduardas
fonte
fonte
Respostas:
Você pode fazer isso ao contrário: toda matriz (o conjunto de todas as matrizes simétricas p × p PSD) pode ser decomposta comoC∈ Rp+ + p × p
que O é uma matriz ortonormalC= OTD O O
Para obter , geram primeiro uma base aleatória ( v 1 , . . . , V p ) (onde v i são vectores aleatórios, tipicamente em ( - 1 , 1 ) ). De lá, use o processo ortogonalização Gram-Schmidt para obter ( u 1 , . . . . , U p ) = OO ( v1, . . . , vp) vEu ( - 1 , 1 ) ( u1, . . . . , up) = O
possui vários pacotes que podem realizar a ortogonalização GS de uma base aleatória de forma eficiente, ou seja, mesmo para grandes dimensões, por exemplo, o pacote 'distante'. Embora você encontre o algoritmo GS no wiki, provavelmente é melhor não reinventar a roda e fazer uma implementação do matlab (certamente existe uma, eu simplesmente não posso recomendar nenhuma).R
Finalmente, é um matrizes diagonais cujos elementos são todos positivos (isto é, de novo, fácil de gerar: gerar p números aleatórios, quadrado-los, classificá-los e colocá-los até a diagonal de uma identidade p por p matriz).D p p p
fonte
Um artigo Gerando matrizes de correlação aleatória com base em videiras e método de cebola estendida por Lewandowski, Kurowicka e Joe (LKJ), 2009, fornece um tratamento unificado e exposição dos dois métodos eficientes de gerar matrizes de correlação aleatória. Ambos os métodos permitem gerar matrizes a partir de uma distribuição uniforme em um certo sentido preciso definido abaixo, são simples de implementar, rápidos e têm uma vantagem adicional de ter nomes divertidos.
Uma matriz simétrica real do tamanho com aqueles na diagonal tem d ( d - 1 ) / 2 elementos fora da diagonal exclusivos e assim pode ser parametrizada como um ponto em R d ( d - 1 ) / 2 . Cada ponto neste espaço corresponde a uma matriz simétrica, mas nem todos são positivos-definidos (como as matrizes de correlação precisam ser). Matrizes de correlação, portanto, formam um subconjunto de R d ( d - 1 ) / 2d× d d( d- 1 ) / 2 Rd( d- 1 ) / 2 Rd( d- 1 ) / 2 (na verdade, um subconjunto convexo conectado) e os dois métodos podem gerar pontos a partir de uma distribuição uniforme nesse subconjunto.
Fornecerei minha própria implementação MATLAB de cada método e ilustrarei com .d= 100
Método de cebola
O método cebola vem de outro papel (ref # 3 em LKJ) e possui o seu nome ao facto das matrizes de correlação são gerados a partir de matriz e o seu cultivo em coluna por coluna e linha por linha. A distribuição resultante é uniforme. Eu realmente não entendo a matemática por trás do método (e prefiro o segundo método de qualquer maneira), mas aqui está o resultado:1 × 1
Aqui e abaixo, o título de cada subparcela mostra os autovalores menores e maiores e o determinante (produto de todos os autovalores). Aqui está o código:
Método estendido de cebola
LKJ modifica este método levemente, para poder amostrar as matrizes de correlação de uma distribuição proporcional a [ d e tC . Quanto maior o η , maior será o determinante, o que significa que as matrizes de correlação geradas se aproximam cada vez mais da matriz de identidade. O valor η = 1 corresponde à distribuição uniforme. Na figura abaixo, as matrizes são geradas com η = 1 , 10 , 100 , 1000 , 10[ d e tC ]η- 1 η η= 1 .η= 1 , 10 , 100 , 1000 , 10000 , 100000
Por alguma razão, para obter o determinante da mesma ordem de grandeza que no método da cebola com baunilha, preciso colocar e não η = 1 (conforme reivindicado por LKJ). Não tenho certeza de onde está o erro.η= 0 η= 1
Método de videira
O método Vine foi originalmente sugerido por Joe (J em LKJ) e aprimorado por LKJ. Eu gosto mais, porque é conceitualmente mais fácil e mais fácil de modificar. A idéia é gerar correlações parciais (elas são independentes e podem ter valores de [ - 1 , 1 ]d( d- 1 ) / 2 [ - 1 , 1 ] sem restrições) e depois os converta em correlações brutas por meio de uma fórmula recursiva. É conveniente organizar o cálculo em uma determinada ordem, e este gráfico é conhecido como "videira". É importante ressaltar que, se forem amostradas correlações parciais de distribuições beta específicas (diferentes para células diferentes na matriz), a matriz resultante será distribuída uniformemente. Aqui, novamente, LKJ introduz um parâmetro adicional para amostrar a partir de uma distribuição proporcional a [ d e tη . O resultado é idêntico à cebola estendida:[ d e tC ]η- 1
Método Vine com amostragem manual de correlações parciais
Observe que, neste caso, a distribuição não é garantida como invariante de permutação, portanto, adicionalmente permito aleatoriamente linhas e colunas após a geração.
Aqui está como os histogramas dos elementos fora da diagonal procuram as matrizes acima (a variação da distribuição aumenta monotonicamente):
Atualização: usando fatores aleatórios
E o código:
Aqui está o código de quebra automática usado para gerar as figuras:
fonte
Dependendo do aplicativo, isso pode não fornecer a distribuição dos valores próprios que você deseja; A resposta de Kwak é muito melhor nesse sentido. Os valores próprios
X
produzidos por esse trecho de código devem seguir a distribuição Marchenko-Pastur.Para simular as matrizes de correlação de ações, por exemplo, convém uma abordagem ligeiramente diferente:
fonte
Como variação da resposta do kwak: gere uma matriz diagonalD com autovalores não negativos aleatórios de uma distribuição de sua escolha e, em seguida, execute uma transformação de similaridade A = Q D QT com Q uma matriz ortogonal pseudo-aleatória distribuída por Haar .
fonte
Você não especificou uma distribuição para as matrizes. Dois comuns são as distribuições Wishart e inversa Wishart. A decomposição de Bartlett fornece uma fatoração de Cholesky de uma matriz Wishart aleatória (que também pode ser resolvida com eficiência para obter uma matriz Wishart inversa aleatória).
De fato, o espaço de Cholesky é uma maneira conveniente de gerar outros tipos de matrizes aleatórias de PSD, pois você só precisa garantir que a diagonal não seja negativa.
fonte
O método mais simples é o descrito acima, que é uma simulação de um conjunto de dados aleatório e o cálculo do Gramian . Uma palavra de cautela: A matriz resultante não será uniformemente aleatória, pois sua decomposição, por exemplo,vocêTSvocê terá rotações não distribuídas de acordo com a medida de Haar. Se você quiser ter matrizes PSD "distribuídas uniformemente", poderá usar qualquer uma das abordagens descritas aqui .
fonte
Se você deseja ter mais controle sobre sua matriz PSD simétrica gerada, por exemplo, gerar um conjunto de dados de validação sintético, você tem vários parâmetros disponíveis. Uma matriz PSD simétrica corresponde a uma hiperelipse no espaço N-dimensional, com todos os graus de liberdade relacionados:
Portanto, para uma matriz bidimensional (isto é, elipse 2d), você terá 1 rotação + 2 eixos = 3 parâmetros.
Se as rotações lembram matrizes ortogonais, é um trem correto, pois a construção é novamenteΣ = O D OT com Σ sendo a matriz Sym.PSD produzida, O a matriz de rotação (ortogonal) e D a matriz diagonal, cujos elementos diagonais controlarão o comprimento dos eixos da elipse.
O código Matlab a seguir plota 16 conjuntos de dados distribuídos gaussianos bidimensionais com base emΣ , com um ângulo crescente. O código para geração aleatória de parâmetros está nos comentários.
Para mais dimensões, a matriz Diagonal é direta (como acima), e avocê deve derivar da multiplicação das matrizes de rotação.
fonte
Uma abordagem barata e alegre que usei para testar é gerar m N (0,1) n-vetores V [k] e usar P = d * I + Soma {V [k] * V [k] '} como uma matriz nxn psd. Com m <n, isso será singular para d = 0 e, para d pequeno, terá um número de condição alto.
fonte