python 怎么取對數_概率矩陣分解(PMF)及MovieLens上的Python代碼

3ba47bec4227ed0c075ef2e690b9ff93.png

首先對Probabilistic Matrix Factorization這篇論文的核心公式進行講解和推導;然后用Python代碼在Movielens數據集上進行測試實驗。

一、 背景知識

文中作者提到,傳統的協同過濾算法有兩個不足:

1).不能很好地處理規模非常大的數據;

2). 不能很好地處理那些只給出極少評分的用戶。

概率矩陣分解則能很好的解決上述提到的這兩個問題。

二、算法推導

2.1 定義和描述

假設有

個用戶,
個商品,形成一個
維的評分矩陣
, 矩陣
中的元素
表示用戶
對商品
的評分。假設潛在特征個數為
,那么
維的矩陣
表示用戶的潛在特征矩陣,
用戶
的潛在特征向量;
維的矩陣
表示商品的潛在特征矩陣,
商品
的潛在特征向量。概率模型圖如下圖所示:

4415555db0b8a4d0f5a106160b6587ba.png
圖1 PMF的概率模型圖

假設關于已知評分數據的條件分布滿足高斯分布:

(1)

其中,

為指示函數:如果用戶
已經對商品
進行了評分,則為1;否者為0。

再假設用戶潛在特征向量和商品潛在特征向量都服從均值為0的高斯先驗分布,即:

(2)

注意公式(2)中的

不是指示函數,表示一個對角陣。

然后,計算

的后驗概率:

等式兩邊取對數

后得到:

(3)

2.2 關鍵處推導

此處插入取對數收到得到公式(3)的詳細推導過程(對其中

這一項進行推導):

滿足高斯分布,所以可以得到:

其中

,其中
為對角陣,對上述式子取對數
得:

2.3 最優化目標函數

求等式(3)的最大值,等價于最小化目標函數:

(4)

其中,

等式

分別對
進行求導得:

然后用隨機梯度下降法(SGD)更新

其中

為步長,或者稱之為學習率。
注意:下降的步長大小非常重要,因為如果太小,則找到函數最小值的速度就很慢,如果太大,則又可能會出現震蕩。

,上述式子簡化為:

(5)

(6)

直到滿足收斂條件或迭代至最大的迭代次數。

2.4 改進和優化

論文中還提到,用

函數
代替原來的線性高斯模型,因為線性高斯模型做預測時會產出評分的有效范圍。 故將等式(1)修改為如下:

(7)

原始評分

則通過函數
映射到
,然后再參與運算。
為最大評分值。

三、程序實現

3.1 代碼及實現

偽代碼如下所示:

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 這個數據集上實現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,loss

3.2 實驗結果

當訓練集:測試集=8:2時,可得到最終的RMSE為0.92左右,實驗曲線如下所示:

6aeeaaf2ac48734dcc86924582d0329d.png
圖2 迭代過程中的loss值

aca4c0dda9c2f97cd1a8db545bed0df3.png
圖3 迭代過程中的RMSE值

完整項目下載地址:

https://github.com/XiuzeZhou/Recommender-Systems?github.com

更多 矩陣分解內容和程序,請看我的最新博文:

周秀澤:推薦系統系列之二:矩陣分解家族?zhuanlan.zhihu.com
832bae27abd2781ea5e5057217783246.png

參考資料:

[1] 小木,推薦系統之概率矩陣分解的詳細推導過程(Probabilistic Matrix Factorization,PMF)

[2] 追溯星霜,PMF:概率矩陣分解

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/272105.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/272105.shtml
英文地址,請注明出處:http://en.pswp.cn/news/272105.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JAVA SE、EE、ME,JRE、JDK,基本數據類型,訪問修飾符、函數、封裝的概念、UML類圖、構造方法、this關鍵字、static關鍵字、方法重載、方法重寫、包(packahe)

運行第一個JAVA程序: 這里使用的開發環境是eclipse,新建一個java工程,然后可以看到src這個是存放java代碼的地方,然后在src文件右擊新建一個class(類),然后可以看到下圖,同樣和C語言…

unity中如何解決鏡頭穿透模型?

設置相機的Near clip plane,調小一點,但是不要給負數就行。 轉載于:https://www.cnblogs.com/ZeroMurder/p/5331174.html

Shell腳本中函數位置參數的用法筆記

位置參數主要是用于調用函數的時候有時候需要傳遞參數,有很大的比例都是需要調用函數的時候動態傳遞參數,從而實現相應的功能。比如我想要計算兩個數的和,可以通過函數是實現,需要定義兩個參數作為計算的值。這樣的計算兩個數的函…

