Ich habe versucht, Co-Filtering (Empfehlung) mit Redis und Python zu implementieren

Was diesmal zu machen

Erstellen wir die Funktion "Personen, die dieses Produkt gekauft haben, haben auch dieses Produkt gekauft", die häufig bei Amazon angezeigt wird.

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

Elementtechnologie und Implementierungsmethode

Eine Funktion, die allgemein als Empfehlungsfunktion (empfohlene Funktion) bezeichnet wird. Es gibt zwei Möglichkeiten, Empfehlungen umzusetzen: "kooperative Filterung" und "inhaltsbasierte Filterung".

Für die inhaltsbasierte Filterung, z. B. wenn das empfohlene Produkt von "Alter Mann und Meer (Hemming Way)" im obigen Beispiel auf Inhaltsbasis implementiert wird, wird das Attribut-Tag dem Produkt im Voraus hinzugefügt. Wenn Sie beispielsweise ein Tag mit dem Attribut "Autor" eingeben, wird das von demselben Hemmingway geschriebene Buch als Empfehlung angezeigt.

Beim Co-Filtern werden Produkte angezeigt, die von anderen gekauften Personen gekauft wurden, die dieses Produkt als Empfehlungen gekauft haben.

Dieses Mal werden wir "kooperative Filterung" implementieren.

Ich benutze Redis und Python.

Redis ist KVS Verwenden Sie redis SortedSet.

Installationsvorgang wiederholen

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

Gründe für die Verwendung von Redis

Es ist nicht realistisch, die empfohlenen Produkte jedes Mal unter dem Gesichtspunkt des Rechenaufwands zu berechnen, und es war erforderlich, sie im Voraus zu berechnen und ** in einer Form aufzuzeichnen, die leicht herauszunehmen ist **. (Wenn Sie leicht abrufen und aufzeichnen können, können Sie etwas anderes als Redis verwenden.)

Was ist ein sortiertes Set?

Eine Liste, die automatisch (auf der Redis-Seite) sortiert wird, wenn Daten eingegeben werden

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

Implementierung der Co-Filterung

Es kann implementiert werden, wenn die Ähnlichkeit jedes Produkts mit Produkt X als Wert erhalten werden kann.

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

Berechnungsformel für Ähnlichkeit

Es gibt viele, aber es ist üblich, den Jaccard-Index zu verwenden. In den folgenden Beispieldaten beträgt die Formel für Produkt A 1/5. 1 bedeutet, dass ein Kunde sowohl Produkt X als auch Produkt A gekauft hat. Das heißt, das Produktset 5 ist die Gesamtzahl der Kunden, die entweder Produkt X oder Produkt A gekauft haben. Das heißt, die Summe gesetzt

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

Diesmal verwendete Beispieldaten

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

Implementierung

# -*- coding: utf-8 -*-
from __future__ import absolute_import
from __future__ import unicode_literals


