Amplificando um hash sensível à localidade


10

Estou tentando criar um hash sensível à localidade do cosseno, para poder encontrar pares de itens similares candidatos sem precisar comparar todos os pares possíveis. Eu tenho basicamente trabalhando, mas a maioria dos pares nos meus dados parece ter semelhança de cosseno no intervalo de -0.2 a +0.2, então estou tentando cortá-la com bastante precisão e escolher coisas com a similaridade de cosseno 0.1 e acima.

Estive lendo o capítulo 3. Mineração de conjuntos de dados maciços. Isso fala sobre como aumentar a precisão da seleção de pares de candidatos ampliando uma família sensível à localidade. Acho que entendo a explicação matemática, mas estou lutando para ver como implemento isso na prática.

O que tenho até agora é o seguinte

  1. Eu digo 1000 filmes, cada um com classificações de uma seleção de 1 milhão de usuários. Cada filme é representado por um vetor esparso de pontuações de usuários (número da linha = ID do usuário, valor = pontuação do usuário)
  2. Eu construo N vetores aleatórios. O comprimento do vetor corresponde ao comprimento dos vetores do filme (ou seja, o número de usuários). Os valores do vetor são +1 ou -1. Na verdade, eu codifico esses vetores como binários para economizar espaço, com +1 mapeado para 1 e -1 mapeado para 0
  3. Eu construo vetores de esboço para cada filme, pegando o produto escalar do filme e cada um dos N vetores aleatórios (ou melhor, se eu criar uma matriz R colocando os N vetores aleatórios horizontalmente e colocando-os em cima um do outro, em seguida, o esboço para o filme m é R ​​* m), pegando o sinal de cada elemento no vetor resultante, então termino com um vetor de esboço para cada filme de + 1s e -1s, que novamente codifico como binário. Cada vetor tem comprimento N bits.
  4. Em seguida, procuro esboços semelhantes, fazendo o seguinte
    1. Dividi o vetor de esboço em b bandas de bits r
    2. Cada banda de r bits é um número. Combino esse número com o número da banda e adiciono o filme a um hash bucket abaixo desse número. Cada filme pode ser adicionado a mais de um balde.
    3. Então eu olho em cada balde. Todos os filmes que estão no mesmo bloco são pares de candidatos.

Comparando isso com 3.6.3 de mmds, minha etapa AND é quando olho para bandas de bits r - um par de filmes passa a etapa AND se os bits r tiverem o mesmo valor. Minha etapa OR ocorre nos intervalos: os filmes são pares de candidatos se ambos estiverem em um dos intervalos.

O livro sugere que eu posso "amplificar" meus resultados adicionando mais etapas AND e OR, mas não sei como fazer isso praticamente, pois a explicação do processo de construção para outras camadas é em termos de verificar a igualdade aos pares em vez de chegando com números de balde.

Alguém pode me ajudar a entender como fazer isso?

Respostas:


4

Eu acho que resolvi algo. Basicamente, estou procurando uma abordagem que funcione em um ambiente de tipo mapa / redução e acho que essa abordagem faz isso.

Assim,

  • suponha que eu tenha b faixas de r linhas e queira adicionar outro estágio AND, digamos outro c ANDs.
  • então, em vez de bits b * r, preciso de hashes de bits b * r * c
  • e eu executo meu procedimento anterior c vezes, sempre em bits b * r
  • Se x e y forem considerados um par candidato por qualquer um desses procedimentos, ele emitirá um par de valores-chave ((x, y), 1), com a tupla de IDs (x, y) como chave e o valor 1
  • No final dos procedimentos c, agrupo esses pares por chave e soma
  • Qualquer par (x, y) com uma soma igual a c era um par candidato em cada uma das rodadas c, e também é um par candidato de todo o procedimento.

Portanto, agora tenho uma solução viável e tudo o que preciso fazer é descobrir se o uso de três etapas como essa me ajudará a obter um resultado melhor com menos bits de hash gerais ou melhor desempenho geral ...


0

h(x,v)={0 0E se sgn(xv)<0 01 1outro
vh(x,Eu)=(h(x,vEu+1 1),...,h(x,vEu+r))h(x,j)=f(h(x,rj),j)
h(x,y)={1 1E se h(x,j)=h(y,j) para qualquer j[0 0,b)0 0outro
h(x,y)h^:SSSh(x,j)jjyv
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.