矩陣分解--超詳細解讀
基於矩陣分解的推薦演算法
一,相關理論介紹
矩陣分解確實可以解決一些近鄰模型無法解決的問題,近鄰模型存在的問題:1、物品之間存在相關性,資訊量並不是隨著向量維度增加而線性增加 2、矩陣元素稀疏,計算結果不穩定,增減一個向量維度,導致緊鄰結果差異很大的情況出現。
矩陣分解就是把原來的大矩陣,近似的分解成小矩陣的乘積,在實際推薦計算時不再使用大矩陣,而是使用分解得到的兩個小矩陣
我們知道,要做推薦系統,最基本的一個資料就是,使用者-物品的評分矩陣,如下圖1所示
圖1
矩陣中,描述了5個使用者(U1,U2,U3,U4 ,U5)對4個物品(D1,D2,D3,D4)的評分(1-5分),- 表示沒有評分,現在目的是把沒有評分的 給預測出來,然後按預測的分數高低,給使用者進行推薦。
如何預測缺失的評分呢?對於缺失的評分,可以轉化為基於機器學習的迴歸問題,也就是連續值的預測,對於矩陣分解有如下式子,R是類似圖1的評分矩陣,假設NM維(N表示行數,M表示列數),可以分解為P跟Q矩陣,其中P矩陣維度NK,P矩陣維度K*M。
式子1
對於P,Q矩陣的解釋,直觀上,P矩陣是N個使用者對K個主題的關係,Q矩陣是K個主題跟M個物品的關係,至於K個主題具體是什麼,在演算法裡面K是一個引數,需要調節的,通常10~100之間。
式子2
對於式子2的左邊項,表示的是R^ 第i行,第j列的元素值,對於如何衡量,我們分解的好壞呢,式子3,給出了衡量標準,也就是損失函式,平方項損失,最後的目標,就是每一個元素(非缺失值)的e(i,j)的總和 最小
式子3
OK,目前現在評分矩陣有了,損失函式也有了,該優化演算法登場了,下面式子4是,基於梯度下降的優化演算法,p,q裡面的每個元素的更新方式
式子4
然而,機器學習演算法都喜歡加一個正則項,這裡面對式子3稍作修改,得到如下式子5,beita 是正則引數
式子5
相應的p,q矩陣各個元素的更新也換成了如下方式
式子6
至此,P,Q矩陣元素求出來了之後,計算某個使用者i對某個物品j的評分計算就是p(i,1)*q(1,j)+p(i,2)*q(2,j)+…+p(i,k)*q(k,j)。
矩陣分解本質上都是在預測使用者對一個物品的偏好程度,哪怕不是預測評分,只是預測隱式反饋,也難逃這一個事實。
得到這樣的矩陣分解結果後,常常在實際使用時,又是用這個預測結果來排序。所以,從業者們稱想要模型的預測誤差最小化,結果繞了一大圈最後還是隻想要一個好點的排序。
這種針對單個使用者對單個物品的偏好程度進行預測,得到結果後再排序的問題,在排序學習中的行話叫做point-wise,其中point意思就是:只單獨考慮每個物品,每個物品像是空間中孤立的點一樣,與之相對的,還有直接預測物品兩兩之間相對順序的問題,就叫做pair-wise
之前說的矩陣分解都屬於point-wise模型。這類模型存在的問題是隻能收集到正樣本,沒有負樣本,於是認為缺失值就是負樣本,再以預測誤差為評判標準去使勁逼近這些樣本。逼近正樣本沒問題,但是同時逼近的負樣本只是缺失值而已,還不知道真正呈現在使用者面前,到底是不喜歡還是喜歡呢?雖然這些模型採取了一些措施來規避這個問題,比如負樣本取樣,但是尷尬還是存在的,為了排序而繞路也是事實。
更直接的推薦模型應該是:能夠較好地為使用者排列出更好的物品相對順序,而非更精確的評分。
針對以上問題提出的方法是:貝葉斯個性化排序,簡稱BPR模型
下一部介紹BPR演算法
相關文章
- 推薦系統-矩陣分解原理詳解矩陣
- 矩陣分解矩陣
- 基於概率的矩陣分解原理詳解(PMF)矩陣
- PHP陣列的詳細解讀PHP陣列
- 矩陣分解(MF)方法及程式碼矩陣
- C++指標的概念解讀 超詳細C++指標
- 詳細講解矩陣求逆的快速演算法(轉)矩陣演算法
- SVD矩陣分解考慮時間因素矩陣
- python輸入詳解(陣列、矩陣)Python陣列矩陣
- ML.NET 示例:推薦之矩陣分解矩陣
- NumPy 超詳細教程(1):NumPy 陣列陣列
- 文字主題模型之非負矩陣分解(NMF)模型矩陣
- 矩陣的奇異值分解(SVD)及其應用矩陣
- Java註解最全詳解(超級詳細)Java
- Go Struct超詳細講解GoStruct
- 用Spark學習矩陣分解推薦演算法Spark矩陣演算法
- ML.NET 示例:推薦之One Class 矩陣分解矩陣
- Spring AOP全面詳解(超級詳細)Spring
- 人工智慧-機器學習-演算法:非負矩陣分解(NMF)人工智慧機器學習演算法矩陣
- 強大的矩陣奇異值分解(SVD)及其應用矩陣
- NMF 非負矩陣分解(Non-negative Matrix Factorization)實踐矩陣
- 基於矩陣分解的協同過濾演算法矩陣演算法
- 手寫 Promise 詳細解讀Promise
- Dockerfile ,ADD詳細解讀Docker
- 超詳細的 Bert 文字分類原始碼解讀 | 附原始碼文字分類原始碼
- shell程式設計-sed命令詳解(超詳細)程式設計
- 推薦系統實踐 0x0b 矩陣分解矩陣
- SpringBoot註解最全詳解(整合超詳細版本)Spring Boot
- HTML 超級連結詳細講解HTML
- Oracle SCN機制詳細解讀Oracle
- Oracle AWR報告詳細解讀Oracle
- LINUX top命令詳細解讀Linux
- JavaScript 的 Date 最詳細解讀JavaScript
- WebUploader API 文件詳細解讀WebAPI
- PHP中return用法詳細解讀PHP
- 生成螺旋矩陣(方陣、矩陣)矩陣
- 【超詳細】解釋BigDecimal精度的坑Decimal
- Redis 主從複製詳細解讀Redis