[PYTHON] Empfehlungsoptimierung

1. Empfehlung

In Empfehlungen erstellen wir häufig ein Modell durch maschinelles Lernen basierend auf Trainingsdaten, geben eine Vorhersagewertung für Benutzer x Elemente an und zeigen das Element TOP? Mit einer hohen Vorhersagewertung für jeden Benutzer. Dieses Verfahren hat jedoch das Problem, dass die Vorhersagewertung beliebter Artikel hoch und die Vorhersage unbeliebter Artikel gering ist, sodass nur beliebte Artikel beworben werden und unbeliebte Artikel nicht beworben werden. Werbeseiten müssen häufig für unpopuläre Artikel werben, um einen Lebenslauf zu erhalten.

2. Optimierung

Dies kann behoben werden, indem die Anzahl der Benutzer begrenzt wird, die Artikel für Artikel werben. Sie können beispielsweise die maximale Anzahl von Benutzern festlegen, die für beliebte Artikel werben sollen, und die minimale Anzahl von Benutzern, die für beliebte Artikel werben sollen.

3. Beispiel

Die Anzahl der Benutzer beträgt 30 und die Anzahl der Elemente beträgt 20. Betrachten Sie 5 Elemente, die für jeden Benutzer empfohlen werden.

Es werben jedoch nur 10 Personen oder weniger für alle Artikel Die Artikel 0, 1 und 2 sind beliebte Artikel, sodass nur 3 oder weniger Personen Werbung schalten Die Artikel 18 und 19 sind unbeliebt. Nehmen wir also an, Sie möchten mehr als 7 Personen bewerben.

Weniger als $ Scores_ {ui} $: Benutzer u, die vorhergesagte Punktzahl für Element i.

Wenn die obigen Bedingungen in Formeln umgewandelt werden

Variable

$ choice_ {ui} $: Gibt an, ob Artikel i für Benutzer u (1 oder 0) beworben werden soll.

Zielfunktion

$ \sum_{u} \sum_{i} scores_{ui} * choices_{ui} $ Um zu maximieren.

Einschränkungen

  1. \sum_{i} choices_{ui} <= 5 (\forall u)
  2. \sum_{u} choices_{ui} <= 10 (\forall i)
  3. \sum_{u} choices_{ui} <= 3 (i=0,1)
  4. \sum_{u} choices_{ui} >= 9 (i=18,19)

Es kann durch die lineare Programmiermethode gelöst werden.

Wenn es eine reelle Zahl mit Zellstoff ist

USER =30
ITEM = 20
Users = list(range(0,USER))
Items = list(range(0,ITEM))

prob = pulp.LpProblem("test",pulp.LpMaximize)

#Deklaration von Variablen
choices = pulp.LpVariable.dicts("Choice",(Users,Items) , 0, 1, pulp.LpInteger)

#Zielfunktion
prob += pulp.lpSum([scores[u][i] * choices[u][i] for u in Users for i in Items ])

#Einschränkungen
#1. $\sum_{i} choice_{ui} <= 5 (\forall u)$
for u in Users:
    prob += pulp.lpSum([choices[u][i] for i in Items]) <=5

#2. $\sum_{u} choice_{ui} <= 10 (\forall i)$
for i in Items:
    prob += pulp.lpSum([choices[u][i] for u in Users]) <= 10

#3. $\sum_{u} choice_{ui} <= 3 (i=0,1)$
for i in [0,1]:
    prob += pulp.lpSum([choices[u][i] for u in Users]) <= 3

#4. $\sum_{u} choice_{ui} >= 9 (i=18,19)$
for i in [18,19]:
    prob += pulp.lpSum([choices[u][i] for u in Users]) >= 9

status = prob.solve()

Kann mit gelöst werden.

Jetzt sind die Punktzahlen wie unten gezeigt. Die Punkte 1 und 2 sind beliebte Gegenstände. Erhöhen Sie also die Punktzahl, und die Punktzahlen 18 und 19 sind unpopuläre Gegenstände. Verringern Sie also die Punktzahl.

np.random.seed(10)
scores = np.random.rand(USER, ITEM)
scores[:,0] += 0.3
scores[:,1] += 0.3
scores[:,18] -= 0.3
scores[:,19] -= 0.3
scores = np.clip(scores, 0, 1)

Die Beispielquelle ist https://github.com/tohmae/pulp_sample/blob/master/score_optimize.py Es ist in.

Wenn Sie die Optimierung mit der obigen Punktzahl durchführen und keine Einschränkungen 2, 3 und 4 bestehen

Item0 Item1 Item2 Item3 Item4 Item5 Item6 Item7 Item8 Item9 Item10 Item11 Item12 Item13 Item14 Item15 Item16 Item17 Item18 Item19
User0 1 0 0 1 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0
User1 1 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0
User2 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0
User3 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0
User4 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
User5 1 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0
User6 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1
User7 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
User8 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0
User9 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0
User10 1 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0
User11 0 1 0 0 1 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0
User12 0 0 1 0 0 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0
User13 0 0 0 1 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0
User14 0 0 1 1 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0
User15 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0
User16 1 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0
User17 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0
User18 0 0 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0
User19 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0
User20 0 1 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0
User21 0 0 0 0 1 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0
User22 1 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0
User23 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0
User24 0 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0 1 0 0 0
User25 0 0 0 0 0 1 0 0 0 0 1 0 0 1 1 0 0 1 0 0
User26 0 1 1 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0
User27 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 1 0 0 0
User28 0 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 1 0 0 0
User29 1 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0

Wenn die Randbedingungen 2, 3 und 4 eingegeben werden

Item0 Item1 Item2 Item3 Item4 Item5 Item6 Item7 Item8 Item9 Item10 Item11 Item12 Item13 Item14 Item15 Item16 Item17 Item18 Item19
User0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 1 1
User1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 1
User2 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 1 0 1 0
User3 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 1 0
User4 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0
User5 0 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0
User6 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1
User7 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0
User8 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0
User9 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 1 1 0 0
User10 0 0 0 1 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0
User11 0 0 0 0 1 0 0 1 0 0 0 1 1 0 0 0 0 0 0 1
User12 0 0 0 0 0 1 0 0 1 0 0 0 1 0 1 0 0 0 1 0
User13 0 0 0 1 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0
User14 0 0 1 1 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0
User15 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0
User16 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 1
User17 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 1 1 0
User18 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 1
User19 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0
User20 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 1 0 0
User21 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 0 0 0 1
User22 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0
User23 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0
User24 0 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0 1 0 0 0
User25 0 0 0 0 0 1 0 0 0 0 1 0 0 1 1 0 0 1 0 0
User26 0 0 1 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1
User27 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 0
User28 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 1 0 1 0
User29 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1

Es ist ersichtlich, dass die Anzahl der Anzeigen für die Elemente 1 und 2 abnimmt und die Anzahl der Anzeigen für die Elemente 18 und 19 zunimmt, wenn die Einschränkungen 2, 3 und 4 hinzugefügt werden.

Wir konnten die Empfehlungen mit der linearen Programmiermethode optimieren.

Recommended Posts

Empfehlungsoptimierung
Mathematisches Optimierungs-Rollenspiel
Python in der Optimierung
Simulation der Gebotsoptimierung
Empfehlung der Poesie
Verwenden Sie die Kombinationsoptimierung
Arch Linux Empfehlung