Filtrado colaborativo: similitud no personalizada de elemento a elemento

Estoy tratando de calcular la similitud de artículo a artículo en la línea de "Los clientes que vieron / compraron X también vieron / compraron Y y Z". Todos los ejemplos y referencias que he visto son para calcular la similitud de elementos para elementos clasificados, para encontrar similitudes entre usuarios o para encontrar elementos recomendados basados en el historial de los usuarios actuales. Me gustaría comenzar con un enfoque no dirigido antes de tener en cuenta las preferencias de los usuarios actuales.

Mirando a laLibro blanco de recomendaciones de Amazon.com, usan la siguiente lógica para la similitud elemento-elemento fuera de línea:

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

Si entiendo correctamente, cuando estemos en "Calcular similitud entre I1 e I2", tengo una lista de artículos (I2) comprados junto con un solo valor I1 (el bucle externo).

¿Cómo se realiza este cálculo?

Otra idea es pensar demasiado en esto y hacerlo más difícil de lo que necesito. ¿Sería suficiente hacer una consulta top n sobre el recuento de I2 comprado junto con I1?

También agradezco las sugerencias sobre si este enfoque es correcto o no. Mi base de datos de productos tiene aproximadamente 150k artículos en cualquier momento. Dado que la mayor parte del material de lectura que he visto muestra similitud de elementos de usuario o incluso similitud de usuario-usuario, ¿debería buscar esa ruta en su lugar?

He trabajado con algoritmos de similitud en el pasado, pero siempre han involucrado un rango o una puntuación. Creo que la única forma en que esto funcionaría sería construir una matriz de cliente-producto con un puntaje de 0/1 para no comprado / comprado. Dado el historial de compras y el tamaño del artículo, esto podría ser realmente grande.

editar: aunque enumeré python como una etiqueta, preferiría mantener la lógica dentro de un db, preferiblemente usando Oracle PL / SQL.

Respuestas a la pregunta(3)

Su respuesta a la pregunta