轉:推薦系統中協同過濾算法實現分析(重要兩個圖!!)

轉自:http://my.oschina.net/BreathL/blog/62519html

 

最近研究Mahout比較多,特別是裏面協同過濾算法;因而把協同過濾算法的這個實現思路與數據流程,總結了一下,以便之後對系統作優化時,有個清晰的思路,這樣才能知道該如何優化且優化後數據亦能正確。web

     推薦中的協同過濾算法簡單說明下:算法

     首先,經過分析用戶的偏好行爲,來挖掘出裏面物品與物品、或人與人之間的關聯。性能

     其次,經過對這些關聯的關係作必定的運算,得出人與物品間喜歡程度的猜想,即推薦值。優化

     最後,將推薦值高的物品推送給特定的人,以完成一次推薦。spa

     這裏只是籠統的介紹下,方便下邊的理解,IBM的一篇博客對其原理講解得淺顯易懂,同時也很詳細深刻推薦引擎相關算法 - 協同過濾》,我這裏就不細講了。.net

     協同過濾算法大體可分爲兩類,基於物品的與基於用戶的;區分很簡單,根據上面的邏輯,若你挖掘的關係是物品與物品間的,就是基於物品的協同過濾算法,若你挖掘的關係是用戶與用戶間的,就是基於用戶的協同過濾算法;因爲它們實現是有所不一樣,因此我分開整理,先來看看基於物品的協同過濾實現,我本身畫了一幅圖:
htm

 

基於物品的協同過濾算法流程圖

     我經過數字的順序,來標示數據變化的方向(由小到大);下面分析下每個步驟的功能以及實現。
對象

     首先,說明下兩個大的數據源,用戶偏好數據:UserID、ItemID、Preference:表示一個對一個物品的喜愛程度;關係數據:ItemIDA(UserIDA)、ItemIDB(UserIDB)、Similarity:表示兩我的或物品間的類似程度;接着一個用戶來了,咱們須要爲其推薦,得拿到他的身份標示,通常是UserID,因而:blog

     .    查找這個用戶喜歡過的物品(即偏好的產品,並查出偏好值後面會用),以及尚未喜歡過的商品,前者是推薦運算的根據,後者做爲一個產生推薦的一個集合;如② 畫的那樣。

     .    這裏是一個可擴展的地方(我本身理解);由於這兩部分的數據的做用很是明顯,修改這兩個集合對後面產生的推薦結果可產生很是直觀的影響,好比清洗過濾,或根據用戶屬性縮小集合;不只使後面推薦效果更優,運算性能也能夠大幅度提升。

     .    查找這兩個集合之間的關係,這是一對多的關係:一個沒有偏好過的物品與該用戶全部偏好過的物品間的關係,有一個值來衡量這個關係叫類似度Similarity;這個關係怎麼來的,看藍色箭頭的指向。步驟

     .    獲得這個一對多的關係後,就能夠計算這個物品對於這個用戶的推薦值了,圖中similarity_i-x表示Item_i 與 Item_x 之間的類似度,Item_x是該用戶偏好過得,該用戶對其偏好值記爲 value_x ,相乘;Item_i 與 該用戶偏好過的全部物品以此作以上運算後,獲得的值取平均值 即是 Item_i的推薦值了。注:有可能Item_i 不是與全部 該用戶偏好過的物品都都存在類似性,不存在的,不計算便可;另外這裏方便理解介紹的都是最簡單的實現;你也能夠考一些複雜的數學元素,好比方差來判斷離散性等。

     .    這步就簡單多了,剛纔對該用戶沒有偏好過的集合中的全部Item都計算了推薦值,這裏就會獲得一個list,按推薦值由大到小排序,返回前面的一個子集便可。

     。 前面已經提到,關係數據時怎麼來的,也是根據用戶的偏好數據;你把其當作一個矩陣,橫着看過來,參考兩個Item間的共同用戶,以及共同用戶的偏好的值的接近度;這裏的可選擇的類似度算法不少,不一一介紹了,前面提到的IBM博客也詳細講解了。

     基於物品的協同過濾算法分析完了,下面是基於用戶的協同過濾算法,仍是本身畫了一幅圖:

基於用戶的協同過濾算法流程圖

 

     .    一樣也是查詢,只是查詢的對象不同了,查詢的是與該用戶類似的用戶,因此一來直接查了關係數據源。以及類似用戶與該用戶的類似度。

     .    與剛纔相似,也是對數據集的一個優化,不過做用可能沒那麼大。(我的感受)

     .    查詢關係數據源,獲得類似用戶即鄰居偏好過的物品;如步驟;圖中因爲空間小,沒有把全部鄰居的偏好關係都列出來,用……表示。其次還要獲得該用戶偏好過的物品集合。

     .    被推薦的Item集合是由該用戶的全部鄰居的偏好過的物品的並集,同時再去掉該用戶本身偏好過的物品。做用就是獲得你的類似用戶喜歡的物品,而你還沒喜歡過的。

     .    集合優化同基於物品的協同過濾算法的步驟

     .    也是對應相似的,依次計算被推薦集合中Item_i 的推薦值,計算的方式略有不一樣,Value_1_i表示鄰居1對,Item_i的偏好值,乘以該用戶與鄰居1的類似度 Similarity1;若某個鄰居對Item_i偏好過,就重複上述運算,而後取平均值;獲得Item_i的推薦值。

     ⑦、. 與上一個算法的最後兩部徹底相似,只是步驟  你豎着看,判斷兩個用戶類似的法子和判斷兩個物品類似的法子同樣。

     詳細的實現過程分析完了,但Mahout裏面的實現時,彷佛不太考慮查詢的成本,並不是一次所有查出,每計算個Item的推薦值查一次,你計算5000個就查5000次,若數據源都使用的是MySQL的話,我有點根兒顫,但一次所有查出再計算,確定是個慢查詢,且查詢後的數據不是規則的,須要整,又添加了計算量;若各位有好的優化思路,望能分享下,先謝過。

相關文章
相關標籤/搜索