def jaccard(e1, e2):
    """
Berechnen Sie den Jackard-Index
    :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)

#Die Kunden-ID des gekauften Produkts X lautet 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]

#Produktdaten
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)

#Berechnen Sie den Jackard-Index und notieren Sie ihn für jedes Produkt im Redis Sorted Set
for key in products:
    base_customers = products[key]
    for key2 in products:
        if key == key2:
            continue
        target_customers = products[key2]
        #Jackard Index berechnen
        j = jaccard(base_customers, target_customers)
        #Aufnahme in Redis Sorted Set
        r.zadd(get_key(key), key2, j)

#Beispiel 1 Die Person, die Produkt X gekauft hat, hat auch ein solches Produkt gekauft.
print r.zrevrange(get_key('X'), 0, 2)
# > ['B', 'D', 'A']

#Beispiel 2 Die Person, die Produkt E gekauft hat, hat auch ein solches Produkt gekauft.
print r.zrevrange(get_key('E'), 0, 2)
# > ['C', 'A', 'X']

Lassen Sie uns den Wert in redis sehen

r.png

Lass uns nachsehen

Die Produkte B, D, A werden für diejenigen empfohlen, die Produkt X gekauft haben. Wenn diese Option aktiviert ist, beträgt die Ähnlichkeit 0,5, 0,33 bzw. 0,2, sodass sie anscheinend ordnungsgemäß empfohlen werden.

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

Probleme mit dieser Methode

Mit zunehmender Anzahl von Kunden und Produkten explodiert der Rechenaufwand und stirbt ab

Lösungen

Lassen Sie uns einen Translokationsindex von Amazon erstellen http://www.cs.umd.edu/~samir/498/Amazon-Recommendations.pdf

Recommended Posts

Ich habe versucht, Co-Filtering (Empfehlung) mit Redis und Python zu implementieren
[Empfehlung] Inhaltsbasierte Filterung und kooperative Filterung
Ich habe Numba mit Python3.5 installiert und verwendet
Ich habe Jacobian und teilweise Differenzierung mit Python versucht
Ich habe Funktionssynthese und Curry mit Python versucht
Co-Filterung mit PySpark
Koordinierte Filterung mit Hauptkomponentenanalyse und K-Mittel-Clustering
Ich möchte die Optimierung mit Python und CPlex behandeln
Benutzerbasierte Co-Filterung mit Python
Ich habe fp-Wachstum mit Python versucht
Programmieren mit Python und Tkinter
Ver- und Entschlüsselung mit Python
Python und Hardware-Verwenden von RS232C mit Python-
Ich habe einen Blackjack mit Python gemacht!
SMO mit Python + NumPy implementiert
Ich habe Java und Python verglichen!
Ich habe versucht, VQE mit Blueqat zu implementieren
Python mit Pyenv und Venv
Ich habe gRPC mit Python ausprobiert
Ich habe versucht, mit Python zu kratzen
Ich habe mit Python einen Blackjack gemacht.
Ich habe Wordcloud mit Python gemacht.
Funktioniert mit Python und R.
Ich habe versucht, Follow Management mit Twitter API und Python (einfach)
Ich habe versucht, die Benutzeroberfläche neben Python und Tkinter dreiäugig zu gestalten
Diesmal habe ich mit Prorate Python III und IV gelernt
Kommunizieren Sie mit FX-5204PS mit Python und PyUSB
Behandeln Sie Base91-Schlüssel mit Python + Redis.
Leuchtendes Leben mit Python und OpenCV
Ich habe die Geschwindigkeit von Hash mit Topaz, Ruby und Python verglichen
Ich habe eine einfache Schaltung mit Python gemacht (AND, OR, NOR, etc.)
Roboter läuft mit Arduino und Python
Installieren Sie Python 2.7.9 und Python 3.4.x mit pip.
Neuronales Netzwerk mit OpenCV 3 und Python 3
AM-Modulation und Demodulation mit Python
Scraping mit Node, Ruby und Python
Implementierter Dateidownload mit Python + Bottle
pyenv-vertualenv installiert die Python3-Serie nicht gut
Scraping mit Python, Selen und Chromedriver
Ich möchte APG4b mit Python lösen (nur 4.01 und 4.04 in Kapitel 4)
Ich habe versucht, WebScraping mit Python.
Kratzen mit Python und schöner Suppe
[Python] Ich habe versucht, marginalisiertes Gibbs-Sampling zu implementieren
Ich habe Maki Horikita und Kanna Hashimoto hinzugefügt und durch 2 durch Python geteilt
Ich habe mit Python eine Lotterie gemacht.
Ich habe mit Python, Flask und Heroku ein Nyanko-Tweet-Formular erstellt
Ich habe versucht, Attention Seq2Seq mit PyTorch zu implementieren
Ich habe eine SMS mit Python gesendet
JSON-Codierung und -Decodierung mit Python
Beheben von AtCoder-Problemen Empfehlung mit Python (20200517-0523)
Hadoop-Einführung und MapReduce mit Python
Lesen und Schreiben von NetCDF mit Python
Ich mochte den Tweet mit Python. ..
Ich habe versucht, Gesichtsmarkierungen mit Python und Dlib leicht zu erkennen
Lesen und Schreiben von CSV mit Python
Mehrfachintegration mit Python und Sympy
"Gauß-Prozess und maschinelles Lernen" Gauß-Prozessregression nur mit Python-Numpy implementiert