Erstellen wir die Funktion "Personen, die dieses Produkt gekauft haben, haben auch dieses Produkt gekauft", die häufig bei Amazon angezeigt wird.
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.
Redis ist KVS Verwenden Sie redis SortedSet.
MacPorts:http://blog.katsuma.tv/2010/03/start_redis.html HomeBrew:http://qiita.com/items/3d2a2fc683ae19302071
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.)
Eine Liste, die automatisch (auf der Redis-Seite) sortiert wird, wenn Daten eingegeben werden
Es kann implementiert werden, wenn die Ähnlichkeit jedes Produkts mit Produkt X als Wert erhalten werden kann.
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
# -*- 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']
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.
Mit zunehmender Anzahl von Kunden und Produkten explodiert der Rechenaufwand und stirbt ab
Lassen Sie uns einen Translokationsindex von Amazon erstellen http://www.cs.umd.edu/~samir/498/Amazon-Recommendations.pdf
Recommended Posts