1. 程式人生 > >推薦系統三十六式:近鄰推薦 學習筆記

推薦系統三十六式:近鄰推薦 學習筆記

 

1.重點歸納

1)協同過濾演算法分兩類:

(1)基於記憶的協同過濾:就是記住每個使用者消費過的物品,然後給他推薦相似的東西,或者推薦相似的人消費的東西。

(2)基於模型的協同過濾:從使用者物品關係矩陣中學習一個模型,從而把矩陣空白處填滿。

2)基於人的協同過濾的步驟

(1)準備使用者向量,構造稀疏矩陣。

(2)用每個使用者的向量,兩兩計算使用者之間的相似度,設定一個相似度閾值或者設定一個最大數量,為每個使用者保留與其最相似的使用者。

(3)為每個使用者產生推薦結果:把相似使用者們喜歡過的物品彙總起來,去掉使用者自己消費過的物品,剩下的排序輸出推薦結果

使用者u與物品i的匹配分數:

為使用者u與使用者j之間(使用者u和j是相似使用者)的相似度

Rj,i為使用者j對物品i的評分

3)基於物品的協同過濾步驟

(1)構建使用者物品的關係矩陣。矩陣元素是使用者的消費行為,也可以是消費後的評價,還可以是對消費行為的某種量化如時間、次數、費用。

(2)假如矩陣的行為表示物品,列表示使用者的話,行向量之間的兩兩計算相似度得到物品相似度矩陣(行和列都是物品)

(3)產生推薦結果。根據推薦場景不同,可以是為某個物品推薦相關的物品,也可以是在個人首頁產生的類似“猜你喜歡”的推薦結果。

4)基於物品的協同過濾計算推薦結果

(1)Top K推薦,形式上屬於類似“猜你喜歡”

  • 彙總和“使用者已經消費過的物品相似”的物品,按照彙總後的分數從高到低推出
  • 使用者u對物品i的分數:
    • 使用者評分過的物品共m個
    • sim(i,j)為使用者評分過的物品j與物品i的相似度
  • 不需要對所有物品都計算一遍,只需要按照使用者評分過的物品,逐一取出來和它們相似的物品出來就可以

(2)相關推薦

  • 這類推薦不需要提前合併計算,當用戶訪問一個物品詳情頁面時/完成一個物品消費的結果頁面,直接獲取這個物品相似的物品推薦,就是“看了又看”或者“買了又買”的推薦結果

5)傑卡德相似度只適合布林值向量,餘弦相似度彈性略大適合兩種向量。歐式距離度量是絕對值差異,餘弦相似度的是方向的差異,但是調整的餘弦相似度則可以避免這個弱點。

2.人以群分,你是什麼人就看到什麼世界

1)協同過濾

(1)通過基於內容的推薦階段,我們有了可觀的使用者行為,這些行為可以表達成一個使用者和物品的關係矩陣。

(2)協同過濾演算法分類

  • 基於記憶的協同過濾:就是記住每個使用者消費過的物品,然後給他推薦相似的東西,或者推薦相似的人消費的東西。
  • 基於模型的協同過濾:從使用者物品關係矩陣中學習一個模型,從而把矩陣空白處填滿。

2)基於使用者的協同過濾

(1)根據歷史消費行為幫你找到一群和你口味相似的使用者,然後根據這些和你相似的使用者再消費了新的,你沒有見過的物品都可以推薦給你。

(2)步驟

一、準備使用者向量,向量的特點:

  • 向量的維度就是物品的個數
  • 向量是稀疏的
  • 向量維度上 的取值可以是簡單的0/1布林值(1代表喜歡,0表示沒有),因為是稀疏向量,取值0忽略

二、用每個使用者的向量,兩兩計算使用者之間的相似度,設定一個相似度閾值或者設定一個最大數量,為每個使用者保留與其最相似的使用者。

三、為每個使用者產生推薦結果:把相似使用者們喜歡過的物品彙總起來,去掉使用者自己消費過的物品,剩下的排序輸出推薦結果。

使用者u與物品i的匹配分數:

為使用者u與使用者j之間(使用者u和j是相似使用者)的相似度。

Rj,i為使用者j對物品i的評分。

3)構造矩陣

使用稀疏矩陣儲存格式來構造矩陣,就可以使用常用的計算框架的標準輸入。

  • CSR:這個儲存方式稍微複雜點,是一個整體編碼方式。它有三個組成:數值、列號和行偏移共同編碼。
  • COO:這個儲存方式稍微簡單,每個元素用一個三元組表示(行號,列號,數值),只儲存有值的元素,缺失值不儲存。

4)相似度計算

