lfm(latent factor model)隱語義模型的核心思想是通過隱含特徵(latent factor)聯絡使用者興趣和物品,採取基於使用者行為統計的自動聚類。
lfm通過如下公式計算使用者u對物品i的興趣:
對每個使用者取樣負樣本時,要選取那些很熱門,而使用者卻沒有行為的物品。
下面的python**實現了負樣本取樣過程:
items_pool維護了候選物品的列表,在這個列表中,物品i出現的次數和物品i的流行度成正比。items是乙個dict,它維護了使用者已經有過行為的物品的集合。因此,上面的**按照物品的流行度取樣出了那些熱門的、但使用者卻沒有過行為的物品。經過取樣,可以得到乙個使用者—物品集k= ,其中如果(u, i)是正樣本,則有r(ui)=1,否則有r(ui)=0 ,r(ui,hat)是推薦系統給出的使用者u對物品i的興趣。然後。需要優化如下的損失函式來找到最合適的引數p和q:def randomselectnegativesample(self, items):
ret = dict()
for i in items.keys():
ret[i] = 1
n = 0
for i in range(0, len(items) * 3):
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
這裡,||pu||和||qi||是用來防止過擬合的正則化項,λ可以通過實驗獲得。要最小化上面的損失函式,可以利用隨機梯度下降法演算法。
隨機梯度下降法需要首先對它們分別求偏導數,可以得到:
然後,根據隨機梯度下降法,需要將引數沿著最速下降方向向前推進,因此可以得到如下遞推公式,其中a是學習率。
綜上在lfm中,重要的引數有4個:隱特徵的個數f;學習速率alpha;正則化引數lambda;負樣本/正樣本比例 ratio。通過實驗發現,ratio引數對lfm的效能影響最大。def latentfactormodel(user_items, f, n, alpha, lambda):
[p, q] = initmodel(user_items, f)
for step in range(0,n):
for user, items in user_items.items():
samples = randselectnegativesamples(items)
for item, rui in samples.items():
eui = rui - predict(user, item)
for f in range(0, f):
p[user][f] += alpha * (eui * q[item][f] - lambda * p[user][f])
q[item][f] += alpha * (eui * p[user][f] - lambda * q[item][f])
alpha *= 0.9
def recommend(user, p, q):
rank = dict()
for f, puf in p[user].items():
for i, qfi in q[f].items():
if i not in rank:
rank[i] += puf * qfi
return rank
還可參考
推薦系統 5 隱語義模型 LFM
2019 03 02 14 27 17 對於usercf,我們可以先計算和目標使用者興趣相似的使用者,之後再根據計算出來的使用者喜歡的物品給目標使用者推薦物品。而itemcf,我們可以根據目標使用者喜歡的物品,尋找和這些物品相似的物品,再推薦給使用者。我們還有一種方法,先對所有的物品進行分類,再根據...
推薦系統 隱語義模型
繼續學習推薦系統,還是推薦演算法的部分。因為我的學習是圍繞 推薦系統實踐 展開,這邊書是12年寫成的,所以一開始都是那年比較流行的演算法模型,裡面總共講了三個演算法,乙個是協同過濾,乙個是隱語義模型,乙個圖模型。圖模型我覺得現在實際上用的比較少,所以我就只看了一下,這裡不寫出來了。後面我會研究一下深...
基於隱語義模型的推薦演算法的原理
隱語義模型 lfm 和lsi,lda,topic model其實都屬於隱含語義分析技術,是一類概念,他們在本質上是相通的,都是找出潛在的主題或分類。這些技術一開始都是在文字挖掘領域中提出來的,近些年它們也被不斷應用到其他領域中,並得到了不錯的應用效果。lfm演算法的核心是將user item m n...