音楽推薦最適化問題 PuLP

音楽推薦最適化問題

音楽推薦の最適化問題PuLPを用いて解く例題を以下に示します。

この問題では、複数の楽曲を聴取したユーザーが、各楽曲に対して評価を付けたデータを利用して、ユーザーに最適な楽曲の推薦リストを作成します。

推薦リストは、ユーザーが楽曲を聴取するためにかかる時間の合計を最小限に抑えるように決定します。

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# PuLPをインポートする
from pulp import *

# データを定義する
users = ['User 1', 'User 2', 'User 3', 'User 4']
songs = ['Song 1', 'Song 2', 'Song 3', 'Song 4']
ratings = {
('User 1', 'Song 1'): 3,
('User 1', 'Song 2'): 4,
('User 1', 'Song 3'): 5,
('User 1', 'Song 4'): 2,
('User 2', 'Song 1'): 5,
('User 2', 'Song 2'): 4,
('User 2', 'Song 3'): 2,
('User 2', 'Song 4'): 3,
('User 3', 'Song 1'): 4,
('User 3', 'Song 2'): 5,
('User 3', 'Song 3'): 3,
('User 3', 'Song 4'): 4,
('User 4', 'Song 1'): 2,
('User 4', 'Song 2'): 3,
('User 4', 'Song 3'): 4,
('User 4', 'Song 4'): 5
}
time_limits = {
'User 1': 60,
'User 2': 90,
'User 3': 120,
'User 4': 60
}

# 問題を定義する
prob = LpProblem("Music Recommendation", LpMinimize)

# 変数を定義する
x = LpVariable.dicts('x', [(u, s) for u in users for s in songs], cat='Binary')

# 目的関数を定義する
prob += lpSum([x[(u, s)] * ratings[(u, s)] for u in users for s in songs])

# 制約条件を追加する
for u in users:
prob += lpSum([x[(u, s)] for s in songs]) <= len(songs) // 2, f"User {u} - Song count"
prob += lpSum([x[(u, s)] * ratings[(u, s)] for s in songs]) >= 3, f"User {u} - Minimum rating"
prob += lpSum([x[(u, s)] * ratings[(u, s)] for s in songs]) <= 5, f"User {u} - Maximum rating"
prob += lpSum([x[(u, s)] * ratings[(u, s)] for s in songs]) * 5 <= time_limits[u], f"User

[実行結果]

Status: Optimal

Total rating: 12.0

User 1 recommendations: ['Song 1']

User 2 recommendations: ['Song 4']

User 3 recommendations: ['Song 3']

User 4 recommendations: ['Song 2']

この結果から、各ユーザーにおすすめする曲を決定することができます。

たとえば、User 1 には ‘Song 1’ をおすすめすることができます。

また、最適化問題の総合評価が 12 であることから、ユーザーが評価する曲の総合的な評価を最大化しつつ、制約条件を満たす最適な曲の選択を行っていることがわかります。