天天看點

拓端tecdat|python機器學習:推薦系統實作(以矩陣分解來協同過濾)1. 使用者和産品的潛在特征2. 編寫推薦系統3. 矩陣分解工作原理

原文連結:http://tecdat.cn/?p=10911

原文出處:拓端資料部落公衆号

使用者和産品的潛在特征編寫推薦系統矩陣分解工作原理使用潛在表征來找到類似的産品。

1. 使用者和産品的潛在特征

我們可以通過為每個使用者和每部電影配置設定屬性,然後将它們相乘并合并結果來估計使用者喜歡電影的程度。

拓端tecdat|python機器學習:推薦系統實作(以矩陣分解來協同過濾)1. 使用者和産品的潛在特征2. 編寫推薦系統3. 矩陣分解工作原理

相同的計算可以表示為矩陣乘法問題。首先,我們把使用者屬性放在一個名為U的矩陣中,在這個例子中是5,-2,1,-5和5。然後,我們把電影屬性放在一個名為M的矩陣中,我們使用矩陣乘法來找出使用者的評分。

拓端tecdat|python機器學習:推薦系統實作(以矩陣分解來協同過濾)1. 使用者和産品的潛在特征2. 編寫推薦系統3. 矩陣分解工作原理

但要做到這一點,我們必須已經知道使用者屬性和電影屬性。為每個使用者和每部電影提供屬性評級并不容易。我們需要找到一種自動的方法。我們來看看電影評分矩陣,

拓端tecdat|python機器學習:推薦系統實作(以矩陣分解來協同過濾)1. 使用者和産品的潛在特征2. 編寫推薦系統3. 矩陣分解工作原理

它顯示了我們資料集中的所有使用者如何評價電影。這個矩陣非常稀疏,但它給了我們很多資訊。例如,我們知道使用者ID2給電影1号五顆星。是以,基于此,我們可以猜測,這個使用者的屬性可能類似于電影的屬性,因為它們比對的很好。換句話說,我們有一些線索可以使用。

讓我們看看我們如何利用這些線索來了解每部電影和每個使用者。在我們剛剛看到的等式中,U乘M等于電影等級,我們已經知道一些使用者的實際電影等級。我們已經擁有的電影評分矩陣是我們方程式的解決方案。雖然它是解決方案的一部分,但是這個陣列仍然有很多漏洞,但對于我們來說,這已經足夠了。

拓端tecdat|python機器學習:推薦系統實作(以矩陣分解來協同過濾)1. 使用者和産品的潛在特征2. 編寫推薦系統3. 矩陣分解工作原理

實際上,我們可以使用目前為止我們所知道的電影評級,然後逆向找到滿足該等式的U矩陣和M矩陣。當然,這才是最酷的部分。當我們将U和M相乘時,他們實際上會給我們一個完整的矩陣,我們可以使用那個完成的矩陣來推薦電影。讓我們回顧一下我們将如何建構這個推薦系統。

拓端tecdat|python機器學習:推薦系統實作(以矩陣分解來協同過濾)1. 使用者和産品的潛在特征2. 編寫推薦系統3. 矩陣分解工作原理

首先,我們建立了我們在資料集中所有使用者評論的矩陣。接下來,我們從已知的評論中分解出一個U矩陣和一個M矩陣。最後,我們将把我們找到的U和M矩陣相乘,得到每個使用者和每部電影的評分。但是還有一個問題。以前,當我們為每個使用者和每部電影手工建立屬性時,我們知道每個屬性的含義。我們知道第一個屬性代表動作,第二個代表劇情,等等。但是當我們使用矩陣分解來提出U和M時,我們不知道每個值是什麼意思。我們所知道的是,每個價值都代表了一些讓使用者感覺被某些電影吸引的特征。我們不知道如何用文字來描述這些特征。是以,U和M被稱為潛在向量。潛在的詞意味着隐藏。換句話說,這些向量是隐藏的資訊,我們通過檢視評論資料和反向推導。

2. 編寫推薦系統

我們來編寫推薦系統的主要代碼。打開Chapter 5/factor_review_matrix.py。首先,我将使用pandas read_csv函數将檢查資料集加載到名為raw_dataset_df的資料集中。

拓端tecdat|python機器學習:推薦系統實作(以矩陣分解來協同過濾)1. 使用者和産品的潛在特征2. 編寫推薦系統3. 矩陣分解工作原理

然後我們使用pandas資料透視表函數來建構評論矩陣。在這一點上,ratings_df包含一個稀疏的評論陣列。

拓端tecdat|python機器學習:推薦系統實作(以矩陣分解來協同過濾)1. 使用者和産品的潛在特征2. 編寫推薦系統3. 矩陣分解工作原理

