Eu estava usando a Análise Discriminante Linear (LDA) da scikit-learn
biblioteca de aprendizado de máquina (Python) para redução de dimensionalidade e fiquei um pouco curioso sobre os resultados. Gostaria de saber agora o que o LDA scikit-learn
está fazendo para que os resultados pareçam diferentes, por exemplo, de uma abordagem manual ou de um LDA feito em R. Seria ótimo se alguém pudesse me dar algumas idéias aqui.
O que é mais preocupante é que scikit-plot
mostra uma correlação entre as duas variáveis em que deve haver uma correlação 0.
Para um teste, usei o conjunto de dados Iris e os dois primeiros discriminantes lineares ficaram assim:
IMG-1. LDA via scikit-learn
Isso é basicamente consistente com os resultados que encontrei na documentação do scikit-learn aqui.
Agora, passei pelo LDA passo a passo e recebi uma projeção diferente. Tentei abordagens diferentes para descobrir o que estava acontecendo:
IMG-2. LDA em dados brutos (sem centralização, sem padronização)
E aqui estaria a abordagem passo a passo se eu padronizasse (normalização do escore z; variação da unidade) primeiro os dados. Fiz a mesma coisa apenas com a centralização da média, o que deve levar à mesma imagem de projeção relativa (e com efeito).
IMG-3 LDA passo a passo após centralização média ou padronização
IMG-4. LDA em R (configurações padrão)
O LDA no IMG-3, onde eu centralizei os dados (qual seria a abordagem preferida) também parece exatamente o mesmo que encontrei em um Post por alguém que fez o LDA no R
Código de referência
Eu não queria colar todo o código aqui, mas o enviei como um bloco de notas IPython aqui, dividido nas várias etapas que usei (veja abaixo) para a projeção do LDA.
- Etapa 1: Computando os vetores médios d-dimensionais
Etapa 2: Computando as matrizes de dispersão
2.1 A matriz de dispersão dentro da classe é calculada pela seguinte equação:S W = c Σ i = 1 S i = c Σ
2.2 A matriz de dispersão entre classes é calculada pela seguinte equação: onde é a média geral.S B = c ∑ i = 1 n i ( m i - m ) ( m i - m ) T m
Etapa 3. Resolvendo o problema generalizado de autovalor para a matriz
3.1 Classificando os vetores próprios, diminuindo os valores próprios
3.2 Escolhendo k vetores próprios com os maiores valores próprios. Combinando os dois vetores próprios com os valores próprios mais altos para construir nossa matriz de vetores próprios dimensionalW
Etapa 5: Transformando as amostras no novo subespaço
fonte
Respostas:
Atualização: graças a esta discussão,
scikit-learn
foi atualizada e funciona corretamente agora. Seu código fonte LDA pode ser encontrado aqui . O problema original ocorreu devido a um bug menor (consulte esta discussão no github ) e minha resposta não estava apontando corretamente (desculpas por qualquer confusão causada). Como tudo isso não importa mais (o bug foi corrigido), editei minha resposta para focar em como o LDA pode ser resolvido via SVD, que é o algoritmo padrãoscikit-learn
.Depois de definir matrizes de dispersão dentro e entre classes e , o cálculo padrão do LDA, como apontado em sua pergunta, é obter vetores próprios de como eixos discriminantes ( veja, por exemplo, aqui ). Os mesmos eixos, no entanto, podem ser calculados de uma maneira ligeiramente diferente, explorando uma matriz de branqueamento:ΣW ΣB Σ- 1WΣB
Calcule . Esta é uma transformação de clareamento em relação à covariância dentro da classe (veja minha resposta vinculada para obter detalhes).Σ- 1 / 2W
Observe que se você tiver decomposição própria , . Observe também que é possível calcular o mesmo fazendo o SVD dos dados agrupados dentro da classe: .ΣW= U S U⊤ Σ- 1 / 2W= U S- 1 / 2você⊤ XW= U L V⊤⇒ Σ- 1 / 2W= U L- 1você⊤
Encontre vetores próprios de , vamos chamá-los de .Σ- 1 / 2WΣBΣ- 1 / 2W UMA∗
Novamente, observe que é possível computá-lo fazendo SVD de dados entre classes , transformados com , ou seja, dados entre classes embranquecidos em relação à classe dentro covariância.XB Σ- 1 / 2W
Os eixos discriminantes serão dados por , isto é, pelos eixos principais dos dados transformados , transformados novamente .UMA Σ- 1 / 2WUMA∗
De fato, se é um vetor próprio da matriz acima, então e multiplicando da esquerda por e definindo , obtemos imediatamente :Σ - 1 / 2 W Σuma∗
Em resumo, o LDA equivale a embranquecer a matriz de médias de classe em relação à covariância dentro da classe, executando o PCA nos meios de classe e transformando os eixos principais resultantes no espaço original (não branqueado).
Isso é apontado, por exemplo, em Os elementos do aprendizado estatístico , seção 4.3.3. Em
scikit-learn
esta é a maneira padrão para calcular LDA porque SVD de uma matriz de dados é numericamente mais estável do que eigen-decomposição da sua matriz de covariância.Observe que é possível usar qualquer transformação de clareamento em vez de e tudo continuará funcionando exatamente da mesma maneira. Em é usado (em vez de ) e funciona muito bem (ao contrário do que foi originalmente escrito na minha resposta). L - 1 L ⊤ L L - 1 L ⊤Σ−1/2W L−1U⊤ UL−1U⊤
scikit-learn
fonte
Apenas para encerrar esta questão, o problema discutido com o LDA foi corrigido no scikit-learn 0.15.2 .
fonte