本文引自http://blog.csdn.net/fwing/article/details/4942886
現在的推薦系統特別火啊。做得最好的應該是Amazon了。
上面是Amazon的圖書推薦。
用的就是著名的 協同過濾(Collaborative filtering)算法。
我們用一個簡單的例子來說明。
下面是一個用戶購買的書籍的表格。
|
|
計算機網絡 |
算法導論 |
人工智能 |
數據庫系統實現 |
概率統計 |
GRE 詞匯手冊 |
|
小明 |
1 |
0 |
1 |
0 |
1 |
0 |
|
小張 |
0 |
1 |
1 |
0 |
1 |
0 |
|
小李 |
1 |
1 |
0 |
0 |
0 |
0 |
|
小王 |
0 |
0 |
0 |
0 |
1 |
1 |
上面的1表示購買,0表示沒有購買。
那么我們怎么來給小明推薦書籍呢?
先來看看Amazon之前的傳統的協同過濾(Collaborative filtering)是怎么做的。
首先呢,根據每個人買的書籍,我們可以將每個用戶表示成一個向量。
例如,
V(小明)=<1, 0, 1, 0, 1, 0>
V(小張)=<0, 1, 1, 0, 1, 0>
V(小李)=<1, 1, 0, 0, 0, 0>
V(小王)=<0, 0, 0, 0, 1, 1>
然后呢,我們做這樣的假設,買書習慣跟小明類似的人,如果購買了小明沒有買的書,那么我們就認為,小明很有可能買這本書。
于是,問題變成了找買書習慣跟小明類似的人。提到向量跟相似度,我們自然就想到了用余弦來衡量相似度。
扔個公式在此給那些忘記了的童鞋們。
接下來,大家動手算一下吧。
cos<V(小明), V(小張) >=0.67
cos<V(小明), V(小李) >=0.41
cos<V(小明), V(小王) >=0.41
呵呵,那么跟小明習慣最像的就是小張了。
然后,我們發現小張買了《算法導論》,但是小明沒有買,于是我們就給小明推薦《算法導論》。
這個方法看起來很不錯,那么為什么Amazon提出了另外的一種方法呢?
再來看看Amazon的item-to-item協同過濾系統吧。
有一天呢,Amazon的一個工程師腦袋抽筋,不小心把上面的表格拿錯方向了。于是變成了下面的樣子。
|
|
小明 |
小張 |
小李 |
小王 |
|
計算機網絡 |
1 |
0 |
1 |
0 |
|
算法導論 |
0 |
1 |
1 |
0 |
|
人工智能 |
1 |
1 |
0 |
0 |
|
數據庫系統實現 |
0 |
0 |
0 |
0 |
|
概率統計 |
0 |
1 |
0 |
1 |
|
GRE 詞匯手冊 |
0 |
0 |
0 |
1 |
如果把書的那一行看成一個向量,有啥發現沒?對了,我們可以找相似的人,我們還可以找相似的書!!!
這也就是Amazon的item-to-item協同過濾系統。
很多時候,創新就是這么簡單,寫paper就是這么容易啊 ,換個方向思考 (呃,那位童鞋,不是叫你把書拿反了看)。
下面簡單描述一下方法。
我們可以先算出任意兩個物品之間的相似度(跟上面類似啊,自己算)。
接下開我們看到小明買了《計算機網絡》和《人工智能》的書,把跟這兩本書類似的書推薦給小明。
跟《計算機網絡》最相似的是 《算法導論》和 《人工智能》,跟 《人工智能》最相似的是 《計算機網絡》和 《算法導論》。
最后的結果,是《算法導論》^_^。
用這個方法呢,我們就可以給用戶推薦說,買了這個商品的用戶還購買了***
那這方法是不是有什么優點呢?(廢話啊,不然Amazon會拿來用,商人是很聰明的)
Tradition VS Amazon
Amazon的CF算法可以在離線的情況下把item之間的相似度計算好。當一個用戶登陸后,我們需要的也只是檢查用戶的購買歷史,然后把跟這些item相似的item按一定的方法(比如受歡迎程度)排序展現給用戶。一般來說,用戶購買的東西只是一個小的集合,因此不需要花很多的時間來計算。
而且,如果用戶沒有登陸,我們依然可以根據他的瀏覽歷史來做推薦。例如,上面的圖片就是我在沒有登陸的情況下查看了一下《Beautiful Architecture》,然后Amazon給我做了推薦。
對于Amazon這樣的網站來說,用戶量是遠遠大于商品數量的。因此,Amazon的CF算法(計算商品相似度)比起傳統的CF算法(計算用戶相似度),大大地節約了資源。
對于一個未登陸的用戶來說,傳統的CF算法沒辦法根據他的瀏覽歷史來推薦(在線計算一個用戶跟其他所有用戶的相似度顯然不可能)。
浙公網安備 33010602011771號