推荐系统中协同过滤算法实现分析
原創(chuàng)博客,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明:http://my.oschina.net/BreathL/blog/62519
??????最近研究Mahout比較多,特別是里面協(xié)同過濾算法;于是把協(xié)同過濾算法的這個(gè)實(shí)現(xiàn)思路與數(shù)據(jù)流程,總結(jié)了一下,以便以后對(duì)系統(tǒng)做優(yōu)化時(shí),有個(gè)清晰的思路,這樣才能知道該如何優(yōu)化且優(yōu)化后數(shù)據(jù)亦能正確。
? ? ?推薦中的協(xié)同過濾算法簡(jiǎn)單說明下:
?????首先,通過分析用戶的偏好行為,來挖掘出里面物品與物品、或人與人之間的關(guān)聯(lián)。
? ? ?其次,通過對(duì)這些關(guān)聯(lián)的關(guān)系做一定的運(yùn)算,得出人與物品間喜歡程度的猜測(cè),即推薦值。
? ? ?最后,將推薦值高的物品推送給特定的人,以完成一次推薦。
? ? ?這里只是籠統(tǒng)的介紹下,方便下邊的理解,IBM的一篇博客對(duì)其原理講解得淺顯易懂,同時(shí)也很詳細(xì)《深入推薦引擎相關(guān)算法 - 協(xié)同過濾》,我這里就不細(xì)講了。
? ? ?協(xié)同過濾算法大致可分為兩類,基于物品的與基于用戶的;區(qū)分很簡(jiǎn)單,根據(jù)上面的邏輯,若你挖掘的關(guān)系是物品與物品間的,就是基于物品的協(xié)同過濾算法,若你挖掘的關(guān)系是用戶與用戶間的,就是基于用戶的協(xié)同過濾算法;由于它們實(shí)現(xiàn)是有所不同,所以我分開整理,先來看看基于物品的協(xié)同過濾實(shí)現(xiàn),我自己畫了一幅圖:
? ? ?我通過數(shù)字的順序,來標(biāo)示數(shù)據(jù)變化的方向(由小到大);下面分析下每一個(gè)步驟的功能以及實(shí)現(xiàn)。
? ? ?首先,說明下兩個(gè)大的數(shù)據(jù)源,用戶偏好數(shù)據(jù):UserID、ItemID、Preference:表示一個(gè)對(duì)一個(gè)物品的喜好程度;關(guān)系數(shù)據(jù):ItemIDA(UserIDA)、ItemIDB(UserIDB)、Similarity:表示兩個(gè)人或物品間的相似程度;接著一個(gè)用戶來了,我們需要為其推薦,得拿到他的身份標(biāo)示,一般是UserID,于是:
? ? ?①.? ? 查找這個(gè)用戶喜歡過的物品(即偏好的產(chǎn)品,并查出偏好值后面會(huì)用),以及還沒有喜歡過的商品,前者是推薦運(yùn)算的根據(jù),后者作為一個(gè)產(chǎn)生推薦的一個(gè)集合;如②?畫的那樣。
? ? ?②.? ? 這里是一個(gè)可擴(kuò)展的地方(我自己理解);因?yàn)檫@兩部分的數(shù)據(jù)的作用非常明顯,修改這兩個(gè)集合對(duì)后面產(chǎn)生的推薦結(jié)果可產(chǎn)生非常直觀的影響,比如清洗過濾,或根據(jù)用戶屬性縮小集合;不僅使后面推薦效果更優(yōu),運(yùn)算性能也可以大幅度提高。
? ? ?③.? ? 查找這兩個(gè)集合之間的關(guān)系,這是一對(duì)多的關(guān)系:一個(gè)沒有偏好過的物品與該用戶所有偏好過的物品間的關(guān)系,有一個(gè)值來衡量這個(gè)關(guān)系叫相似度Similarity;這個(gè)關(guān)系怎么來的,看藍(lán)色箭頭的指向。步驟⑥
? ? ?④.? ? 得到這個(gè)一對(duì)多的關(guān)系后,就可以計(jì)算這個(gè)物品對(duì)于這個(gè)用戶的推薦值了,圖中similarity_i-x表示Item_i 與 Item_x 之間的相似度,Item_x是該用戶偏好過得,該用戶對(duì)其偏好值記為 value_x ,相乘;Item_i 與 該用戶偏好過的所有物品以此做以上運(yùn)算后,得到的值取平均值 便是 Item_i的推薦值了。注:有可能Item_i 不是與所有 該用戶偏好過的物品都都存在相似性,不存在的,不計(jì)算即可;另外這里方便理解介紹的都是最簡(jiǎn)單的實(shí)現(xiàn);你也可以考一些復(fù)雜的數(shù)學(xué)元素,比如方差來判斷離散性等。
? ? ?⑤.? ? 這步就簡(jiǎn)單多了,剛才對(duì)該用戶沒有偏好過的集合中的所有Item都計(jì)算了推薦值,這里就會(huì)得到一個(gè)list,按推薦值由大到小排序,返回前面的一個(gè)子集即可。
? ? ?⑥。 前面已經(jīng)提到,關(guān)系數(shù)據(jù)時(shí)怎么來的,也是根據(jù)用戶的偏好數(shù)據(jù);你把其看成一個(gè)矩陣,橫著看過來,參考兩個(gè)Item間的共同用戶,以及共同用戶的偏好的值的接近度;這里的可選擇的相似度算法很多,不一一介紹了,前面提到的IBM博客也詳細(xì)講解了。
? ? ?基于物品的協(xié)同過濾算法分析完了,下面是基于用戶的協(xié)同過濾算法,還是自己畫了一幅圖:
? ? ?①.? ? 同樣也是查詢,只是查詢的對(duì)象不一樣了,查詢的是與該用戶相似的用戶,所以一來直接查了關(guān)系數(shù)據(jù)源。以及相似用戶與該用戶的相似度。
? ? ?②.? ? 與剛才類似,也是對(duì)數(shù)據(jù)集的一個(gè)優(yōu)化,不過作用可能沒那么大。(個(gè)人感覺)
? ? ?③.? ? 查詢關(guān)系數(shù)據(jù)源,得到相似用戶即鄰居偏好過的物品;如步驟④;圖中由于空間小,沒有把所有鄰居的偏好關(guān)系都列出來,用……表示。其次還要得到該用戶偏好過的物品集合。
? ? ?④.? ? 被推薦的Item集合是由該用戶的所有鄰居的偏好過的物品的并集,同時(shí)再去掉該用戶自己偏好過的物品。作用就是得到你的相似用戶喜歡的物品,而你還沒喜歡過的。
? ? ?⑤.? ? 集合優(yōu)化同基于物品的協(xié)同過濾算法的步驟②。
? ? ?⑥.? ? 也是對(duì)應(yīng)類似的,依次計(jì)算被推薦集合中Item_i 的推薦值,計(jì)算的方式略有不同,Value_1_i表示鄰居1對(duì),Item_i的偏好值,乘以該用戶與鄰居1的相似度 Similarity1;若某個(gè)鄰居對(duì)Item_i偏好過,就重復(fù)上述運(yùn)算,然后取平均值;得到Item_i的推薦值。
? ? ?⑦、⑧.?與上一個(gè)算法的最后兩部完全類似,只是步驟??⑧你豎著看,判斷兩個(gè)用戶相似的法子和判斷兩個(gè)物品相似的法子一樣。
? ? ?詳細(xì)的實(shí)現(xiàn)過程分析完了,但Mahout里面的實(shí)現(xiàn)時(shí),似乎不太考慮查詢的成本,并非一次全部查出,每計(jì)算個(gè)Item的推薦值查一次,你計(jì)算5000個(gè)就查5000次,若數(shù)據(jù)源都使用的是MySQL的話,我有點(diǎn)根兒顫,但一次全部查出再計(jì)算,肯定是個(gè)慢查詢,且查詢后的數(shù)據(jù)不是規(guī)則的,需要整,又添加了計(jì)算量;若各位有好的優(yōu)化思路,望能分享下,先謝過。
? ? ?
總結(jié)
以上是生活随笔為你收集整理的推荐系统中协同过滤算法实现分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java学习笔记之 IO包 字符流
- 下一篇: 马化腾最崇拜的作家吴晓波《历代经济变革得