精簡推薦演算法

左眼眸子發表於2018-08-19

工程方向的程式設計師看到演算法相關的技術內心都會有或多或少的膽怯,但如果認真研究之後,其實會發現並沒有那麼難的。下面來介紹下市面上出現的各類推薦演算法的實現原理:

協同過濾

什麼是協同過濾?

維基百科:協同過濾簡單來說是利用某興趣相投、擁有共同經驗之群體的喜好來推薦使用者感興趣的資訊。

簡要步驟

  • 找到使用者A收藏的電影。
  • 找到喜歡使用者A收藏電影的使用者人群集合。
  • 找到該群體喜歡的電影集合
  • 將這些電影集合排序,從重合度高到低推薦給使用者A。

具體步驟

  1. 查詢到A使用者喜歡{movie_1, movie_2, movie_3}電影。
  2. 再根據電影集合查詢到喜歡該電影的人物集合movie_1{user_1, user_3, user_5}, movie_2{user_1, user_11, user_12}, movie_3{user_1, user_3, user_7};得到人物重合比較高的集合{user_1, user_3}。
  3. 找出該群體集合喜歡的電影user_1{movie_1, movie_2, movie_3, movie_7, movie_9}, user_3{movie_1, movie_3, movie_8, movie_18}
  4. 將電影合併並去除A喜歡的電影生成集合{movie_7, movie_9, movie_8, movie_18}推薦給使用者A。

內容推薦

什麼是內容推薦?

通過使用者歷史感興趣的資訊,抽象資訊內容共性,根據內容共性推薦其他資訊。

簡要步驟

  • 找到使用者A收藏的職位。
  • 分解各個職位的內容。
  • 抽象化內容的共性內容。
  • 由這些共性內容找到其他職位推薦給使用者A。

具體步驟

  1. 得到求職者A訪問過的三個職位,假設為{positions1, positions2, position3}
  2. 根據職位集合得到職位內容:
    position1 -> {程式設計師, 杭州, 薪資7000, 3年經驗}
    position1 -> {程式設計師, 杭州, 薪資8000, 4年經驗}
    position1 -> {程式設計師, 杭州, 薪資7000, 3年經驗}
    資料可以從資料庫得到。
  3. 得到的共性資訊: {程式設計師, 杭州, 薪資7000, 3年經驗}
  4. 由這些共性內容查詢其他職位並實施推薦 以{程式設計師, 杭州, 薪資7000,3年經驗}為查詢條件,查詢職位資料庫,並按照一些規則進行排序(例如,最新發布的職位先推薦,點選過的職位不推薦等),完成推薦。

注意:如果查詢的結果集過小,可以縮小條件召回,例如可以將查詢條件縮小為{程式設計師, 杭州, 薪資7000},這是為了理解舉的最簡單的例子。下面會統一介紹給各個維度增加權重的演算法。

相似性推薦

以上介紹的兩個推薦演算法都是需要根據使用者的行為資料來分析推薦的(例如:電影收藏,職位收藏)。如果使用者沒有行為資料,就是一個使用者剛註冊登入進來,應該怎麼推薦?

什麼是相似性推薦?

比如使用者A點選進入了item_1,就推薦和item_1電影最相似影集合items給他。那麼問題就轉化為,如何用一種通用的方法,表達item之間的相似性。

我們仍舊以電影為例子,如果新使用者進入了《西虹市首富》的詳情,那應該推薦什麼電影給他?

複習下多維空間的概念:

二維空間的點N,如何得到與其最近的點?

answer:可以用二維空間中,點與點之間的距離,表示點與點之間的遠近。對於全集中的任何一個點M(x1, y1),它與點N(x2, y2)的距離:

distance = (x1-x2)^2 + (y1-y2)^2

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

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

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

對於全集中的任何一個點M(x2, y2, z2),它與點N(x1, y1, z1)的距離: distance = (x1-x2)^2 + (y1-y2)^2 + (z1-z2)^2 所以,只要計算全集中所有點與N的距離,就能得到與它最近的3個點。