接下來,我們希望将數組分解以找到使用者屬性矩陣和我們可以重新乘回的電影屬性矩陣來重新建立收視率資料。為此,我們将使用低秩矩陣分解算法。我已經在matrix_factorization_utilities.py中包含了這個實作。我們将在下一個視訊中詳細讨論它是如何工作的,但讓我們繼續使用它。首先,我們傳遞了評分資料,但是我們将調用pandas的as_matrix()函數,以確定我們作為一個numpy矩陣資料類型傳入。

接下來,這個方法接受一個名為num_features的參數。 Num_features控制為每個使用者和每個電影生成多少個潛在特征。我們将以15為起點。這個函數還有個參數regularization_amount。現在讓我們傳入0.1。在後面的文章中我們将讨論如何調整這個參數。

函數的結果是U矩陣和M矩陣,每個使用者和每個電影分别具有15個屬性。現在,我們可以通過将U和M相乘來得到每部電影的評分。但不是使用正常的乘法運算符,而是使用numpy的matmul函數,是以它知道我們要做矩陣乘法。

結果存儲在一個名為predicted_ratings的數組中。最後,我們将predict_ratings儲存到一個csv檔案。

首先,我們将建立一個新的pandas資料框來儲存資料。對于這個資料框,我們會告訴pandas使用與ratings_df資料框中相同的行和列名稱。然後,我們将使用pandas csv函數将資料儲存到檔案。運作這個程式後可以看到,它建立了一個名為predicted_ratings.csv的新檔案。我們可以使用任何電子表格應用程式打開該檔案。

拓端tecdat|python機器學習:推薦系統實作(以矩陣分解來協同過濾)1. 使用者和産品的潛在特征2. 編寫推薦系統3. 矩陣分解工作原理

這個資料看起來就像我們原來的評論資料,現在每個單元格都填滿了。現在我們評估下每個單個使用者會為每個單獨的電影評分。例如,我們可以看到使用者3評級電影4,他們會給它一個四星級的評級。現在我們知道所有這些評分,我們可以按照評分順序向使用者推薦電影。讓我們看看使用者1号,看看我們推薦給他們的電影。在所有這些電影中,如果我們排除了使用者以前評價過的電影,右邊34号電影是最高分的電影,是以這是我們應該推薦給這個使用者的第一部電影。當使用者觀看這部電影時,我們會要求他們評分。如果他們的評價與我們預測的不一緻,我們将添加新評級并重新計算此矩陣。這将有助于我們提高整體評分。我們從中獲得的評分越多,我們的評分陣列中就會出現的孔越少,我們就有更好的機會為U和M矩陣提供準确的值。

3. 矩陣分解工作原理

因為評分矩陣等于将使用者屬性矩陣乘以電影屬性矩陣的結果,是以我們可以使用矩陣分解反向工作以找到U和M的值。在代碼中,我們使用稱為低秩矩陣分解的算法,去做這個。我們來看看這個算法是如何工作的。矩陣分解是一個大矩陣可以分解成更小的矩陣的思想。是以,假設我們有一個大的數字矩陣,并且假設我們想要找到兩個更小的矩陣相乘來産生那個大的矩陣,我們的目标是找到兩個更小的矩陣來滿足這個要求。如果您碰巧是線性代數的專家,您可能知道有一些标準的方法來對矩陣進行因式分解,比如使用一個稱為奇異值分解的過程。但是,這是有這麼一個特殊的情況下,将無法正常工作。問題是我們隻知道大矩陣中的一些值。大矩陣中的許多條目是空白的,或者使用者還沒有檢查特定的電影。是以,我們不是直接将評級數組分成兩個較小的矩陣,而是使用疊代算法估計較小的矩陣的值。我們會猜測和檢查,直到我們接近正确的答案。哎哎等等, 咋回事呢?首先,我們将建立U和M矩陣,但将所有值設定為随機數。因為U和M都是随機數,是以如果我們現在乘以U和M,結果是随機的。下一步是檢查我們的計算評級矩陣與真實評級矩陣與U和M的目前值有多不同。但是我們将忽略評級矩陣中所有沒有資料的點,隻看在我們有實際使用者評論的地方。我們将這種差異稱為成本。成本就是錯誤率。接下來,我們将使用數字優化算法來搜尋最小成本。數值優化算法将一次調整U和M中的數字。目标是讓每一步的成本函數更接近于零。我們将使用的函數稱為fmin_cg。它搜尋使函數傳回最小可能輸出的輸入。它由SciPy庫提供。最後,fmin_cg函數将循環數百次,直到我們得到盡可能小的代價。當成本函數的價值如我們所能得到的那樣低,那麼U和M的最終值就是我們将要使用的。但是因為它們隻是近似值,是以它們不會完全完美。當我們将這些U矩陣和M矩陣相乘來計算電影評級時,将其與原始電影評級進行比較,我們會看到還是有一些差異。但是隻要我們接近,少量的差異就無關緊要了。

4. 使用潛在特征來找到類似的産品

