python 怎么取对数_概率矩阵分解(PMF)及MovieLens上的Python代码
首先對(duì)Probabilistic Matrix Factorization這篇論文的核心公式進(jìn)行講解和推導(dǎo);然后用Python代碼在Movielens數(shù)據(jù)集上進(jìn)行測(cè)試實(shí)驗(yàn)。
一、 背景知識(shí)
文中作者提到,傳統(tǒng)的協(xié)同過濾算法有兩個(gè)不足:
1).不能很好地處理規(guī)模非常大的數(shù)據(jù);
2). 不能很好地處理那些只給出極少評(píng)分的用戶。
概率矩陣分解則能很好的解決上述提到的這兩個(gè)問題。
二、算法推導(dǎo)
2.1 定義和描述
假設(shè)有
個(gè)用戶, 個(gè)商品,形成一個(gè) 維的評(píng)分矩陣 , 矩陣 中的元素 表示用戶 對(duì)商品 的評(píng)分。假設(shè)潛在特征個(gè)數(shù)為 ,那么 維的矩陣 表示用戶的潛在特征矩陣, 用戶 的潛在特征向量; 維的矩陣 表示商品的潛在特征矩陣, 商品 的潛在特征向量。概率模型圖如下圖所示:圖1 PMF的概率模型圖假設(shè)關(guān)于已知評(píng)分?jǐn)?shù)據(jù)的條件分布滿足高斯分布:
(1)其中,
為指示函數(shù):如果用戶 已經(jīng)對(duì)商品 進(jìn)行了評(píng)分,則為1;否者為0。再假設(shè)用戶潛在特征向量和商品潛在特征向量都服從均值為0的高斯先驗(yàn)分布,即:
(2)注意公式(2)中的
不是指示函數(shù),表示一個(gè)對(duì)角陣。然后,計(jì)算
和 的后驗(yàn)概率:等式兩邊取對(duì)數(shù)
后得到: (3)2.2 關(guān)鍵處推導(dǎo)
此處插入取對(duì)數(shù)收到得到公式(3)的詳細(xì)推導(dǎo)過程(對(duì)其中
這一項(xiàng)進(jìn)行推導(dǎo)): 滿足高斯分布,所以可以得到:其中
,其中 為對(duì)角陣,對(duì)上述式子取對(duì)數(shù) 得:2.3 最優(yōu)化目標(biāo)函數(shù)
求等式(3)的最大值,等價(jià)于最小化目標(biāo)函數(shù):
(4)其中,
。等式
分別對(duì) 和 進(jìn)行求導(dǎo)得:然后用隨機(jī)梯度下降法(SGD)更新
和 :其中
為步長(zhǎng),或者稱之為學(xué)習(xí)率。注意:下降的步長(zhǎng)大小非常重要,因?yàn)槿绻?#xff0c;則找到函數(shù)最小值的速度就很慢,如果太大,則又可能會(huì)出現(xiàn)震蕩。令
,上述式子簡(jiǎn)化為: (5) (6)直到滿足收斂條件或迭代至最大的迭代次數(shù)。
2.4 改進(jìn)和優(yōu)化
論文中還提到,用
函數(shù) 代替原來(lái)的線性高斯模型,因?yàn)榫€性高斯模型做預(yù)測(cè)時(shí)會(huì)產(chǎn)出評(píng)分的有效范圍。 故將等式(1)修改為如下: (7)原始評(píng)分
則通過函數(shù) 映射到 ,然后再參與運(yùn)算。 為最大評(píng)分值。三、程序?qū)崿F(xiàn)
3.1 代碼及實(shí)現(xiàn)
偽代碼如下所示:
Input: the number of latent factor K, the learning rata eta, regularization parameters lambda_1,lambda_2, the max iteration Step, and the rating matrix RInitialization: Initialize a random matrix for user matrix U and item matrix Vfor t = 1, 2,...Step dofor (u,i,r) in Rmake prediction pr=Ui^T*Vjerror e=r-prupdate Ui and Vj by (5) and (6)the algorithm suffers a loss (Ui, Vj, r)end for end for下面用python,在 MovieLens 100K 這個(gè)數(shù)據(jù)集上實(shí)現(xiàn)PMF算法。
核心代碼如下所示:
def update(p, q, r, learning_rate=0.001, lamda_regularizer=0.1):error = r - np.dot(p, q.T) p = p + learning_rate*(error*q - lamda_regularizer*p)q = q + learning_rate*(error*p - lamda_regularizer*q)loss = 0.5 * (error**2 + lamda_regularizer*(np.square(p).sum() + np.square(q).sum()))return p,q,loss3.2 實(shí)驗(yàn)結(jié)果
當(dāng)訓(xùn)練集:測(cè)試集=8:2時(shí),可得到最終的RMSE為0.92左右,實(shí)驗(yàn)曲線如下所示:
圖2 迭代過程中的loss值圖3 迭代過程中的RMSE值完整項(xiàng)目下載地址:
https://github.com/XiuzeZhou/Recommender-Systems?github.com更多 矩陣分解內(nèi)容和程序,請(qǐng)看我的最新博文:
周秀澤:推薦系統(tǒng)系列之二:矩陣分解家族?zhuanlan.zhihu.com參考資料:
[1] 小木,推薦系統(tǒng)之概率矩陣分解的詳細(xì)推導(dǎo)過程(Probabilistic Matrix Factorization,PMF)
[2] 追溯星霜,PMF:概率矩陣分解
總結(jié)
以上是生活随笔為你收集整理的python 怎么取对数_概率矩阵分解(PMF)及MovieLens上的Python代码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java学习(4):第一个java程序
- 下一篇: 生鲜配送小程序源码_生鲜社区团购配送系统