循序漸進,對於一部電影《西虹市首富》,假設它有7個屬性,則可以把它看做一個7維空間中的

點N{
導演:閆非
主演:沈騰
型別:喜劇
地區:中國大陸
語言:普通話
日期:2018
片長:118分鐘
}

計算電影集合中的每個電影到《西虹市首富》的距離,那麼公式就是:

distance = f1(導演) + f2(主演) + f3(型別) + ... + +f7(片長)

這個距離,通俗的解釋,就是每個維度貢獻分值的總和。 f函式我們可以這麼定義:

f1(導演){
     如果兩部電影導演相同,得1分;
     如果導演不同,得0分;
}
複製程式碼

現在我們來看一下另一部電影《夏洛特煩惱》:

點M{
導演:閆非
主演:沈騰
型別:喜劇
地區:中國大陸
語言:普通話
日期:2012
片長:100分鐘
}

計算點N《西虹市首富》和點M《夏洛特煩惱》得到

distance = f1(導演) + f2(主演) + f3(型別) + ... + +f7(片長)     
=1 + 1 + 1 + 1 + 1 + 0 + 0   
= 5
即導演,主演,型別,地區,語言各得1分
複製程式碼

遍歷電影全集中的10w部電影,就能找到與點N《西虹市首富》最相近的3部電影,當使用者點選《西虹市首富》的詳情頁時,直接推薦這3部最相近的電影即可。

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

  • 由於沒有使用者歷史行為積累,所以所有使用者進入一個電影的推薦結果都是相同的
  • 一般來說,距離公式確實是線性的
  • 一般來說,每個維度的權重不一樣
  • 一般來說,f1和f2的計算公式也可以不一樣
  • 這個線性公式,以及維度的權重,都可以通過機器學習訓練出來

關聯規則推薦

什麼是關聯規則?

百科:關聯規則是形如X→Y的蘊涵式,其中,X和Y分別稱為關聯規則的先導(antecedent或left-hand-side, LHS)和後繼(consequent或right-hand-side,RHS)。其中,關聯規則XY,存在支援度和信任度。

關聯規則推薦

關聯規則是資料探勘中的概念,通過分析資料找到兩個物品直接的關聯關係,電商中經常用來分析購買商品之間的關聯關係,而商品本身並不存在明確的關係。例如:“購買尿布的使用者有很大的概率會購買啤酒”,這就是一個最典型的關聯規則。

證明:當尿布放入購物車之後,再推薦啤酒直接推薦啤酒能獲得更好的售賣效果。

推薦步驟

比如資料庫存著5個購物車{A, B, C, D}, {A, C}, {A, B, C}, {A, C, D}, {A, B, D}。

  1. 計算關聯規則(組合商品)的支援度

共5筆訂單,4筆包含商品A,A的支援度是1。B的支援度是3/5

組合商品也有支援度:共5筆訂單,3筆同時包含AB,即A->B的支援度是3/5。B->C的支援度是2/5。支援度評估商品包含在訂單中的“概率”,一個訂單,有多大概率包含這個商品。

  1. 計算關聯規則的置信度

已知購買了A,有多大概率購買了B(即同時購買了AB),稱A -> B的置信度。

分析購物車可以看到,商品A有5次購買,這5次中有3次購買了B,A->B的置信度是3/5。

confidence(A->B) = support(A->B)/support(A)= (3/5)/(5/5) = 3/4
注意:X->Y與Y->X的置信度不一定相等。
比如A->B的置信度是3/5,買商品A時,3/5概率會買B,B->A的置信度是1,買商品B時,100%會買A。
複製程式碼
  1. 計算關聯規則的提升度

上面例子裡,confidence(B->A)=1,即:如果使用者購買商品B,100%會買A,那是不是意味著,如果使用者將商品B放入購物車,就可以向使用者推薦商品A呢?

當然不是,我們來回顧一下,關聯規則推薦的目標,是希望達到當尿布放入購物車之後,再推薦啤酒直接推薦啤酒能獲得更好的售賣效果。

