這就是amazon發明的「喜歡這個商品的人,也喜歡某某」演算法。
其核心是數學中的「多維空間中兩個向量夾角的余弦公式」,當初我的確是被這演算法驚艷到了。
=============2014-12-01 更新 =============================
不好意思,之前說的有誤,特來更正兼補充。
「商品推薦」系統的演算法(
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君,只知道她喜歡最炫民族風,那麽問題來了,給她推薦啥好咯?