生鮮配送小程序源碼_生鮮社區團購配送系統小程序源碼搭建平臺模式

生鮮配送系統開發,找【金生157威6875店2419同號】生鮮配送模式開發,生鮮配送軟件開發,生鮮配送APP開發,生鮮配送平臺開發平臺,生鮮配送系統源碼開發平臺,生鮮配送系統平臺,生鮮配送系統定制開發…

軟件開發的早期為何要進行可行性研究?該從哪幾個方面研究目標系統的可行性?...

因為并非任何問題都有簡單明顯的解決辦法,很多問題不可能在預定的系統規模或者時間期限內解決。如果問題沒有可行的解決方案,那么花費在這工程上的任何時間人力經費等資源都是浪費。。 一般來說,至少應該從如下3個方面研究其可行性&#xff1…

繼承的概念和實現 、 super關鍵字 、 Object常見方法、抽象類、接口、模板方法模式、成員內部類、匿名內部類

這篇博客將會涉及到: 繼承的概念和實現super關鍵字方法重寫—OverrideObject常見方法 繼承的概念: 生活中,繼承的概念隨處可見,繼承需要符合的關系:is-a;父類更通用、子類更特殊更具體。就比如說&#x…

盤點關于程序員的10個有趣的段子

(1)程序員的讀書歷程:x 語言入門 —> x 語言應用實踐 —> x 語言高階編程 —> x 語言的科學與藝術 —> 編程之美 —> 編程之道 —> 編程之禪—> 頸椎病康復指南。(2)程序員最討厭的四件事&#x…

oracle 修索引改空間_Oracle如何更改表空間的數據文件位置詳解

表空間概述Oracle的表空間屬于Oracle中的存儲結構,是一種用于存儲數據庫對象(如:數據文件)的邏輯空間,是Oracle中信息存儲的最大邏輯單元,其下還包含有段、區、數據塊等邏輯數據類型。表空間是在數據庫中開辟的一個空間&#xff0…

開發 調試

在開發中,若代碼已寫完,服務器上運行卻出錯,或者沒有結果。此時,應想辦法盡可能獲取更多的信息,有如下方法:[今后要根據學習、工作持續增加內容] 1、打開瀏覽器的調試,谷…

Linux 用戶管理命令筆記

目錄 1、新增用戶 2、刪除用戶 3、修改用戶 4、修改用戶密碼 1、新增用戶 useradd user1 用戶創建流程 1、系統先將用戶信息記錄在/etc/passwd中,一般會在/etc/passwd和/etc/shadow末尾,同時分配該用戶UID。 2、創建用戶目錄,一般創建路徑/home目錄中。…

多態的概念、對象上下轉型、多態的應用、異常(異常概念、異常分類、java異常處理機制、try...catch...finally、throw和throws、自定義異常)

多態的概念: 多態性是指同一個操作作用于某一類對象,可以有不同的解釋,產生不同的執行結果。多態存在的三個必要條件: ① 需要存在繼承或實現關系 ② 同樣的方法調用而執行不同的操作、運行不同代碼(重寫)…

tomcat依賴導入步驟_Tomcat長生不老之術——嵌入式

前言Tomcat是一個非常流行的Web服務器,用于部署和運行Java Web應用程序。一般情況下,我們都是在單獨的Tomcat實例上運行自己的Web應用,其實與這種經典方案相比,我們可以將服務器運行時直接集成到應用程序中,從而更加的…

Linux用戶組筆記整理

目錄 一、Linux用戶組概念 二、常用命令 三、用戶組信息存儲位置 一、Linux用戶組概念 Linux用戶組(group)就是具有相同操作權限范圍的Linux用戶管理起來; 比如有時我們要讓同一類用戶具有相同的權限,比如查看、修改某一文件或執…

java泛型、泛型類及特點、限制泛型、類型通配符聲明、泛型方法

java泛型: 泛型簡介泛型類限制泛型可用類型類型通配聲明泛型方法 問題: 如果我們需要產生多個對象,每個對象的邏輯完全一樣,只是對象內的成員變量的類型不同。那我們該如何去做?如果按照正常的做法就要創建多個類文件…

不生效 設置了viewport_配置viewport

最近項目中需要開發內嵌的H5頁面,viewport不是很熟悉,故來翻譯一下此篇文件加深理解原文配置viewportIOS上的safari使用一種縮放的工作模式來展示pc端的網頁,如果默認的設置對你的網頁展示不友好,推薦你改變veiwport默認配置&…