分享協同過濾思想簡介 什么是協同過濾?( 五 )



分享協同過濾思想簡介 什么是協同過濾?

文章插圖
圖8:標的物的topK相似列表利用Map數據結構來存儲
有了標的物之間的相似度Map, 為用戶計算推薦的過程可以基于用戶行為RDD, 在每個Partition中, 針對每個用戶u計算u與每個標的物之間的偏好度(利用第二節2基于標的物的協同過濾中的公式), 再取topN就得到該用戶的推薦結果了 。 由于用戶行為采用了RDD來表示, 所以整個計算過程可以分布式進行, 每個Partition分布在一臺服務器上進行計算 。 具體的計算邏輯可以用下面的代碼片段來實現 。

分享協同過濾思想簡介 什么是協同過濾?

文章插圖
圖9:為每個用戶計算topN推薦
講到這里, 基于Spark平臺離線實現協同過濾算法的工程方案就講完了 。 該實現方案強依賴于Spark的數據結構及分布式計算函數, 可能在不同的計算平臺上(比如Flink、Tensorflow等)具體的實現方式會不一樣, 但是基本思路和原理是一樣的, 有興趣并且平時使用這些平臺的讀者可以在這些計算平臺上獨自實現一下, 算是對自己的一個挑戰 。
四、近實時協同過濾算法的工程實現上面第三節中的協同過濾工程實現方案適合做離線批量計算, 比較適合標的物增長較緩慢的場景及產品(比如電商、視頻、音樂等), 對于新聞、短視頻這類增量非常大并且時效性強的產品(如今日頭條、快手等)是不太合適的 。 那么我們是否可以設計出一套適合這類標的物快速增長的產品及場景下的協同過濾算法呢?實際上是可以的, 下面我們來簡單說一下怎么近實時實現簡單的協同過濾算法 。
我們的近實時協同過濾算法基于Kafka、HBase和Spark Streaming等分布式技術來實現, 核心思想跟第三節中的類似, 只不過我們這里是實時更新的, 具體的算法流程及涉及到的數據結構見下面圖10 。 下面我們對實現原理做簡單介紹, 整個推薦過程一共分為4步 。

分享協同過濾思想簡介 什么是協同過濾?

文章插圖
圖10:近實時基于標的物的協同過濾算法流程及相關數據結構
  1. 獲取用戶在一個時間窗口內的行為
首先Spark Streaming程序從kafka讀取一個時間窗口(Window)(一般一個時間窗口幾秒鐘, 時間越短實時性越好, 但是對計算能力要求也越高)內的用戶行為數據, 我們對同一個用戶U的行為做聚合, 得到上面圖中間部分的用戶行為列表(用戶在該時間窗口中有k次行為記錄) 。
順便說一下, 因為是實時計算, 所以用戶行為數據會實時傳輸到Kafka中, 供后續的Spark Streaming程序讀取 。
  1. 基于用戶在時間窗口W內的行為及用戶行為記錄表更新標的物關聯表CR
基于(1)中獲取的用戶行為記錄, 在這一步, 我們需要更新標的物關聯表CR, 這里涉及到兩類更新 。 首先, 用戶U在時間窗口W內的所有k次行為

分享協同過濾思想簡介 什么是協同過濾?

文章插圖
, 我們對標的物兩兩組合(自身和自身做笛卡爾積)并將得分相乘更新到CR中, 比如

分享協同過濾思想簡介 什么是協同過濾?

文章插圖
組合, 它們的得分

分享協同過濾思想簡介 什么是協同過濾?

文章插圖
相乘

分享協同過濾思想簡介 什么是協同過濾?

文章插圖
更新到CR表中rowkey為

分享協同過濾思想簡介 什么是協同過濾?

文章插圖
的行中 。

分享協同過濾思想簡介 什么是協同過濾?

文章插圖
的得分score更新為score+

分享協同過濾思想簡介 什么是協同過濾?

文章插圖
) 。 其次, 對于用戶U在時間窗口W中的行為還要與用戶行為表UAction中的行為兩兩組合(做笛卡爾積)采用前面介紹的一樣的策略更新到CR表中, 這里為了防止組合過多, 我們可以只選擇時間在一定范圍內(比如2天內)的標的物對組合, 從而減少計算量 。
這里說一下, 如果用戶操作的某個標的物已經在行為表UAction中(這種情況一般是用戶對同一個標的物做了多次操作, 昨天看了這短視頻, 今天刷到了又看了一遍), 我們需要將這兩次相同的行為合并起來, 具體上我們可以將這兩次行為中得分高的賦值給行為表中該標的物的得分, 同時將操作時間更新為最新操作該標的物的時間 。 同時將時間窗口W中該操作行為剔除掉, 不參上面提到的時間窗口W中的操作行為跟UAction表中同樣的操作行為的笛卡爾積計算 。

推薦閱讀