(1)如果向量很長(物品很多),通常降低相似度計算複雜度的辦法有兩種:

  • 對向量取樣計算。例如100維的向量隨機取出10維向量來計算相似度,損失一些精度,但計算複雜度大幅度降低。
  • 向量化計算。把迴圈轉換成向量來直接計算。

(2)如果使用者量很大,緩解辦法:

  • 將相似度拆成Map Reduce任務,將原始矩陣Map成鍵為使用者對,值為兩個使用者對同一個物品的評分之積Reduce階段對這些乘積再求和,Map Reduce任務結束後再對這些值歸一化。
  • 不用基於使用者的協同過濾。
  • 如果資料量不大(一般不超過百萬),然後又是稀疏矩陣,單機版的工具更快,如KGraph、GraphCHI等工具。

5)計算推薦分數

(1)為使用者計算每一個物品的推薦分數代價太大了,只有相似使用者喜歡過的物品需要計算。

(2)把計算過程拆成Map Reduce任務

6)一些改進

(1)懲罰對熱門物品的喜歡程度。使用者可能是被煽動,或者是無聊點選,很難反應使用者的真實興趣。

(2)增加喜歡程度的時間衰減,一般使用一個指數函式,指數就是一個負數,值和喜歡行為發生時間間隔正相關即可。因為人的口味會改變。

7)應用場景

(1)基於使用者的協同過濾輸出

  • 相似的使用者列表
  • 基於使用者的推薦結果

不但可以推薦物品,還可以推薦使用者,如“相似粉絲”、“和你口味相同的人”等功能。

(2)基於使用者的協同過濾強調個人私隱場景,不受大V影響,更能反映真實的興趣群體。

8)存在的問題

(1)使用者數量往往比較大,計算比較吃力

(2)使用者口味變化很快,興趣遷移問題很難反應出來

(3)資料稀疏,使用者和使用者之間的共同消費行為很少

3.解密“看了又看”和“買了又買”

1)基於物品的協同過濾(item-Based)首先計算相似物品,然後再根據使用者消費國、或者正在消費的物品為其推薦。相對於基於使用者的協同過濾的好處:

(1)物品的數量往往小於使用者的數量

(2)物品之間的相似度比較靜態,它們變化的速度沒有使用者的口味變化快

(3)物品對應的消費者數量較大,更有利於計算相似度

2)基本步驟

(1)構建使用者物品的關係矩陣。矩陣元素是使用者的消費行為,也可以是消費後的評價,還可以是對消費行為的某種量化如時間、次數、費用。

(2)假如矩陣的行為表示物品,列表示使用者的話,行向量之間的兩兩計算相似度得到物品相似度矩陣(行和列都是物品)

(3)產生推薦結果。根據推薦場景不同,可以是為某個物品推薦相關的物品,也可以是在個人首頁產生的類似“猜你喜歡”的推薦結果。

3)計算物品相似度

(1)使用者物品關係矩陣

  • 向量的維度是使用者,總維度是總使用者數
  • 向量的各個維度的取值是使用者對物品的消費結果
    • 行為本身的布林值
    • 消費行為量化如時間長短、次數多少、費用大小等
    • 評價分數
  • 是一個稀疏向量,沒有消費過的就不用表示出來

(2)一般選擇餘弦相似度(也可以是其它相似度計演算法)

  • 分母是兩個物品向量的長度,求元素值的平方和再開方
  • 分子是兩個向量的點積,相同位置的元素值相乘再求和
  • 向量中大部分都是0,求和時不用算,求點積時只用管兩個物品的公共使用者,只有少量幾個乘積而已,計算量不會很大。

(3)物品相似度計算的改進

  • 物品中心化

先計算每個物品收到的評分的均值,然後把物品向量中的分數減去對應物品的均值。去掉物品中鐵桿粉絲群體的非理性因素。

  • 使用者中心化

先計算每個使用者評分的均值,然後把他打過的所有分數都減去這個均值。每個人標準不一樣,有的標準嚴苛,有的寬鬆,可以在一定程度上僅僅保留了偏好,去掉主觀成分。

4)計算推薦結果

(1)Top K推薦,形式上屬於類似“猜你喜歡”

  • 彙總和“使用者已經消費過的物品相似”的物品,按照彙總後的分數從高到低推出
  • 使用者u對物品i的分數:
    • 使用者評分過的物品共m個
    • sim(i,j)為使用者評分過的物品j與物品i的相似度
  • 不需要對所有物品都計算一遍,只需要按照使用者評分過的物品,逐一取出來和它們相似的物品出來就可以

(2)相關推薦

  • 這類推薦不需要提前合併計算,當用戶訪問一個物品詳情頁面時/完成一個物品消費的結果頁面,直接獲取這個物品相似的物品推薦,就是“看了又看”或者“買了又買”的推薦結果

5)Slope One演算法

