Eu tenho uma grande matriz esparsa de usuários e itens que eles gostam (na ordem de 1 milhão de usuários e 100 mil itens, com um nível muito baixo de escassez). Estou explorando maneiras pelas quais eu poderia executar a pesquisa kNN nele. Dado o tamanho do meu conjunto de dados e alguns testes iniciais que realizei, suponho que o método que utilizarei precisará ser paralelo ou distribuído. Portanto, estou considerando duas classes de soluções possíveis: uma que está disponível (ou implementável de uma maneira razoavelmente fácil) em uma única máquina multicore, a outra em um cluster Spark, ou seja, como um programa MapReduce. Aqui estão três idéias gerais que eu considerei:
- Assumindo uma métrica de similaridade de cosseno, execute a multiplicação completa da matriz normalizada por sua transposição (implementada como uma soma de produtos externos)
- Usando hash sensível à localidade (LSH)
- Reduzindo primeiro a dimensionalidade do problema com um PCA
Gostaria de receber quaisquer pensamentos ou conselhos sobre possíveis outras maneiras pelas quais eu poderia resolver esse problema.