Ich habe beschlossen, ein Empfehlungssystem bei Hackason einzurichten, also notiere es mir als Memorandum.
Erstellen Sie ein System, das Snacks empfiehlt, die zu Ihnen passen. Ich wollte es zu einem Modell für maschinelles Lernen machen, entschied mich jedoch für die kooperative Filterung, weil ich nicht genug Wissen und Zeit hatte.
Erstellen Sie ein Empfehlungssystem mit Python (benutzerbasierte kooperative Filterung) Hinweise zur Implementierung einer einfachen Co-Filterung in Python Aufbau eines Empfehlungssystems mit kooperativer Filterung
Mit einem Wort: Co-Filterung (Empfehlungssystem) ** "Für Sie empfohlen" "Personen, die dieses Produkt gekauft haben, haben dieses Produkt auch gekauft" ** Das ist es. Sie kennen Amazon und Youtube.
Es ist grob in zwei Methoden unterteilt: Benutzerbasis und Artikel- (Produkt-) Basis. Schätzungen der benutzerbasierten Hervorhebungsfilterung ** Zielbenutzerbewertungen (unbekannt) ** aus ** bekannten Bewertungen anderer Benutzer **.
Kreuztabelle, euklidischer Abstand, Pearson-Korrelationskoeffizient,
Ähnlichkeit ist definiert als ** "hohe (niedrige) Bewertung des gleichen Produkts hat hohe Ähnlichkeit" **. Berechnen Sie die Ähnlichkeit anhand des Bewertungswerts für das Produkt jedes Benutzers
・ Je ähnlicher, desto kleiner ist der Wert der euklidischen Distanz. ・ Nehmen Sie die inverse Zahl, damit ähnliche höhere Punktzahlen erhalten ・ Wenn die Ähnlichkeit maximal ist, beträgt der euklidische Abstand 0, also addieren Sie 1
score= \frac{1}{(1+Euklidische Entfernung)}
・ Punktzahl gibt einen Wert von 0 bis 1 zurück. Je größer die Punktzahl, desto höher die Ähnlichkeit.
Eine ausführliche Erläuterung finden Sie unter Benutzerbasierte Co-Filterung unter Erstellen eines Empfehlungssystems mithilfe von Co-Filterung.
** (1) Extrahieren Sie Personen mit einer Ziel-Likörbewertung von 5 aus den Excel-Daten (Beispiel-Snack-Daten). (2) Ermitteln Sie die Ähnlichkeit zwischen der Bewertung von Zielsnacks (nur bekannte Teile) und Probensnackdaten. ③ Prognostizieren Sie den Bewertungswert des unbekannten Zielsnacks aus der Ähnlichkeit **
Die hier verwendeten Daten sind die Bewertung von Sake und die Bewertung von Snacks von 1 bis 5. Da es sich in der Testphase befindet, haben wir nur vier Daten vorbereitet.
Die Daten unbekannter Benutzer sind wie folgt definiert. Suchen Sie den erwarteten Wert für andere Werte für diesen Benutzer.
target_data = [-1, -1, 5.0, -1, 4.0, -1, -1, 1.0, -1, -1, -1] #-1 ist KEIN
Der erwartete Wert der Snackbewertung bei Auswahl von Sake3 wird anhand der Bewertungswerte der Snacks 2 und 5 vorhergesagt.
def findSameSakeList(sheet, userSakeReputation):
SameSakeList = [] #Zweidimensionale Liste von Daten mit einer Flottenbewertung von 5 im Bild
sampleLen = len(sheet.col_values(0))-1
for i in range(sampleLen):
row = sheet.row_values(i+1)
if row[userSakeReputation] == 5:
SameSakeList.append(row)
else:
pass
return SameSakeList
sake_number = 2
wb = xlrd.open_workbook(r'C:\Users\daisuke\Desktop\voyage\testdata.xlsx')
sheet = wb.sheet_by_index(0)
samePersonList = findSameSakeList(sheet, sake_number) #Anwendbar
def get_similarities(samePersonList, target_data):
similarities = []
sampleLen = len(samePersonList)
for j in range(sampleLen):#Zeilennummer des Blattes
distance_list = []
for i, value in enumerate(target_data):
if value == -1:
pass
else:
distance = value - samePersonList[j][i]
distance_list.append(pow(distance, 2))
similarities.append([j, 1/(1+np.sqrt(sum(distance_list)))])
return sorted(similarities, key=lambda s: s[1], reverse=True)
Prognose des Bewertungswertes
gewichteter Bewertungswert des entsprechenden Snacks des Probenbenutzers=Ähnlichkeit × Probenbewertungswert
Danach wird der Gesamtbewertungswert genommen und normalisiert.
Normalisierte Punktzahl= \frac{Gesamtpunktzahl für alle Benutzer des oben erhaltenen gewichteten Bewertungswerts}{Volle Ähnlichkeit der Bewerter}
def predict(samePersonList, similarities):#Berechnen Sie den vorhergesagten Bewertungswert, indem Sie die Ähnlichkeit mit dem Bewertungswert für alle gleichen Personen multiplizieren.
predict_list = []
for index, value in similarities:
samePersonList[index] = [round(i*value,5) for i in samePersonList[index]] #Runde Brüche mit runden
np_samePerson = np.array(samePersonList)
np_samePerson = list(np.mean(np_samePerson, axis=0))
for index, value in enumerate(np_samePerson):
predict_list.append([index, value])
return sorted(predict_list, key= lambda s: s[1], reverse=True)
samePersonList = findSameSakeList(sheet, sake_number ) #Werteliste von 5 Personen mit ausgewählter Alkoholbewertung
similarities = get_similarities(samePersonList, target_data)
ranking = predict(samePersonList, similarities)
pprint.pprint(ranking)
#Rang und Ausgabe normalisiert Socre
#[[2, 1.225635],
#[5, 1.100635],
#[3, 0.850635],
#[1, 0.745125],
#[4, 0.725635],
#[8, 0.620125],
#[9, 0.6103799999999999],
#[7, 0.605505],
#[0, 0.48538],
#[6, 0.125],
#[10, 0.0]]
Sake gibt auch eine erwartete Bewertung
Recommended Posts