“網(wǎng)易云音樂(lè)”里有一項(xiàng)類似于淘寶“我的喜好”的“日推”功能,根據(jù)你經(jīng)常聽(tīng)的歌曲類型,每日推送給你類似的音樂(lè),幾乎次次驚艷,而且大多都沒(méi)聽(tīng)過(guò),或者好久以前聽(tīng)過(guò)早就忘記了名字,或者之前不知道在哪聽(tīng)過(guò) 只是知道其中一部分旋律,根本不知道名字,等等。
參考了在北京實(shí)習(xí)時(shí)一個(gè)同事的分享以及在“知乎”上大神們的介紹,本文暫不考慮算法實(shí)現(xiàn),僅僅從算法本身來(lái)學(xué)習(xí)一番,對(duì)IT世界里一些腦洞大開(kāi)的想法做以分享。
如圖,是日推算法的兩種實(shí)現(xiàn)思路:
這種算法是在NetFlix(沒(méi)錯(cuò),就是用大數(shù)據(jù)捧火《紙牌屋》的那家公司)的推薦算法競(jìng)賽中獲獎(jiǎng)的算法,具體用在日推上的套路是這樣:
1、思路
每個(gè)用戶(user)都有自己的偏好,比如A喜歡帶有小清新的、吉他伴奏的、李健等元素(其實(shí)就是標(biāo)簽),如果一首歌(item)帶有這些元素,那么就將這首歌推薦給該用戶,也就是用元素去連接用戶和音樂(lè)。
2、實(shí)現(xiàn): 每個(gè)人對(duì)不同的元素偏好不同,而每首歌包含的元素也不一樣。模擬這樣兩個(gè)矩陣: (1)用戶-潛在因子矩陣Q: 表示不同的用戶對(duì)于不用元素的偏好程度,1代表很喜歡,0代表不喜歡。比如下面這樣:
(2)潛在因子-音樂(lè)矩陣P 表示每種音樂(lè)含有各種元素的成分,比如下表中,音樂(lè)A是一個(gè)偏小清新的音樂(lè),含有小清新這個(gè)Latent Factor的成分是0.9,重口味的成分是0.1,優(yōu)雅的成分是0.2……
利用這兩個(gè)矩陣,我們能得出張三對(duì)音樂(lè)A的喜歡程度是:張三對(duì)小清新的偏好*音樂(lè)A含有小清新的成分+對(duì)重口味的偏好*音樂(lè)A含有重口味的成分+對(duì)優(yōu)雅的偏好*音樂(lè)A含有優(yōu)雅的成分+……
即:0.6*0.9+0.8*0.1+0.1*0.2+0.1*0.4+0.7*0=0.69 每個(gè)用戶對(duì)每首歌都這樣計(jì)算可以得到不同用戶對(duì)不同歌曲的評(píng)分矩陣/tilde{R} 。(注,這里的破浪線表示的是估計(jì)的評(píng)分,接下來(lái)我們還會(huì)用到不帶波浪線的R表示實(shí)際的評(píng)分):
因此我們隊(duì)張三推薦四首歌中得分最高的B,對(duì)李四推薦得分最高的C,王五推薦B。 如果用矩陣表示即為: {R} =QP^{T} 下面問(wèn)題來(lái)了,這個(gè)潛在因子(latent factor)是怎么得到的呢? 由于面對(duì)海量的讓用戶自己給音樂(lè)分類并告訴我們自己的偏好系數(shù)顯然是不現(xiàn)實(shí)的,事實(shí)上我們能獲得的數(shù)據(jù)只有用戶行為數(shù)據(jù)。我們沿用 @邰原朗的量化標(biāo)準(zhǔn):?jiǎn)吻h(huán)=5, 分享=4, 收藏=3, 主動(dòng)播放=2 , 聽(tīng)完=1, 跳過(guò)=-2 , 拉黑=-5,在分析時(shí)能獲得的實(shí)際評(píng)分矩陣R,也就是輸入矩陣大概是這個(gè)樣子:
事實(shí)上這是個(gè)非常非常稀疏的矩陣,因?yàn)榇蟛糠钟脩糁宦?tīng)過(guò)全部音樂(lè)中很少一部分。如何利用這個(gè)矩陣去找潛在因子呢?這里主要應(yīng)用到的是矩陣的UV分解。也就是將上面的評(píng)分矩陣分解為兩個(gè)低維度的矩陣,用Q和P兩個(gè)矩陣的乘積去估計(jì)實(shí)際的評(píng)分矩陣,而且我們希望估計(jì)的評(píng)分矩陣{R}
和實(shí)際的評(píng)分矩陣不要相差太多,也就是求解下面的目標(biāo)函數(shù): min_{P,Q} /Sigma (r_{ui}-q_{i}p_{u}^{T})^2
這里涉及到最優(yōu)化理論,在實(shí)際應(yīng)用中,往往還要在后面加上2范數(shù)的罰項(xiàng),然后利用梯度下降法就可以求得這P,Q兩個(gè)矩陣的估計(jì)值。這里我們就不展開(kāi)說(shuō)了。例如我們上面給出的那個(gè)例子可以分解成為這樣兩個(gè)矩陣:
這兩個(gè)矩陣相乘就可以得到估計(jì)的得分矩陣:
將用戶已經(jīng)聽(tīng)過(guò)的音樂(lè)剔除后,選擇分?jǐn)?shù)最高音樂(lè)的推薦給用戶即可(紅體字)。
添加標(biāo)簽的思想在我們寫(xiě)CSDN博客的時(shí)候,其實(shí)就有了,通過(guò)分類,細(xì)化查詢。
1、發(fā)明 amazon發(fā)明的“喜歡這個(gè)商品的人,也喜歡某某”算法。其核心是數(shù)學(xué)中的“多維空間中兩個(gè)向量夾角的余弦公式”。 “商品推薦”系統(tǒng)的算法( Collaborative filtering )分兩大類,第一類,以人為本,先找到與你相似的人,然后看看他們買了什么你沒(méi)有買的東西。這類算法最經(jīng)典的實(shí)現(xiàn)就是“多維空間中兩個(gè)向量夾角的余弦公式”;第二類, 以物為本直接建立各商品之間的相似度關(guān)系矩陣。這類算法中最經(jīng)典是'斜率=1' (Slope One)。amazon發(fā)明了暴力簡(jiǎn)化的第二類算法,‘買了這個(gè)商品的人,也買了xxx’。 我們先來(lái)看看第一類,最大的問(wèn)題如何判斷并量化兩人的相似性,思路是這樣 -- 例子: 有3首歌放在那里,《最炫民族風(fēng)》,《晴天》,《Hero》。 A君,收藏了《最炫民族風(fēng)》,而遇到《晴天》,《Hero》則總是跳過(guò); B君,經(jīng)常單曲循環(huán)《最炫民族風(fēng)》,《晴天》會(huì)播放完,《Hero》則拉黑了 C君,拉黑了《最炫民族風(fēng)》,而《晴天》《Hero》都收藏了。 我們都看出來(lái)了,A,B二位品味接近,C和他們很不一樣。 那么問(wèn)題來(lái)了,說(shuō)A,B相似,到底有多相似,如何量化? 我們把三首歌想象成三維空間的三個(gè)維度,《最炫民族風(fēng)》是x軸,《晴天》是y軸,《Hero》是z軸,對(duì)每首歌的喜歡程度即該維度上的坐標(biāo),并且對(duì)喜歡程度做量化(比如: 單曲循環(huán)=5, 分享=4, 收藏=3, 主動(dòng)播放=2 , 聽(tīng)完=1, 跳過(guò)=-1 , 拉黑=-5 )。那么每個(gè)人的總體口味就是一個(gè)向量,A君是 (3,-1,-1),B君是(5,1,-5),C君是(-5,3,3)。 我們可以用向量夾角的余弦值來(lái)表示兩個(gè)向量的相似程度, 0度角(表示兩人完全一致)的余弦是1, 180%角(表示兩人截然相反)的余弦是-1。 根據(jù)余弦公式, 夾角余弦 = 向量點(diǎn)積/ (向量長(zhǎng)度的叉積) = ( x1x2 + y1y2 + z1z2) / ( 跟號(hào)(x1平方+y1平方+z1平方 ) x 跟號(hào)(x2平方+y2平方+z2平方 ) ) 可見(jiàn)A君B君夾角的余弦是0.81 ,A君C君夾角的余弦是 -0.97 ,公式誠(chéng)不欺我也。 以上是三維(三首歌)的情況,如法炮制N維N首歌的情況都是一樣的。 假設(shè)我們選取一百首種子歌曲,算出了各君之間的相似值,那么當(dāng)我們發(fā)現(xiàn)A君還喜歡聽(tīng)的《小蘋(píng)果》B君居然沒(méi)聽(tīng)過(guò),相信大家都知道該怎么和B君推薦了吧。
第一類以人為本推薦算法的好處我想已經(jīng)很清楚了,那就是精準(zhǔn)!代價(jià)是運(yùn)算量很大,而且對(duì)于新來(lái)的人(聽(tīng)得少,動(dòng)作少),也不太好使,所以人們又發(fā)明了第二類算法。假設(shè)我們對(duì)新來(lái)的D君,只知道她喜歡最炫民族風(fēng),那么問(wèn)題來(lái)了,給她推薦啥好咯?
如圖,推薦《晴天》! 第二類算法的好處大家也看出來(lái)了,簡(jiǎn)單粗暴好操作,可精度差了點(diǎn)。 所以,各家網(wǎng)站真正的推薦算法,是他們?cè)诰C合上述兩類算法的基礎(chǔ)上,各自研制并且不斷地改進(jìn)調(diào)節(jié)的,外人不得而知!
由此可見(jiàn),通過(guò)類似amazon以及紙牌屋中的算法分析,網(wǎng)友們預(yù)測(cè)了網(wǎng)易云音樂(lè)的日推算法,也讓小菜的我領(lǐng)略到了算法世界的神奇,只有想不到,一旦想到了就能做到。
附注:(知乎中的討論帖)。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注