Em primeiro lugar, a redução de dimensionalidade é usada quando você tem muitas dimensões covariadas e deseja reduzir o tamanho do problema girando os pontos de dados em uma nova base ortogonal e utilizando apenas eixos com maior variação. Com 8 variáveis (colunas), seu espaço já é de baixa dimensão; é improvável que reduzir ainda mais o número de variáveis resolva problemas técnicos com o tamanho da memória, mas pode afetar muito a qualidade do conjunto de dados. No seu caso concreto, é mais promissor dar uma olhada no aprendizado on - linemétodos. Grosso modo, em vez de trabalhar com todo o conjunto de dados, esses métodos usam uma pequena parte deles (geralmente chamados de "mini-lotes") de cada vez e constroem um modelo de forma incremental. (Eu pessoalmente gosto de interpretar a palavra "online" como uma referência a uma fonte infinitamente longa de dados da Internet, como um feed do Twitter, onde você simplesmente não pode carregar todo o conjunto de dados de uma só vez).
Mas e se você realmente quisesse aplicar a técnica de redução de dimensionalidade, como o PCA, em um conjunto de dados que não se encaixa na memória? Normalmente, um conjunto de dados é representado como uma matriz de dados X de tamanho n x m , em que n é o número de observações (linhas) e m é um número de variáveis (colunas). Normalmente, os problemas de memória vêm de apenas um desses dois números.
Muitas observações (n >> m)
Quando você tem muitas observações , mas o número de variáveis é pequeno a moderado, é possível construir a matriz de covariância incrementalmente . De fato, o PCA típico consiste em construir uma matriz de covariância de tamanho m x m e aplicar decomposição de valor singular a ela. Com m = 1000 variáveis do tipo float64, uma matriz de covariância tem tamanho 1000 * 1000 * 8 ~ 8Mb, que cabe facilmente na memória e pode ser usada com SVD. Portanto, você só precisa criar a matriz de covariância sem carregar um conjunto de dados inteiro na memória - tarefa bastante tratável .
Como alternativa, você pode selecionar uma pequena amostra representativa do seu conjunto de dados e aproximar a matriz de covariância . Essa matriz terá todas as mesmas propriedades que o normal, apenas um pouco menos precisa.
Variáveis demais (n << m)
Por outro lado, às vezes, quando você tem muitas variáveis , a própria matriz de covariância não se encaixa na memória. Por exemplo, se você trabalha com imagens de 640x480, todas as observações têm 640 * 480 = 307200 variáveis, o que resulta em uma matriz de covariância de 703Gb! Definitivamente, não é isso que você gostaria de manter na memória do seu computador ou mesmo na memória do seu cluster. Portanto, precisamos reduzir as dimensões sem criar uma matriz de covariância.
Meu método favorito para fazer isso é a projeção aleatória . Em resumo, se você tiver um conjunto de dados X de tamanho n x m , poderá multiplicá-lo por uma matriz aleatória esparsa R de tamanho m x k (com k << m ) e obter uma nova matriz X ' de tamanho muito menor n x k com aproximadamente as mesmas propriedades que a original. Por que isso funciona? Bem, você deve saber que o PCA visa encontrar um conjunto de eixos ortogonais (componentes principais) e projetar seus dados nos primeiros kdeles. Acontece que vetores aleatórios esparsos são quase ortogonais e, portanto, também podem ser usados como uma nova base.
E, é claro, você não precisa multiplicar todo o conjunto de dados X por R - você pode converter todas as observações x na nova base separadamente ou em mini-lotes.
Também existe um algoritmo similar chamado Random SVD . Não tenho nenhuma experiência real com ele, mas você pode encontrar um exemplo de código com explicações aqui .
Como resultado, aqui está uma pequena lista de verificação para redução da dimensionalidade de grandes conjuntos de dados:
- Se você não possui muitas dimensões (variáveis), basta usar algoritmos de aprendizado online.
- Se houver muitas observações, mas um número moderado de variáveis (a matriz de covariância se encaixa na memória), construa a matriz de forma incremental e use SVD normal.
- Se o número de variáveis for muito alto, use algoritmos incrementais.