【干货】网易云音乐歌单的推荐算法解析
網易云音樂的歌單推薦算法是怎樣的呢?最近有很多人關心這個問題。調查了一些網易云音樂的重度患者,小咖帶你來看一些路過大神的精辟分析。
分析一:
“商品推薦”系統的算法( Collaborative filtering )分兩大類:
第一類,以人為本,先找到與你相似的人,然后看看他們買了什么你沒有買的東西。這類算法最經典的實現就是“多維空間中兩個向量夾角的余弦公式”;
第二類, 以物為本直接建立各商品之間的相似度關系矩陣。這類算法中最經典是'斜率=1' (Slope One)。amazon發明了暴力簡化的第二類算法,‘買了這個商品的人,也買了xxx’。
我們先來看看第一類,最大的問題如何判斷并量化兩人的相似性,思路是這樣 --
例子:有3首歌放在那里,《最炫民族風》,《晴天》,《Hero》。
A君,收藏了《最炫民族風》,而遇到《晴天》,《Hero》則總是跳過;
B君,經常單曲循環《最炫民族風》,《晴天》會播放完,《Hero》則拉黑了
C君,拉黑了《最炫民族風》,而《晴天》《Hero》都收藏了。
我們都看出來了,A,B二位品味接近,C和他們很不一樣。
那么問題來了,說A,B相似,到底有多相似,如何量化?
我們把三首歌想象成三維空間的三個維度,《最炫民族風》是x軸,《晴天》是y軸,《Hero》是z軸,對每首歌的喜歡程度即該維度上的坐標,并且對喜歡程度做量化(比如: 單曲循環=5, 分享=4, 收藏=3, 主動播放=2 , 聽完=1, 跳過=-1 , 拉黑=-5 )。
那么每個人的總體口味就是一個向量,A君是 (3,-1,-1),B君是(5,1,-5),C君是(-5,3,3)。 (抱歉我不會畫立體圖)
我們可以用向量夾角的余弦值來表示兩個向量的相似程度, 0度角(表示兩人完全一致)的余弦是1, 180%角(表示兩人截然相反)的余弦是-1。
根據余弦公式, 夾角余弦 = 向量點積/ (向量長度的叉積) = ( x1x2 + y1y2 + z1z2) / ( 跟號(x1平方+y1平方+z1平方 ) x 跟號(x2平方+y2平方+z2平方 )
可見 A君B君夾角的余弦是0.81 , A君C君夾角的余弦是 -0.97 ,公式誠不欺我也。
以上是三維(三首歌)的情況,如法炮制N維N首歌的情況都是一樣的。
假設我們選取一百首種子歌曲,算出了各君之間的相似值,那么當我們發現A君還喜歡聽的《小蘋果》B君居然沒聽過,相信大家都知道該怎么和B君推薦了吧。
第一類以人為本推薦算法的好處我想已經很清楚了,那就是精準!代價是運算量很大,而且對于新來的人(聽得少,動作少),也不太好使,所以人們又發明了第二類算法。
假設我們對新來的D君,只知道她喜歡最炫民族風,那么問題來了,給她推薦啥好咯?
如圖,推薦《晴天》!
呵呵,第二類算法的好處大家也看出來了,簡單粗暴好操作(也適合map-reduce),可精度差了點。
所以,各家網站真正的推薦算法,是他們在綜合上述兩類算法的基礎上,各自研制并且不斷地改進調節的,外人不得而知! ^_^
多謝 @劉彥彬 給了一個非常專業的評論 ,不貼出來可惜了。
“這個只能說是理論基礎。歌曲不考慮熱門冷門,同時不考慮用戶數和歌曲數計算復雜度的話第一一天內離線數據計算不完的(當然網易云音樂用戶量小全量暴力計算當我沒說),實際應用起來復雜很多了。現在的推薦系統并不存在一種算法通吃,除了算法上的問題,還需要考慮基礎數據的影響因素,比如兩張歌單有多少歌曲重合,歌單的質量是怎么樣的。”
我上一帖也說了,“向量夾角余弦” 解決的是“量化顧客口味相似度”的問題(是最經典的解法,也有別的解法),不是有了它就能輕易實現第一類算法的,難處在后面咯。
我不是干‘CF/算法/數據挖掘/互聯網’的,只是幾年前偶爾瞄到過這方面文章被驚艷了一下,見到這題就隨口抖了個機靈,然后被評論區幾位帶板凳來的朋友給推上來了 ^_^
既然大家都這么有興趣,我在來拋塊磚,說說“有了理論基礎之后咋整”的思(nao3)考(dong4)。
繼續第一類算法的話題,目標“每日歌曲推薦”(其實題主感興趣的是這個吧,旁邊‘根據你喜歡的xxx推薦的yyy歌單’我覺得不咋樣)。
首先就是如何定維度。直接用‘歌’當維度是不行的,第一是太多了算不過來,第二維度數一直猛漲也不是個事。
用‘歌單’或者‘專輯’,‘演唱/演奏者’呢?也有類似的困難。說到這里大家應該都意識到了,咱不是還有‘tag’嘛!
云音樂初期,tag是可以由大家自己填的,我記得我填過‘莫扎特’,‘鋼協’,‘交響’這樣的tag,現在都不見了吧。一段時間之后,tag無法自填了,只能從云音樂給的tag lib中選,這肯定有原因的。
我的推測就是,他們需要用tag來當作維度,所以不希望tag數經常變化。
第一階段,他們需要搜集用戶的輸入來做出tag lib。
第二階段,他們構建了多維度空間,就不希望再動維度了,因此關閉了自填tag的功能。
假設就用tag做為維度,那么第二個難處在于,維度上的'刻度'必須有正有負才好使,用戶沒有機會直接表達對tag的好惡(不能收藏,播放,跳過一個tag),如何定刻度呢。
我認為每一首歌背后是有其所屬tags這個屬性的,這個屬性在UI上看不到很可能是因為比較容易引起口水。
歌往往隸屬于很多歌單,而那些歌單都是有tags的,根據那些歌單的播放數收藏數分享數可以決定其“權威性”,取“權威性”高的歌單的tag,就可以得到每首歌的tag屬性。
然后用戶在表達對一首首歌的好惡的時候,其實就不知不覺地影響了他在相應維度上的刻度。
假設維度和刻度都這樣解決,那么我們可以對每個用戶做出“口味向量”了,接下來的難處是,啥時候算/如何保存“用戶相似性”?所有用戶兩兩算一下相似性,存為一個NxN的矩陣,這種事情不是鬧這玩的。
其實到了這一步,不考慮‘以人為本’,直接根據我喜歡的tag,從各tag里挑一些人氣高的,或者躥升快的歌來推薦也算是能交差了。
不過那樣的話,就容易同質化,也就不易讓用戶‘驚艷’了。讓我們繼續沿著第一類算法的思路琢磨琢磨。
多維度空間還有一大好處是,有‘像限’這種的概念,比如我們可以粗暴地假設,和我同一個像限的人,就是和我‘相似’的人,如果因為維度太多,或者初期用戶太少等原因找不到同像限的人, 還可以去‘相鄰’的像限找嘛。
OK,假設我們根據tag以及自己的象限,找到了一批和自己‘氣味相投’的人。再叢這批人中,選幾個‘和我夾角余弦’最大(再綜合一下個人名聲比如星標,粉絲數,和我的互動度等,更好)的人,從他們聽過而我沒聽過的歌中,再選一批 他們喜歡,或者他們新聽到,新收藏,或者總人氣高的等等,就可以說是“根據我的口味生成”的“每日歌曲推薦”了。
分析二:
這里我想給大家介紹另外一種推薦系統,這種算法叫做潛在因子(Latent Factor)算法。這種算法是在NetFlix(沒錯,就是用大數據捧火《紙牌屋》的那家公司)的推薦算法競賽中獲獎的算法,最早被應用于電影推薦中。這種算法在實際應用中比現在排名第一的 @邰原朗 所介紹的算法誤差(RMSE)會小不少,效率更高。我下面僅利用基礎的矩陣知識來介紹下這種算法。
這種算法的思想是這樣:每個用戶(user)都有自己的偏好,比如A喜歡帶有小清新的、吉他伴奏的、王菲等元素(latent factor),如果一首歌(item)帶有這些元素,那么就將這首歌推薦給該用戶,也就是用元素去連接用戶和音樂。每個人對不同的元素偏好不同,而每首歌包含的元素也不一樣。我們希望能找到這樣兩個矩陣:
一,用戶-潛在因子矩陣Q,表示不同的用戶對于不用元素的偏好程度,1代表很喜歡,0代表不喜歡。比如下面這樣:
二,潛在因子-音樂矩陣P,表示每種音樂含有各種元素的成分,比如下表中,音樂A是一個偏小清新的音樂,含有小清新這個Latent Factor的成分是0.9,重口味的成分是0.1,優雅的成分是0.2……
利用這兩個矩陣,我們能得出張三對音樂A的喜歡程度是:張三對小清新的偏好*音樂A含有小清新的成分+對重口味的偏好*音樂A含有重口味的成分+對優雅的偏好*音樂A含有優雅的成分+……
即:0.6*0.9+0.8*0.1+0.1*0.2+0.1*0.4+0.7*0=0.69
每個用戶對每首歌都這樣計算可以得到不同用戶對不同歌曲的評分矩陣
。(注,這里的破浪線表示的是估計的評分,接下來我們還會用到不帶波浪線的R表示實際的評分):
因此我們隊張三推薦四首歌中得分最高的B,對李四推薦得分最高的C,王五推薦B。
如果用矩陣表示即為:
下面問題來了,這個潛在因子(latent factor)是怎么得到的呢?
由于面對海量的讓用戶自己給音樂分類并告訴我們自己的偏好系數顯然是不現實的,事實上我們能獲得的數據只有用戶行為數據。我們沿用 @邰原朗的量化標準:單曲循環=5, 分享=4, 收藏=3, 主動播放=2 , 聽完=1, 跳過=-2 , 拉黑=-5,在分析時能獲得的實際評分矩陣R,也就是輸入矩陣大概是這個樣子:
事實上這是個非常非常稀疏的矩陣,因為大部分用戶只聽過全部音樂中很少一部分。如何利用這個矩陣去找潛在因子呢?這里主要應用到的是矩陣的UV分解。也就是將上面的評分矩陣分解為兩個低維度的矩陣,用Q和P兩個矩陣的乘積去估計實際的評分矩陣,而且我們希望估計的評分矩陣
和實際的評分矩陣不要相差太多,也就是求解下面的目標函數:
這里涉及到最優化理論,在實際應用中,往往還要在后面加上2范數的罰項,然后利用梯度下降法就可以求得這P,Q兩個矩陣的估計值。這里我們就不展開說了。例如我們上面給出的那個例子可以分解成為這樣兩個矩陣:
這兩個矩陣相乘就可以得到估計的得分矩陣:
將用戶已經聽過的音樂剔除后,選擇分數最高音樂的推薦給用戶即可(紅體字)。
在這個例子里面用戶7和用戶8有強的相似性:
從推薦的結果來看,正好推薦的是對方評分較高的音樂:
文章來源:知乎
歡迎大家關注pmcaff公眾賬號,近期會有產品經理免費培訓課。
1.請回復公眾賬號“免費培訓”查看詳情。
2.點擊原文鏈接可直接參與報名。
pmcaff合作媒體:Chinaz
更多精彩推薦
回復“31”——【干貨】騰訊產品大拿告訴你,用戶體驗是這樣設計的!!!
回復“32”——【專訪】小米產品經理顛覆早教行業,欲送給孩子1000萬美金的人生
回復“33”——【產品】阿里產品經理內訓:能力模型解讀
回復“34”——【重溫經典】張小龍:微信背后的產品觀
回復“35”——【專訪】PP租車張丙軍:“打虎親兄弟“,好團隊才能書寫互聯網傳奇
回復“36”——【干貨】產品經理的需求管理
回復“37”——【干貨】APP解構重構,讓你用戶不再流失
回復“38”——【干貨】產品經理解決問題七步法則
回復“39”——【運營】你不知道的HTML5的概念、方法和推廣實戰指南
回復“40”——【干貨】從蘋果ios8的發布,來細數那些精彩紛呈的引導頁
文章推薦可直接回復公眾賬號或者發送至xiaoxi@pmcaff.com,可根據推薦質量將推薦人邀請至pmcaff智囊團預備群中,原創或者推薦均可,歡迎來稿~
pmcaff愿見證你的成長
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的【干货】网易云音乐歌单的推荐算法解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【必知】国内最设计感的 App推荐
- 下一篇: 【干货】写给产品经理和设计师的用户体验说