Filtragem colaborativa: semelhança item a item não personalizada

Estou tentando calcular a similaridade item a item ao longo das linhas dos "Clientes que visualizaram / compraram X também viram / compraram Y e Z" da Amazon. Todos os exemplos e referências que eu vi são para calcular semelhança de itens para itens classificados, para encontrar semelhança usuário-usuário ou para encontrar itens recomendados com base no histórico dos usuários atuais. Gostaria de começar com uma abordagem não segmentada antes de considerar as preferências dos usuários atuais.

Olhando para oWhite paper sobre recomendações da Amazon.com, eles usam a seguinte lógica para semelhança item-item offline:

For each item in product catalog, I1 
  For each customer C who purchased I1
    For each item I2 purchased by customer C
       Record that a customer purchased I1 and I2
  For each item I2 
    Compute the similarity between I1 and I2

Se eu entendi corretamente, no momento em que estamos em "Computar a similitude entre I1 e I2", tenho uma lista de itens (I2) comprados em conjunto com um único valor I1 (o loop externo).

Como esse cálculo é realizado?

Outra idéia é que eu estou pensando demais nisso e dificultando o que eu preciso - Seria o suficiente para fazer uma consulta top-n na contagem de I2 comprada em conjunto com I1?

Também aprecio sugestões sobre se essa abordagem é correta ou não. O banco de dados do meu produto tem cerca de 150 mil itens a qualquer momento. Como a maior parte do material de leitura que eu vi mostra semelhança de item de usuário ou mesmo similar de usuário-usuário, devo procurar seguir esse caminho.

Eu trabalhei com algoritmos de similaridade no passado, mas eles sempre envolveram uma classificação ou uma pontuação. Eu acho que a única maneira de isso funcionar seria criar uma matriz de cliente-produto com pontuação de 0/1 para não comprado / comprado. Dado o histórico de compras e o tamanho do item, isso pode ficar muito grande.

edit: embora eu tenha listado python como uma tag, eu preferiria manter a lógica dentro de um db, de preferência usando o Oracle PL / SQL.

questionAnswers(3)

yourAnswerToTheQuestion