符號說明
\(top\_k\): 當前使用者預測分最高的k個items,預測分由高到低排序
$pos$: 當前使用者實際點選過的items
\(N\): 測試使用者數量
示例資料
N = 4
| len(top_k & pos) | len(pos) | 預測中(四聲)的item在top_k中的位置(1為預測中,長度為使用者實際點選過的items長度)
| ---- | ---- | ---- |
| 1 | 2 | 1 0
| 2 | 3 | 0 1 1
| 3 | 4 | 1 0 1 1
| 0 | 3 | 0 0 0
一、Hit Rate
網上有2種定義方式,不知道哪個更為正確的,有知道的人能不能麻煩告訴我一下?
第一種
對所有使用者:我們真正喜歡的物品中,你給我們推薦了多少
hit = 0
total = 0
for i in users:
top_k = 獲取top_k的程式碼
hit += len(top_k & pos)
total += len(pos)
hit_rate = hit / total
\(hit\_rate = \frac{1 + 2 + 3 + 0}{2 + 3 + 4 + 5}\)
第二種
被推薦到喜歡物品的使用者佔總使用者的比例
hit = 0
for i in users:
top_k = 獲取top_k的程式碼
if top_k中有預測到pos中的item:
hit += 1
hit_rate = hit / N
\(hit\_rate = \frac{1 + 1 + 1 + 0}{4}\)
二、Recall
對某個使用者:我真正喜歡的物品中,你給我推薦了多少
recall = 0
for i in users:
top_k = xxx(i)
recall += len(top_k & pos) / len(pos) # 使用者i的recall
recall = mean(recall)
\(recall = (\frac{1}{2} + \frac{2}{3} + \frac{3}{4} + \frac{0}{3})\ /\ 4\)
三、NDCG
對某個使用者:實際的折扣累計收益 DCG (Discounted Cumulative Gain) / 理想的DCG
DCG:考慮位置因素,希望使用者喜歡的物品在top_k中排得越前越好
iDCG:歸一化,解決【不同使用者的DCG求和項數不同,不能進行比較】的問題
NDCG = 0
for i in users:
DCG = 0
iDCG = 0
top_k = xxx(i)
for rank in range(k):
if top_k[rank] in pos:
DCG += 1 / log2(rank + 2)
for i in range(min(k, len(pos))):
iDCG += 1 / log2(i + 2)
NDCG_u = DCG / iDCG
NDCG += NDCG_u
NDCG = mean(NDCG)