J'ai essayé de mettre en œuvre le co-filtrage (recommandation) avec redis et python

Que faire cette fois

Créons la fonction "Les personnes qui ont acheté ce produit ont également acheté ce produit" qui apparaît souvent sur Amazon.

スクリーンショット 2015-04-23 5.53.32.png

Technologie des éléments et méthode de mise en œuvre

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».

J'utilise redis et python.

redis est KVS Utilisez redis SortedSet.

procédure d'installation de redis

MacPorts:http://blog.katsuma.tv/2010/03/start_redis.html HomeBrew:http://qiita.com/items/3d2a2fc683ae19302071

Raisons d'utiliser redis

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)

Qu'est-ce que l'ensemble trié?

Une liste qui trie automatiquement (sur le côté redis) lorsque les données sont saisies

スクリーンショット 2015-04-23 4.26.57.png

Mise en place du co-filtrage

Il peut être mis en œuvre si la similitude de chaque produit avec le produit X peut être obtenue en tant que valeur.

スクリーンショット 2015-04-23 4.29.36.png

Formule de calcul pour la similitude

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

スクリーンショット 2015-04-23 4.36.07.png

Exemple de données utilisées cette fois

スクリーンショット 2015-04-23 5.23.01.png

la mise en oeuvre

# -*- 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']

Voyons la valeur de redis

r.png

Allons vérifier

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.

スクリーンショット 2015-04-23 5.21.23.png

Problèmes avec cette méthode

Au fur et à mesure que le nombre de clients et de produits augmente, la quantité de calcul explose et meurt

Solution

Faisons un index de translocation par Amazon http://www.cs.umd.edu/~samir/498/Amazon-Recommendations.pdf

Recommended Posts

J'ai essayé de mettre en œuvre le co-filtrage (recommandation) avec redis et python
[Recommandation] Filtrage basé sur le contenu et filtrage coopératif
J'ai installé et utilisé Numba avec Python3.5
J'ai essayé la différenciation jacobienne et partielle avec python
J'ai essayé la synthèse de fonctions et le curry avec python
Co-filtrage avec PySpark
Filtrage coordonné avec analyse des composants principaux et clustering K-means
Je veux gérer l'optimisation avec python et cplex
Co-filtrage basé sur l'utilisateur avec python
J'ai essayé fp-growth avec python
Programmation avec Python et Tkinter
Chiffrement et déchiffrement avec Python
Python et matériel - Utilisation de RS232C avec Python -
J'ai fait un blackjack avec du python!
Implémentation de SMO avec Python + NumPy
J'ai comparé Java et Python!
J'ai essayé d'implémenter VQE avec Blueqat
python avec pyenv et venv
J'ai essayé gRPC avec Python
J'ai essayé de gratter avec du python
J'ai fait un blackjack avec Python.
J'ai créé wordcloud avec Python.
Fonctionne avec Python et R
J'ai essayé la gestion du suivi avec l'API Twitter et Python (facile)
J'ai essayé de créer une interface graphique à trois yeux côte à côte avec Python et Tkinter
Cette fois, j'ai appris python III et IV avec Prorate
Communiquez avec FX-5204PS avec Python et PyUSB
Gérez les clés Base91 avec python + redis.
Briller la vie avec Python et OpenCV
J'ai comparé la vitesse de Hash avec Topaz, Ruby et Python
J'ai fait un circuit simple avec Python (AND, OR, NOR, etc.)
Robot fonctionnant avec Arduino et python
Installez Python 2.7.9 et Python 3.4.x avec pip.
Réseau neuronal avec OpenCV 3 et Python 3
Modulation et démodulation AM avec python
Scraping avec Node, Ruby et Python
Téléchargement de fichiers implémenté avec Python + Bottle
pyenv-vertualenv n'installe pas correctement la série python3
Grattage avec Python, Selenium et Chromedriver
Je veux résoudre APG4b avec Python (seulement 4.01 et 4.04 au chapitre 4)
J'ai essayé webScraping avec python.
Grattage avec Python et belle soupe
[Python] J'ai essayé d'implémenter un échantillonnage de Gibbs marginalisé
J'ai ajouté Maki Horikita et Kanna Hashimoto et divisé par 2 avec python
J'ai fait une loterie avec Python.
J'ai créé un formulaire de tweet Nyanko avec Python, Flask et Heroku
J'ai essayé d'implémenter Attention Seq2Seq avec PyTorch
J'ai envoyé un SMS avec Python
Encodage et décodage JSON avec python
Recommandation de résolution des problèmes d'AtCoder avec python (20200517-0523)
Introduction à Hadoop et MapReduce avec Python
Lire et écrire NetCDF avec Python
J'ai aimé le tweet avec python. ..
J'ai essayé de détecter facilement les points de repère du visage avec python et dlib
Lire et écrire du CSV avec Python
Intégration multiple avec Python et Sympy
"Processus Gauss et apprentissage automatique" Régression de processus Gauss implémentée uniquement avec Python numpy