1. 程式人生 > >03_我不是潘金蓮,聊相似性推薦

03_我不是潘金蓮,聊相似性推薦

前幾天聊的“協同過濾(Collaborative Filtering)”和“基於內容的推薦(Content-based Recommendation)”,都必須分析使用者的歷史行為資料(例如電影點選資料,職位檢視資料等),針對不同的使用者進行個性化推薦。如果系統沒有使用者的歷史行為資料積累,如何實施推薦呢?

 

今天接著用通俗的語言說說推薦演算法中的“相似性推薦”。

 

什麼是“相似性推薦”?

:對於新使用者A,沒有ta的歷史行為資料,在ta點選了item-X的場景下,可以將與item-X最相似的item集合推薦給新使用者A。

 

問題轉化為,如何用一種通用的方法,表達item之間的相似性。

 

仍以電影推薦為例,新使用者A進入了《我不是潘金蓮》電影詳情頁,如何對A進行電影推薦呢?

 

先看二維空間的點N,如何推薦與其最近的點?

:可以用二維空間中,點與點之間的距離,表示點之間的遠近。

 

對於全集中的任何一個點M(xi, yi),它與點N(x1, y1)的距離:

distance = (x1-xi)^2 + (y1-yi)^2

所以,只要計算全集中所有點與N的距離,就能計算出與它最近的3個點。

 

再看三維空間的點N,如何推薦與其最近的點?

:可以用三維空間中,點與點之間的距離,表示點之間的遠近。

 

對於全集中的任何一個點M(xi, yi, zi),它與點N(x1, y1, z1)的距離:

distance = (x1-xi)^2 + (y1-yi)^2 + (z1-zi)^2

所以,只要計算全集中所有點與N的距離,就能計算出與它最近的3個點。

 

循序漸進,對於一部電影《我不是潘金蓮》,假設它有10個屬性,則可以把它看做一個十維空間中的點:

點N《我不是潘金蓮》

{

導演:馮小剛

女主:范冰冰

男主:郭濤

女配:張嘉譯

男配:大鵬

型別:劇情

地區:中國大陸

語言:普通話

日期:2016

片長:140

}

 

對於電影全集中的任何一部電影,都可以計算與點N《我不是潘金蓮》之間的距離。二維三維中的點,可以用直線距離計算遠近,10維空間{導演, 女主, 男主, 女配, 男配, 型別, 地區, 語言, 日期, 片長}中的兩個點的距離,需要重新定義一個距離函式,例如:

distance = f1(導演) + f2(女主) + … +f10(片長)

這個距離,通俗的解釋,就是每個維度貢獻分值的總和。

 

分值可以這麼定義:

f1(導演){

         如果兩部電影導演相同,得1分;

         如果導演不同,得0分;

}

 

例如,現在10維空間中,有另一個點M《芳華》

{

導演:馮小剛

女主:苗苗

男主:黃軒

女配:NULL

男配:NULL

型別:劇情

地區:中國大陸

語言:普通話

日期:2017

片長:140

}

 

要計算點M《芳華》與點N《我不是潘金蓮》的距離,代入distance距離計算公式:

distance = f1(導演) + f2(女主) + … +f10(片長)

         =1 + 0 + … + 1

         =5

即:導演、型別、地區、語言、片長相同各得1分,其他維度不同得0分。

 

遍歷電影全集中的10w部電影,就能找到與點N《我不是潘金蓮》最相近的3部電影,當用戶點選《我不是潘金蓮》的詳情頁時,直接推薦這3部最相近的電影即可。

 

相似性推薦,原理大致如上,要說明的是:

  • 由於沒有使用者歷史行為積累,不是個性化推薦,所以所有使用者的推薦結果都是相同的

  • 一般來說,距離公式確實是線性的

  • 一般來說,每個維度的權重不一樣

  • 這個線性公式,以及維度的權重,都可以通過機器學習訓練出來

 

相似性推薦,希望這1分鐘,大家能有收穫。

 

人肉推薦:

《1分鐘瞭解協同過濾,pm都懂了》

《1分鐘瞭解基於內容的推薦,pm又懂了》


原創: 58沈劍 架構師之路