(1)經典基於物品推薦,相似度矩陣計算無法實時更新,而且沒有考慮相似度的置信度問題。

(2)Slope One演算法專門針對評分矩陣,不適用於行為矩陣。演算法計算的是物品之間的距離,相似度的反面。

(3)例子

         評分矩陣

        

         轉換後物品距離矩陣,括號外為物品距離(評分差值),括號裡面為共同使用者數量,代表兩個物品的知心程度。物品A與物品B的差距為同時對物品A和B評分差值的平均值,即((5-3)+(3-4))/2=0.5

        

         計算步驟

  • 物品A相對物品B的距離為0.5,根據使用者3對物品B的評分(2分)預測其對物品A的評分:2+0.5=2.5
  • 物品A相對物品C的距離為3,根據使用者3對物品C的評分(5分)預測其對物品A的評分:5+3=8
  • 計算加權平均值:(8*1 + 2.5*2)/(1+2)=4.33

4.協同過濾中的相似度計算方法

1)推薦系統兩大門派

(1)相似度門派

  • 近鄰推薦的核心就是相似度計算的選擇,由於近鄰推薦沒有采用最優化思路,所以效果通常取決於矩陣的量化方式和相似度的選擇。
  • 潛在假設:如果兩個物品相似,也就是距離很近,那麼兩個物品就很容易產生一樣的動作。
  • 最常用的相似度是餘弦相似度,另外還有歐氏距離、皮爾遜相關度、自適應的餘弦相似度、區域性敏感雜湊等。

(2)機器學習門派

  • 如在邏輯迴歸/線性迴歸中,一邊是特徵向量,另一邊是模型引數向量,兩者的點積運算就可以看做是相似度計算,不過模型的引數是從資料中由優化演算法自動總結出來的。

2)計算相似度的向量數值有兩種

  • 實數值
  • 布林值,0/1

3)歐氏距離

     (1)計算公式:

(2)歐式空間下度量距離的方法,歐氏距離是衡量兩個點之間的距離,歐氏距離不適合布林向量之間。

(3)通常相似度的獨立結果希望是[-1,1]或[0,1]之間,所以歐氏距離無法直接使用,需要二次轉化E(p,q)為p和q點的距離。

(4)歐氏距離度量的是空間兩點的絕對距離,適用於分析使用者能力模型之間的差異,如消費能力、貢獻內容的能力等。

4)餘弦相似度

(1)計算公式:

(2)度量兩個向量之間的夾角,在度量文字相似度、使用者相似度、物品相似度的時候較為常用。

(3)它與向量的長度無關,只要方向一致,都視為相似。例如用140字摘要了一篇5000字的部落格內容,兩者得到的文字向量可以認為方向一致,詞頻程度不同,但是餘弦相似度任然認為他們是相似的。

(4)在協同過濾中,如果選擇餘弦相似度,某種程度上更加依賴兩個物品的共同評價使用者數,而不是使用者給予的評分多少。

(5)餘弦相似度對絕對值不敏感的問題

  • 例子,使用者A對兩部電影的評分分別為1和2分,使用者B對同樣兩部電影評分是4和5分,餘弦相似度認為兩使用者非常相似。實際上使用者A明顯不喜歡這兩部電影。
  • 改進版:調整的餘弦相似度

先計算向量每個維度的均值,然後每個向量在各個維度上都減去均值後再計算餘弦相似度。

5)皮爾遜相關度

(1)實際上也是一種餘弦相似度,不過先對向量做了中心化,向量p和q各自減去向量的均值後再計算餘弦相似度。結果範圍[-1,1],-1表示負相關,1表示正相關。

        

(2)由於皮爾遜相關度度量的是兩個變數的變化趨勢是否一致,所以不適合用作計算布林值向量之間的相關度。布林值向量只有有限的兩個值,根本沒有“變化趨勢,高低起伏”的說法。

6)傑卡德(Jaccard)相似度

(1)是兩個集合的交集個數在並集中所佔的比例。由於集合非常適用於布林向量表示,所以傑卡德相似度非常適用於布林向量。

(2)計算方法:

  • 分子是兩個布林向量做點積計算,得到交集的元素個數
  • 分母就是兩個布林向量做或運算,再求元素和

7)餘弦相似度適用於評分資料,傑卡德相似度適合用於隱式反饋資料,如收藏行為相似度計算。

例子:如何做社交網路好友相似度量?

  • 特徵:帖子釋出數量、月均發貼數量、平均帖子字數、頭像、標籤資料(是否大V、是否營銷號、是否網紅、職業等)、統計發文Top關鍵詞向量及詞頻
  • 標籤資料可計算傑卡德相似度
  • Top關鍵詞可計算餘弦相似度
  • 釋出量、字數等可計算歐式距離
  • 最後再融合這幾個相似度得到總的相似度