搜尋引擎是使用者發現新網站的常用方式。當第一次使用者從搜尋引擎通路您的網站時,您對使用者尚不足以提供個性化推薦,直到使用者輸入一些産品評論時,我們的推薦系統還不能推薦他們。在這種情況下,我們可以向使用者展示與他們已經在檢視的産品類似的産品。目标是讓他們在網站上,讓他們看更多的産品。你可能在網上購物網站上看到過這個功能,如果你喜歡這個産品,你可能也會喜歡這些其他的産品。通過使用矩陣分解計算産品屬性,我們可以計算産品相似度。讓我們來看看find_similar_products.py。首先,我們将使用pandas的讀取CSV功能加載電影評級資料集。

我們還會使用read_csv将movies.csv加載到名為movies_df的資料框中。

然後,我們将使用pandas的資料透視表函數(pivot_table)來建立評分矩陣,我們将使用矩陣分解來計算U和M矩陣。現在,每個電影都由矩陣中的一清單示。首先,我們使用numpy的轉置函數來觸發矩陣,使每一列變成一行。

拓端tecdat|python機器學習:推薦系統實作(以矩陣分解來協同過濾)1. 使用者和産品的潛在特征2. 編寫推薦系統3. 矩陣分解工作原理

這隻是使資料更容易處理,它不會改變資料本身。在矩陣中,每個電影有15個唯一的值代表該電影的特征。這意味着其他電影幾乎相同的電影應該是非常相似的。要找到類似這個電影的其他電影,我們隻需要找到其他電影的編号是最接近這部電影的數字。這隻是一個減法問題。讓我們選擇使用者正在看的主要電影,讓我們選擇電影ID5。

拓端tecdat|python機器學習:推薦系統實作(以矩陣分解來協同過濾)1. 使用者和産品的潛在特征2. 編寫推薦系統3. 矩陣分解工作原理

如果你喜歡,你可以選擇其他的電影。現在,我們來看看電影ID5的标題和流派。我們可以通過檢視movies_df資料框并使用pandas的loc函數通過其索引查找行來做到這一點。讓我們列印出該電影的标題和流派。

拓端tecdat|python機器學習:推薦系統實作(以矩陣分解來協同過濾)1. 使用者和産品的潛在特征2. 編寫推薦系統3. 矩陣分解工作原理

接下來,讓我們從矩陣中擷取電影ID為5的電影屬性。我們必須在這裡減去一個,因為M是0索引,但電影ID從1開始。現在,讓我們列印出這些電影屬性,以便我們看到它們,這些屬性我們準備好找到類似的電影。

第一步是從其他電影中減去這部電影的屬性。這一行代碼從矩陣的每一行中分别減去目前的電影特征。這給了我們目前電影和資料庫中其他電影之間的分數差異。您也可以使用四個循環來一次減去一個電影,但使用numpy,我們可以在一行代碼中完成。第二步是取我們在第一步計算出的內插補點的絕對值,numpy的ABS函數給我們絕對值,這隻是確定任何負數出來都是正值。接下來,我們将每個電影的15個單獨的屬性差異合并為一個電影的總差異分數。 numpy的總和功能将做到這一點。我們還會傳入通路權限等于一個來告訴numpy總結每行中的所有數字,并為每行産生一個單獨的總和。在這一點上,我們完成了計算。我們隻是将計算得分儲存回電影清單中,以便我們能夠列印每部電影的名稱。在第五步中,我們按照我們計算的差異分數對電影清單進行排序,以便在清單中首先顯示最少的不同電影。這裡pandas提供了一個友善的排序值函數。最後,在第六步中,我們列印排序清單中的前五個電影。這些是與目前電影最相似的電影。

好的,我們來運作這個程式。 我們可以看到我們為這部電影計算的15個屬性。這是我們發現的五個最相似的電影。第一部電影是使用者已經看過的電影。 接下來的四部電影是我們向使用者展示的類似項目。根據他們的頭銜,這些電影看起來可能非常相似。他們似乎都是關于犯罪和調查的電影。續集,大城市法官三,都在名單上。這是使用者可能也會感興趣的電影。您可以更改電影ID并再次運作該程式,以檢視與其他電影類似的内容。

拓端tecdat|python機器學習:推薦系統實作(以矩陣分解來協同過濾)1. 使用者和産品的潛在特征2. 編寫推薦系統3. 矩陣分解工作原理

最受歡迎的見解

1.從決策樹模型看員工為什麼離職

2.R語言基于樹的方法:決策樹,随機森林

3.python中使用scikit-learn和pandas決策樹

4.機器學習:在SAS中運作随機森林資料分析報告

5.R語言用随機森林和文本挖掘提高航空公司客戶滿意度

6.機器學習助推快時尚精準銷售時間序列

7.用機器學習識别不斷變化的股市狀況——隐馬爾可夫模型的應用

8.python機器學習:推薦系統實作(以矩陣分解來協同過濾)

9.python中用pytorch機器學習分類預測銀行客戶流失