Créons la fonction "Les personnes qui ont acheté ce produit ont également acheté ce produit" qui apparaît souvent sur Amazon.
Une fonction généralement appelée fonction de recommandation (fonction recommandée). Il existe deux manières principales de mettre en œuvre les recommandations: le "filtrage coopératif" et le "filtrage basé sur le contenu".
Pour le filtrage basé sur le contenu, par exemple, lors de la mise en œuvre du produit recommandé "Old Man and the Sea (Hemming Way)" dans l'exemple ci-dessus sur la base du contenu, la balise d'attribut est ajoutée au produit à l'avance. Par exemple, si vous tapez une balise avec l'attribut d'auteur, le livre écrit par le même Hemmingway sera affiché comme une recommandation.
Le co-filtrage affiche les produits achetés par d'autres personnes qui ont acheté ce produit sous forme de recommandations.
Cette fois, nous mettrons en œuvre le «filtrage coopératif».
redis est KVS Utilisez redis SortedSet.
MacPorts:http://blog.katsuma.tv/2010/03/start_redis.html HomeBrew:http://qiita.com/items/3d2a2fc683ae19302071
Il n'est pas réaliste de calculer les produits recommandés à chaque fois du point de vue du montant du calcul, et il était nécessaire de calculer à l'avance et de ** l'enregistrer sous une forme facile à retirer **. (Si vous pouvez facilement récupérer et enregistrer, vous pouvez utiliser autre chose que Redis)
Une liste qui trie automatiquement (sur le côté redis) lorsque les données sont saisies
Il peut être mis en œuvre si la similitude de chaque produit avec le produit X peut être obtenue en tant que valeur.
Il y en a beaucoup, mais il est courant d'utiliser l'index Jaccard. Dans les exemples de données ci-dessous, la formule du produit A est 1/5. 1 signifie qu'un client a acheté à la fois le produit X et le produit A. Autrement dit, l'ensemble de produits 5 est le nombre total de clients qui ont acheté le produit X ou le produit A. Autrement dit, l'ensemble de la somme
# -*- coding: utf-8 -*-
from __future__ import absolute_import
from __future__ import unicode_literals
def jaccard(e1, e2):
"""
Calculer l'indice Jackard
:param e1: list of int
:param e2: list of int
:rtype: float
"""
set_e1 = set(e1)
set_e2 = set(e2)
return float(len(set_e1 & set_e2)) / float(len(set_e1 | set_e2))
def get_key(k):
return 'JACCARD:PRODUCT:{}'.format(k)
#Le numéro client ayant acheté le produit X est 1,3,5
product_x = [1, 3, 5]
product_a = [2, 4, 5]
product_b = [1, 2, 3]
product_c = [2, 3, 4, 7]
product_d = [3]
product_e = [4, 6, 7]
#Données du produit
products = {
'X': product_x,
'A': product_a,
'B': product_b,
'C': product_c,
'D': product_d,
'E': product_e,
}
# redis
import redis
r = redis.Redis(host='localhost', port=6379, db=10)
#Calculez l'indice Jackard et enregistrez-le dans l'ensemble trié Redis pour chaque produit
for key in products:
base_customers = products[key]
for key2 in products:
if key == key2:
continue
target_customers = products[key2]
#Calculer l'indice Jackard
j = jaccard(base_customers, target_customers)
#Enregistrer dans un ensemble trié Redis
r.zadd(get_key(key), key2, j)
#Exemple 1 La personne qui a acheté le produit X a également acheté un tel produit.
print r.zrevrange(get_key('X'), 0, 2)
# > ['B', 'D', 'A']
#Exemple 2 La personne qui a acheté le produit E a également acheté un tel produit.
print r.zrevrange(get_key('E'), 0, 2)
# > ['C', 'A', 'X']
Les produits B, D, A sont recommandés pour ceux qui ont acheté le produit X. Lorsqu'elle est cochée, les similitudes sont respectivement de 0,5, 0,33 et 0,2, il semble donc qu'elles soient correctement recommandées.
Au fur et à mesure que le nombre de clients et de produits augmente, la quantité de calcul explose et meurt
Faisons un index de translocation par Amazon http://www.cs.umd.edu/~samir/498/Amazon-Recommendations.pdf
Recommended Posts