Estou tentando reduzir a dimensionalidade e o ruído de um conjunto de dados executando o PCA no conjunto de dados e jogando fora os últimos PCs. Depois disso, quero usar alguns algoritmos de aprendizado de máquina nos PCs restantes e, portanto, quero normalizar os dados equalizando a variação dos PCs para fazer com que os algoritmos funcionem melhor.
Uma maneira simples é simplesmente normalizar a variação para os valores unitários. No entanto, o primeiro PC contém mais variação do conjunto de dados original do que os seguintes, e ainda quero dar mais "peso" a ele. Por isso, fiquei pensando: existe uma maneira simples de dividir sua variação e compartilhá-la com os PCs com menos variações?
Outra maneira é mapear os PCs de volta ao espaço original, mas nesse caso a dimensionalidade também aumentaria para o valor original.
Eu acho que é melhor manter as colunas resultantes ortogonais, mas não é necessário neste momento.
fonte
Respostas:
Não está totalmente claro para mim que o que você está perguntando é o que realmente precisa: uma etapa comum de pré-processamento no aprendizado de máquina é redução de dimensionalidade + clareamento, o que significa fazer PCA e padronizar os componentes, nada mais. No entanto, vou me concentrar na sua pergunta conforme ela é formulada, porque é mais interessante.
Seja a matriz de dados centralizada com pontos de dados em linhas e variáveis em colunas. O PCA equivale a decomposição de valor singular onde executar a redução de dimensionalidade mantemos apenas componentes. Uma "rotação fatorial" ortogonal desses componentes implica escolher uma matriz ortogonal e conectá-lo à decomposição:X n×d
Agora, estamos prontos para formular o problema em termos matemáticos: considerando cargas não rotacionadas , encontre a matriz de rotação modo que as cargas rotadas, , possui soma igual de quadrados em cada coluna.L=VkSk/n−1−−−−−√ R LR
Vamos resolver isso. As somas de quadrados da coluna após a rotação são iguais aos elementos diagonais de Isso faz sentido: a rotação simplesmente redistribui as variações dos componentes, que são originalmente fornecidos por , entre eles, de acordo com esta fórmula. Precisamos redistribuí-los para que todos se tornem iguais ao seu valor médio .
Não acho que exista uma solução de formulário fechado para isso e, de fato, existem muitas soluções diferentes. Mas uma solução pode ser facilmente criada de maneira sequencial:
Isso redistribuirá todas as variações igualmente por uma sequência de rotações 2D. A multiplicação de todas essas matrizes de rotação resultará no geral .(k−1) R
Exemplo
Considere a seguinte matriz :A variação média é . Meu algoritmo continuará da seguinte maneira:S2/(n−1)
Etapa 1: gire PC1 e PC4 para que PC1 obtenha variação . Como resultado, PC4 obtém a variação .5 1+(10−5)=6
Etapa 2: gire PC2 (nova variação máxima) e PC3 para que PC2 obtenha a variação . Como resultado, PC3 obtém variação .5 3+(6−5)=4
Etapa 3: gire PC4 (nova variação máxima) e PC3 para que o PC4 obtenha a variação . Como resultado, PC3 obtém variação .5 4+(6−1)=5
Feito.
Eu escrevi o script Matlab que implementa esse algoritmo (veja abaixo). Para esta matriz de entrada, a sequência dos ângulos de rotação é:
Desvios de componentes após cada etapa (em linhas):
A matriz de rotação final (produto de três matrizes de rotação 2D):
E a matriz final é:(LR)⊤LR
Aqui está o código:
Aqui está o código em Python fornecido pelo @feilong:
Observe que esse problema é completamente equivalente ao seguinte: considerando variáveis não correlacionadas com variâncias , encontre uma rotação (isto é, uma nova base ortogonal) que produzirá variáveis com variâncias iguais (mas é claro que não estão mais correlacionadas).k σ2i k
fonte
mu
.Em sua resposta perspicaz e abrangente, @amoeba mostrou - como parte da resposta - como é possível girar duas variáveis não correlacionadas (como componentes principais, por exemplo) para obter as variações desejadas para elas (embora às custas de perder a falta de correlação, é claro) . Permita que as variáveis ortogonais e tenham variações (um maior) e (um menor), respectivamente. Gire-os para que obtenha uma variação arbitrária e reduzida (enquanto , consequentemente, se tornará na variação ).X Y σ2max σ2min X μ2 Y σ2max+σ2min−μ2
@amoeba mostra a fórmula a partir da qual podemos calcular o ângulo dessa rotação, :cosθ
mas não demonstrou de onde vem essa equação; provavelmente pensando que é óbvio sem explicação. Óbvio ou não, acredito que vale a pena elucidar - de alguma forma. Minha resposta apresenta uma maneira.
E assim, temos um elipsoidais, dados a nuvem centrada no espaço de variáveis não correlacionadas e . Temos que girar os eixos em ângulo . Um ponto de dados na nuvem (como mostrado como ponto verde na imagem) com a coordenada terá essa coordenada como após a rotação.X Y θ X x x∗
Observe que a projeção da coordenada entalhe no eixo rotacionado é dada por (cateto como hipotenusa e ângulo entre eles). Observe também que é menor que pelo corte do comprimento calculável a partir da coordenada : (outro cateto e hipotenusa). E entao,x X∗ x′=xcosθ x∗ x′ x′−x∗ y ysinθ
Conhecemos (veja o início) as variações (ou soma de quadrados) das duas variáveis e a variação (soma de quadrados) de . Então segue:μ2 X∗
A partir da qual você estima , como @amoeba mostrou, e executa a rotação.cosθ
fonte
Se eu interpreto as coisas corretamente, você quer dizer que o primeiro componente do princípio (valor próprio) explica a maior parte da variação nos dados. Isso pode acontecer quando seu método de compactação é linear. No entanto, pode haver dependências não lineares no espaço de recursos.
Aqui está um exemplo de scikit em que eles pesquisam em grade para encontrar o número ideal de componentes principais a serem mantidos (hiperparâmetro) usando o PCA. Finalmente, eles aplicam a regressão logística no espaço dimensional inferior: http://scikit-learn.org/stable/auto_examples/plot_digits_pipe.html#example-plot-digits-pipe-py
Protip: os codificadores automáticos não têm uma solução de formulário fechado (afaik); portanto, se o seu contexto estiver transmitindo dados, isso significa que você pode atualizar continuamente seu codificador automático (representação compactada) e, assim, compensar itens como desvio de conceito. Com o pca, você precisa treinar novamente o modo em lote de vez em quando à medida que novos dados são recebidos.
Quanto a dar a alguns recursos mais "peso", consulte a regularização (eu começaria a partir das normas https://en.wikipedia.org/wiki/Norm_(mathematics) ). Você também pode se surpreender com a regressão logística semelhante ao perceptron.
fonte