1. 程式人生 > >常見推薦算法科普

常見推薦算法科普

ati 屬性 生產 產出 數據 模型 依賴 事情 請求

推薦算法

目前主流的推薦算法主要包含內容關聯算法, 協同過濾算法。

內容關聯算法(Content-Based)

CB算法的原理是將一個item的基本屬性, 內容等信息提取出來, 抽成一個taglist, 為每個tag賦一個權重。

剩下的事情就跟一個搜索引擎非常類似了, 將所有item對應的taglist做一下倒排轉換, 放到倒排索引服務器中存儲起來。

當要對某一個item做相關推薦的時候, 將這個item對應的taglist拿出來拼成一個類似搜索系統中的query表達式, 再將召回的結果做一下排序作為推薦結果輸出。

當要對某個用戶做個性化推薦的時候, 將這個用戶最近喜歡/操作過的item列表拿出來, 將這些item的taglist拿出來並merge一下作為用戶模型, 並將這個模型的taglist請求倒排索引服務, 將召回的結果作為候選推薦給該用戶。

該算法的好處是:

  1. 不依賴於用戶行為, 即不需要冷啟動的過程, 隨時到隨時都能推薦
  2. 可以給出看起來比較合理的推薦解釋
  3. item被推薦的時效性可以做得很高, 比如新聞類產品就需要用到該算法

該算法的壞處是:

  1. 需要理解item的內容, 對音頻/視頻等不好解析內容的就不好處理了
  2. 對於一次多義以及一義多詞等情況處理起來比較復雜
  3. 容易出現同質化嚴重的問題, 缺乏驚喜

協同過濾算法(collaborative filtering)

簡介

CF算法的原理是匯總所有<user,item>的行為對, 利用集體智慧做推薦。其原理很像朋友推薦, 比如通過對用戶喜歡的item進行分析, 發現用戶A和用戶B很像(他們都喜歡差不多的東西), 用戶B喜歡了某個item, 而用戶A沒有喜歡, 那麽就把這個item推薦給用戶A。(User-Based CF)

當然, 還有另外一個維度的協同推薦。即對比所有數據, 發現itemA和itemB很像(他們被差不多的人喜歡), 那麽就把用戶A喜歡的所有item, 將這些item類似的item列表拉出來, 作為被推薦候選推薦給用戶A。(Item-Based CF)

如上說的都是個性化推薦, 如果是相關推薦, 就直接拿Item-Based CF的中間結果就好啦。

該算法的好處是:

  1. 能起到意想不到的推薦效果, 經常能推薦出來一些驚喜結果
  2. 進行有效的長尾item
  3. 只依賴用戶行為, 不需要對內容進行深入了解, 使用範圍廣

該算法的壞處是:

  1. 一開始需要大量的<user,item>行為數據, 即需要大量冷啟動數據
  2. 很難給出合理的推薦解釋

原理

協同過濾算法具體實現的時候, 又分為典型的兩類:

  1. 基於領域的協同過濾算法

    這類算法的主要思想是利用<user,item>的打分矩陣, 利用統計信息計算用戶和用戶, item和item之間的相似度。然後再利用相似度排序, 最終得出推薦結果。

    常見的算法原理如下:

    1. User-Based CF

      先看公式:

      技術分享圖片

      該公式要計算用戶i和用戶j之間的相似度, I(ij)是代表用戶i和用戶j共同評價過的物品, R(i,x)代表用戶i對物品x的評分, R(i)頭上有一杠的代表用戶i所有評分的平均分, 之所以要減去平均分是因為有的用戶打分嚴有的松, 歸一化用戶打分避免相互影響。

      該公式沒有考慮到熱門商品可能會被很多用戶所喜歡, 所以還可以優化加一下權重, 這兒就不演示公式了。

      在實際生產環境中, 經常用到另外一個類似的算法Slope One, 該公式是計算評分偏差, 即將共同評價過的物品, 將各自的打分相減再求平均。

    2. Item-Based CF

      先看公式:

      技術分享圖片

      該公式跟User-Based CF是類似的, 就不再重復解釋了。

    這類算法會面臨兩個典型的問題:

    1. 矩陣稀疏問題
    2. 計算資源有限導致的擴展性問題

    基於此, 專家學者們又提出了系列基於模型的協同過濾算法。

  2. 基於模型的協同過濾算法

    基於模型的研究就多了, 常見的有:

    1. 基於矩陣分解和潛在語義的
    2. 基於貝葉斯網絡的
    3. 基於SVM的

    這兒只簡單介紹一下基於矩陣分解的潛在語義模型的推薦算法。該算法首先將稀疏矩陣用均值填滿, 然後利用矩陣分解將其分解為兩個矩陣相乘, 如下圖:

    技術分享圖片

    看一個實際的例子:

    技術分享圖片

    這個例子中, 原始矩陣中包含了網頁的Title和切詞後的term之間關系, 可以類比為推薦系統中的評分。然後用SVD做矩陣分解之後, 針對每個term會對應一個3維向量, 針對每個Title也會對應一個3維向量。

    那麽接下來可以做的事情就很多了, 如果要計算term和title的相似度, 只需要將這兩個3為向量做內積得到的分值即可;

    還可以將term和title都投影到這3維空間中, 然後利用各種聚類算法, 將用戶和item, item和item, 用戶和用戶的分類都給求出來。

    該算法的核心是在於做矩陣分解, 在矩陣大了的情況下計算量是非常誇張的, 在實際生產環境中會常用梯度遞歸下降方法來求得一個近似解。

  3. 組合推薦技術

    其實從實踐中來看, 沒有哪種推薦技術敢說自己沒有弊端, 往往一個好的推薦系統也不是只用一種推薦技術就解決問題, 往往都是相互結合來彌補彼此的不足, 常見的組合方式如下:

    1. 混合推薦技術: 同時使用多種推薦技術再加權取最優;
    2. 切換推薦技術: 根據用戶場景使用不同的推薦技術;
    3. 特征組合推薦技術: 將一種推薦技術的輸出作為特征放到另一個推薦技術當中;
    4. 層疊推薦技術: 一個推薦模塊過程中從另一個推薦模塊中獲取結果用於自己產出結果;

Item-CF和User-CF選擇

  1. user和item數量分布以及變化頻率
    1. 如果user數量遠遠大於item數量, 采用Item-CF效果會更好, 因為同一個item對應的打分會比較多, 而且計算量會相對較少
    2. 如果item數量遠遠大於user數量, 則采用User-CF效果會更好, 原因同上
    3. 在實際生產環境中, 有可能因為用戶無登陸, 而cookie信息又極不穩定, 導致只能使用item-cf
    4. 如果用戶行為變化頻率很慢(比如小說), 用User-CF結果會比較穩定
    5. 如果用戶行為變化頻率很快(比如新聞, 音樂, 電影等), 用Item-CF結果會比較穩定
  2. 相關和驚喜的權衡
    1. item-based出的更偏相關結果, 出的可能都是看起來比較類似的結果
    2. user-based出的更有可能有驚喜, 因為看的是人與人的相似性, 推出來的結果可能更有驚喜
  3. 數據更新頻率和時效性要求
    1. 對於item更新時效性較高的產品, 比如新聞, 就無法直接采用item-based的CF, 因為CF是需要批量計算的, 在計算結果出來之前新的item是無法被推薦出來的, 導致數據時效性偏低;
    2. 但是可以采用user-cf, 再記錄一個在線的用戶item行為對, 就可以根據用戶最近類似的用戶的行為進行時效性item推薦;
    3. 對於像影視, 音樂之類的還是可以采用item-cf的;

常見推薦算法科普