對於某個用戶,首先得到他的興趣分類,然后從分類中挑選他可能喜歡的物品。總結一下,這個基於興趣分類的方法大概需要解決3個問題。
- 如何給物品進行分類?
- 如何確定用戶對哪些類的物品感興趣,以及感興趣的程度?
- 對於一個給定的類。選擇哪些屬於這個類的物品推薦給用戶,以及如何確定這些物品在一個類中的權重?
隱含語義分析技術采用基於用戶行為統計的自動聚類,較好地解決了上面提出的問題。
隱含語義分析技術的分類來自對用戶行為的統計,代表了用戶對物品分類的看法。隱含語義分析技術和ItemCF在物品分類方面的思想類似,如果兩個物品被很多用戶同時喜歡,那么這兩個物品就很有可能屬於同一個類。隱含語義分析技術允許指定最終有多少個分類,這個數字越大,分類的粒度就會越細,反之分類粒度就會越粗。隱含語義分析技術會計算出物品屬於每個類的權重,因此每個物品都不是硬性地被分到某一個類中。隱含語義分析技術給出的每個分類都不是同一個維度的,它是基於用戶的共同興趣計算出來的,如果用戶的共同興趣是某一個維度,那么LFM給出的類也是相同的維度。隱含語義分析技術可以通過統計用戶行為決定物品在每個類中的權重,如果喜歡某個類的用戶都會喜歡某個物品,那么這個物品在這個類中的權重就可能比較高。
LFM通過如下公式計算用戶u物品i的興趣:
這個公式中和
是模型的參數,其中
度量了用戶
的興趣和第
個隱類的關系,而
度量了第
個隱類和物品
之間的關系。那么下面的問題就是如何計算這兩個參數。
要計算這兩個參數,需要一個訓練集,對於每個用戶,訓練集里都包含了用戶
喜歡的物品和不感興趣的物品,通過學習這個數據集,就可以獲得上面的模型參數。
推薦系統的用戶行為分為顯性反饋和隱性反饋。LFM在顯性反饋數據(也就是評分數據)上解決評分預測問題並達到了很好的精度。這里主要討論的是隱性反饋數據集,這種數據集的特點是只有正樣本(用戶喜歡什么物品),而沒有負樣本(用戶對什么物品不感興趣)。
對負樣本采樣時應該遵循以下原則:
- 對每個用戶,要保證正負樣本的平衡(數目相似)。
- 對每個用戶采樣負樣本時,要選取那些很熱門,而用戶卻沒有行為的物品。
一般認為,很熱門而用戶卻沒有行為更加代表用戶對這個物品不感興趣。因為對於冷門的物品,用戶可能是壓根沒在網站中發現這個物品,所以談不上是否感興趣。
下面的python代碼實現了負樣本采樣過程:
def RandomSelectNegativeSample(self, items): #items是一個dict,它維護了用戶已經有過行為的物品的集合 #在這個列表中,物品i出現的次數和物品i的流行度成正比 ret = dict() for i in items.keys(): ret[i] = 1 n = 0 #將范圍上限設為len(items) * 3,主要是為保證正、負樣本數量接近。 for i in range(0, len(items) * 3): #items_pool維護了候選物品的列表 item = items_pool[random.randint(0, len(items_pool) - 1)] if item in ret: continue ret[item] = 0 n += 1 if n > len(items): break return ret