雖然購買商品B,100%會買A,但直接推薦A,使用者也100%會買A,會發現,購買A與購買B是獨立事件,使用者買不買A和使用者買不買B沒有直接關係。這裡的關聯規則推薦,並沒有比直接推薦獲取更好的效果。

那我們就要用提升度(lift)來評估關聯效果了,A->B關聯規則推薦,與直接推薦B,的比值,可以用來評估推薦效果:

  • 大於1,說明有效,在購買A時推薦B,比直接推薦B,效果更好
  • 等於1,說明無關,購買A與購買B,是獨立事件
  • 小於1,說明負相關,購買A時推薦B,效果還不如直接推薦B
lift(A->B) =confidence(A->B)/support(B)
分子:confidence(A->B),購買A時,有多大概率同時購買B
分母:support(B),有多大概率直接購買B
複製程式碼

來看看關聯規則B->D,與直接推薦D,效果有沒有提升:

  • 有3個訂單購買B,這3個訂單中有2個訂單購買了D,所以B->D的置信度是2/3,即買了B有2/3的概率會買D
  • 直接推薦B的話,5個訂單中有3個購買了D,所以D的支援度是3/5,即有3/5的概率會直接買D

會發現,關聯規則推薦的效果更好。

再來來看看關聯規則C->D,與直接推薦D,效果有沒有提升:

  • 有4個訂單購買C,這4個訂單中有2個訂單購買了D,所以C->D的置信度是1/2,即買了C有1/2的概率會買D
  • 直接推薦D的話,5個訂單中有3個購買了D,所以D的支援度是3/5,即有3/5的概率會直接買D

會發現,關聯規則推薦的效果很差,還不如直接推薦。

  1. 總結

關聯規則A->B推薦,目標是,在“使用者將A放入購物車時,推薦B”比“單獨推薦B”獲取更好的效果

  • A->B的支援度,是使用者同時購買A和B概率
  • A->B的置信度,是使用者購買A的同時,有多大概率購買B
  • A->B的提升度,是“使用者購買A的同時,有多大概率購買B”與“直接購買B的概率”的比值

個性化推薦

不知道大家有沒有經歷過殺熟的現象,比如今年新聞聯播報導:相同起點,相同終點的兩個手機叫車,價格不一樣。

年也有新聞引起過激烈的討論:相同的起點,相同終點的兩個使用者買飛機票,機票價格不一樣。

下面我就用通俗的語言說說此類“個性化價格”是如何實現的。

方式一:使用者分級

對使用者進行分級,不同型別的使用者會有不同的補貼,定價,營銷策略。

待拉新使用者

  • 競品使用者:簡訊發大額優惠券營銷
  • 競品重合使用者:簡訊發優惠券營銷
  • 沉默使用者:定額微信紅包喚醒

首單使用者:大額折扣券或者直減券

非首單使用者

  • 2單使用者:降低優惠券金額試探
  • 3單使用者:降低優惠券金額試探
  • 疑似粘性使用者:隨機優惠券試探
  • 強粘性使用者:意思意思優惠券

所以,對於“相同起點,相同終點的兩個手機叫車”,可能出現:新手便宜,熟客貴。

方式二:個性化推薦

對使用者的歷史行為進行分析,抽象使用者的標籤,針對不同標籤的使用者進行不同的補貼,定價,營銷策略。

例如 平臺可以從日誌中分析出使用者A的歷史特徵是:

  • 有優惠券也不使用
  • 等待30秒沒人接單就加價
  • 等待60秒沒人接單就打專車 可以分析出:使用者A是土豪,對接單時間敏感,對價格不敏感

從日誌中分析出使用者B的歷史行為特徵是:

  • 沒有優惠券就不下蛋
  • 寧願等待10分鐘也不加價
  • 從不打專車,也絕不在高峰期(價格會加倍)叫車 可以分析出:使用者B是屌絲,對價格敏感,以省錢為優先

於是,使用者A和使用者B同時叫車,可能出現:

  • 時間敏感的使用者A貴
  • 價格敏感的使用者B便宜

從歷史資料,一定能還原出真實的你,“殺熟,殺豪”是個性化價格的兩大利器。

相關文章