矩陣分解在推薦系統的應用以及python程式碼的實現
矩陣分解在打分預估系統中得到了成熟的發展和應用,為了方便以後複習,先總結如下。
打分矩陣R(n,m)是n行和m列,n表示user個數,m行表示item個數,例如R(5,6)
item1item2item3item4item5item6
user1 544350
user2 045031
user3540130
user4045315
user5103505
其中,為了表示方便0表示沒有打分,根據目前的矩陣R(5,6)如何得到分值為0的使用者的打分值?
矩陣分解的思想可以解決這個問題,其實這種思想可以看作是有監督的機器學習問題
具體的:
R(n,m)~=P(n,K)*Q(K,m)
其中 ~=表示約等於(由於編輯器使用的不熟悉),矩陣P(n,K)表示n個user和K個特徵之間的關係矩陣,這K個特徵是一箇中間變數,矩陣Q(K,m)的轉置是矩陣Q(m,K)
令
如果R(i,j)已知,則R(i,j)的誤差平方和為
為了防止過擬合,增加正則化項:
使用梯度下降法獲得修正的p和q分量:
糾錯:中間等式前面的alph前面應該是負號,代表負梯度方向
糾錯:中間等式前面的alph前面應該是負號,代表負梯度方向
不停的迭代直到sum(e^2) <=閾值,
K=2 得到結果是
item1
item2 item4
item5item6
user2[ 4.92136216 3.986272 4.40232802 1.81776335 3.57447488 1.37667655]
user3 [ 4.70259529 3.66136084 4.02053168 1.42409487 3.54021725 0.92110655]
user4 [ 3.24257645 3.95178917 4.57037303 4.00482228 1.23685399 4.44552925]
user5 [ 0.94314043 2.66249238 3.23566396 4.36964834 -0.91695287 5.33276304]]
K=3 得到結果是
item1item2item4item5item6item7
user1[[ 5.35081468 4.21628989 3.92966236 2.8616707 4.42764467 3.67424467]
user2[ 3.65150782 4.00536042 4.98203391 -0.24263616 2.84660098 1.11289902]
user3[ 4.55129228 3.73496981 3.86823535 1.11434568 3.71657794 2.03034916]
user4[ 1.57844524 3.97142414 5.03277248 3.35320963 1.08371548 4.62480722]
user5[ 0.93799194 2.70958606 2.97752303 4.67356409 0.67601902 5.28834503]]
python 原始碼如下:
import numpy def matrix_factorization(R, P, Q, K, steps=5000, alpha=0.0002, beta=0.02): Q = Q.T for step in xrange(steps): for i in xrange(len(R)): for j in xrange(len(R[i])): if R[i][j] > 0: eij = R[i][j] - numpy.dot(P[i,:],Q[:,j]) for k in xrange(K): P[i][k] = P[i][k] + alpha * (2 * eij * Q[k][j] - beta * P[i][k]) Q[k][j] = Q[k][j] + alpha * (2 * eij * P[i][k] - beta * Q[k][j]) eR = numpy.dot(P,Q) e = 0 for i in xrange(len(R)): for j in xrange(len(R[i])): if R[i][j] > 0: e = e + pow(R[i][j] - numpy.dot(P[i,:],Q[:,j]), 2) for k in xrange(K): e = e + (beta/2) * ( pow(P[i][k],2) + pow(Q[k][j],2) ) if e < 0.001: break return P, Q.T ############################################################################### if __name__ == "__main__": R = [ [5,4,4,3,5,0], [0,4,5,0,3,1], [5,4,0,1,3,0], [0,4,5,3,1,5], [1,0,3,5,0,5], ] R = numpy.array(R) N = len(R) M = len(R[0]) K = 2 P = numpy.random.rand(N,K) Q = numpy.random.rand(M,K) nP, nQ = matrix_factorization(R, P, Q, K) print R T = numpy.dot(nP,nQ.T) print T
參考文章:http://www.quuxlabs.com/blog/2010/09/matrix-factorization-a-simple-tutorial-and-implementation-in-python/#source-code
adding biases
然而,上面僅僅考慮了q和p直接相互影響,而沒有考慮user和item專案本身的屬性,比如,總體的平均分是all_mean,
user是一位嚴厲的顧客,那麼打分自然要低於打分的平均分,一個item比其他item更流行,其得分高於打分的
平均分,則:r_exp(u,i) = u + b(i) + b(u) + q(i)p(u)
其中 u是所有打過分的打分item的打分的平均值,b(i)為item比平均值的偏差,b(u)表示個人打分習慣和
平均打分的偏差
優化目標函式是:
min ∑ (r(u,i) - all_mean - b(u) - b(i) - p(u)q(i))^2 + lamda*(||p(u)||^2 + ||q(i)||^2 + (b(u))^2 + (b(i))^2)
參考文章:matrix factorization techniques for recommender systems
該原始碼在我的github,https://github.com/zhangqianjin/recommender-system/ ,歡迎大家交流學習
相關推薦
矩陣分解在推薦系統的應用以及python程式碼的實現
矩陣分解在打分預估系統中得到了成熟的發展和應用,為了方便以後複習,先總結如下。 打分矩陣R(n,m)是n行和m列,n表示user個數,m行表示item個數,例如R(5,6) item1item2item3item4item5item6 user1 544350 use
Redis訂閱&釋出以及python程式碼實現
A:命令列 伺服器端 192.168.1.168:7000> subscribe foo bar Reading messages... (press Ctrl-C&n
leetcode-Two sum(最佳思路以及python程式碼實現)
1、Two sumGiven nums = [2, 7, 11, 15], target = 9, Because nums[0] + nums[1] = 2 + 7 = 9, return [0, 1].答案:使用hashtable,建立陣列值和下標的鍵值對,在pytho
決策樹基本理論學習以及Python程式碼實現和詳細註釋
首先是樹的概念我們都比較熟悉了,然後決策樹其實就是一棵樹,通過在每一個幾點通過特徵的不同,走向不同的子樹直到走到葉子節點找到分類的標籤,算是完成了分類的過程。分類的過程不難理解,主要的是資料構造過程。 首先是構造的依據是什麼呢,以什麼依據作為特徵使用的選擇條件
Apriori演算法學習以及Python程式碼實現
最近在學資料探勘,學完Apriori演算法之後就一直想用程式碼實現出來,於是學了幾天python之後,進行了實現...直接貼程式碼,程式碼中有自己的解釋。''' # Filename: MyApriori.py # author: 薄層 # Date: 2018/5/20 0
Redis訂閱&釋出以及python程式碼實現
A:命令列 伺服器端 192.168.1.168:7000> subscribe foo bar Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "redisChat" 3) (integer) 1 1 1) "message"
推薦系統實踐----基於使用者的協同過濾演算法(python程式碼實現書中案例)
本文參考項亮的《推薦系統實踐》中基於使用者的協同過濾演算法內容。因其中程式碼實現部分只有片段,又因本人初學,對python還不是很精通,難免頭大。故自己實現了其中的程式碼,將整個過程走了一遍。 1. 過程簡述 a. 首先我們因該先找到和目標使用者興趣相似的使用者集合。簡單來
模擬RSA雙向驗證,並且實現DES加密以及MD5校驗過程(python程式碼實現)
要求如下: (1)A,B兩端各生成公鑰金鑰對(PA,SA), 金鑰對(PB,SB)。 (2)A端生成隨機數N1,用B的公鑰PB加
K-Means演算法、非負矩陣分解(NMF)與影象壓縮(Python)
K-Means演算法是最基礎的聚類演算法、也是最常用的機器學習演算法之一。 本教程中,我們利用K-Means對影象中的畫素點進行聚類,然後用每個畫素所在的簇的中心點來代替每個畫素的真實值,從而達到影象壓縮的目的。 非負矩陣分解(Non-negative Matrix Fac
推薦系統應用---音樂類
音樂,人類的靈魂,只有懂得音樂的人才懂得生活。 每個人都離不開音樂這個東西,你可能不喜歡唱歌,但一定不會不喜歡聽歌,尤其是那些美妙的音樂。 如今,有非常非常多的音樂流派和音樂人,不同音樂流派的音樂風格自然很不相同,而同一種音樂流派中不同的音樂人因為對音樂的理解不同也會有不
推薦系統應用研究:音樂電臺
推薦系統很少有單獨的產品形態,多是和其他產品相結合,起到輔助的使用效果。如個人平時使用較多的推薦系統有輸入法的字詞聯想、購書網站中書籍推薦、音樂電臺的猜使用者喜歡的音樂和谷歌閱讀器的推薦條目。 對於豆瓣音樂頻道使用較少,雖然對音樂沒什麼研究,也不會買什麼專輯或者聽演唱會,但是很喜歡聽音樂,有邊工
【推薦系統實戰】:C++實現基於用戶的協同過濾(UserCollaborativeFilter)
color style popu ted std 相似度 abi ear result 好早的時候就打算寫這篇文章,可是還是參加阿裏大數據競賽的第一季三月份的時候實驗就完畢了。硬生生是拖到了十一假期。自己也是醉了。。。找工作不是非常順利,希望寫點東西回想一下知識。然後再
Tensorflow 反捲積(DeConv)實現原理+ 手寫python程式碼實現反捲積(DeConv)
1、反捲積原理 反捲積原理不太好用文字描述,這裡直接以一個簡單例子描述反捲積。 假設輸入如下: [[1,0,1], [0,2,1], [1,1,0]] 反捲積卷積核如下: [[ 1, 0, 1], [-1, 1, 0], [ 0,-1, 0]]  
推薦系統-協同過濾原理與實現
一、基本介紹 1. 推薦系統任務 推薦系統的任務就是聯絡使用者和資訊一方面幫助使用者發現對自己有價值的資訊,而另一方面讓資訊能夠展現在對它感興趣的使用者面前從而實現資訊消費者和資訊生產者的雙贏。 2. 與搜尋引擎比較 相同點:幫助使用者快速發現有用資訊的工具 不同點:和搜尋引擎不同的是推薦系統不
推薦系統中協同過濾演算法實現分析(重要兩個圖!!)
“協”,指許多人協力合作。 “協同”,就是指協調兩個或者兩個以上的不同資源或者個體,協同一致地完成某一目標的過程。 “協同過濾”,簡單來說,就是利用興趣相投或擁有共同經驗的群體的喜好來給使用者推薦感興趣的資訊,記錄下來個人對於資訊相當程度的迴應(如評分),以達到過濾的目的,進而幫助別人篩
利用itchat 10行python程式碼實現微信轟炸
''' 轉載:https://github.com/Gin79/WeChat-Bomb/blob/master/README.md ''' 說明 站在巨人的肩膀上 基於python,這個小程式是用python寫的 使用的是python第三方庫itchat,itc
請寫出一段Python程式碼實現刪除一個list裡面的重複元素?
方法1:使用set函式 s=set(list),然後再list(s) 方法2:append 1 def delList(L): 2 L1 = [] 3 for i in L: 4
iOS12系統應用傳送普通郵實現傳送
iOS12系統應用傳送普通郵實現傳送 構建好郵件以後,可以傳送該郵件。此時需要使用mailComposeDelegate屬性,該屬性用來設定委託,其語法形式如下: unowned(unsafe) var mailComposeDelegate: MFMailComposeViewController
WGS84地球座標系轉火星座標系的Python程式碼實現
WGS84地球座標系轉火星座標系的Python程式碼實現 轉換演算法: from __future__ import division from math import pi, sqrt, sin, cos # a python binding of https://on4wp7.
PageHelper與bootstrap的模態框,以及jquery程式碼實現分頁查詢顯示以及Echart的使用
模板下載地址:https://files.cnblogs.com/files/han-guang-xue/%E5%88%86%E9%A1%B5%E6%A8%A1%E6%9D%BF.zip jquery程式碼 var pn; var maxPn; $(function () { loading