經常使用推薦系統算法總結

一,經常使用推薦系統算法總結

一、Itemcf (基於商品的協同過濾)

這個算法是cf中的一種,也是當今不少大型網站都在採用的核心算法之一。對於商城網站(以Amazon爲表明,固然也包括京東那種具備搞笑特點的推薦系統在內),影視類推薦,圖書類推薦,音樂類推薦系統來講,item的增加速度遠不如user的增加速度,並且item之間的類似性遠不如user之間的類似性那麼敏感,因此能夠在離線系統中將item的類似度矩陣計算好,以供線上能夠近乎即時地進行推薦。由於這種方法靠的是item之間的相關性進行推薦,因此推薦的item通常都和喜歡的item內容或者特性高度類似,很難推薦出用戶潛在喜歡的item,多樣性也比較差。 web

二、Usercf (基於用戶的協同過濾)

這個是cf中的另一種,它的主要特點是能夠發現和用戶具備一樣taste的人,有句俗話叫作觀其友知其人,大概也是這個道理吧。找到用戶的類似用戶,經過類似用戶喜歡的item推薦給該用戶。由於用戶的類似用戶羣仍是比較敏感的,因此要頻繁地計算出用戶的類似用戶矩陣,這樣的話運算量會很是大。並且這個算法每每推薦出來的item不少都是你們都喜歡的比較hot的item,有的時候它提供的結果並非個性化,反而成了大衆化的推薦了。用這種算法的web應用通常都是item更新頻繁,好比提供資訊類服務的應用(以「指閱」爲表明的),或者笑話類推薦(以「冷笑話精選」爲表明的)。固然這種算法的一箇中間產物-----用戶類似度矩陣是一個頗有用的東西,社交類的網站能夠利用這個中間產物來爲用戶提供相同品位的好友推薦。 算法

三、Content_based(基於內容的推薦)

基於內容的推薦,很大程度上是在進行文本挖掘。web應用提供的內容或者爬取的內容在推給用戶以前能夠作一些挖掘,好比資訊類的應用,將抓取到的資訊,經過文本分析那一套算法提取出每篇資訊的關鍵詞,以及統計頻次和逆向文檔頻率來聚類或者笨一點地話計算出資訊的類似度矩陣,即共同的key words越多,兩篇資訊的類似度越高。當你的用戶不多不多,你的顯式反饋數據很是很是少的時候,你能夠根據用戶的瀏覽或者搜索等等各類行爲,來給用戶進行推薦。再猥瑣一點的話,你能夠在用戶剛剛註冊好你的應用的時候,給他一些提問,好比讓他輸入一些感興趣的話題啊,或者對之前看過的電影打分什麼的。(固然這些電影都是你從各個簇中隨機選取的,要足夠多樣性)這個算法它好就好在,不須要拿到用戶--項目的評分矩陣,只須要知道用戶喜歡什麼,就能夠很快速地推薦給用戶十分相關的item。這個算法須要天天都要根據你抓取的資訊,不斷地計算item之間的類似性。這個算法有個好處在於能夠從容應對上面的兩個算法其實都很難應對的問題,就是若是你想推出一個新的item,由於沒有一我的有對這個new item的評分,因此上述的兩個算法不可能推薦新的東西給你,但你能夠用基於內容的算法將新的item計算出它屬於哪一個類,而後時不時地推出你的新item,這點對於商城尤爲重要。 dom

四、Knn(鄰近算法)

K最近鄰(k-Nearest Neighbor,KNN)分類算法,是一個理論上比較成熟的方法,也是最簡單的機器學習算法之一。該方法的思路是:若是一個樣本在特徵空間中的k個最類似(即特徵空間中最鄰近)的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別。KNN算法中,所選擇的鄰居都是已經正確分類的對象。該方法在定類決策上只依據最鄰近的一個或者幾個樣本的類別來決定待分樣本所屬的類別。 KNN方法雖然從原理上也依賴於極限定理,但在類別決策時,只與極少許的相鄰樣本有關。因爲KNN方法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來肯定所屬類別的,所以對於類域的交叉或重疊較多的待分樣本集來講,KNN方法較其餘方法更爲適合。 機器學習

五、Slope One

推薦系統的最最本質的事情就是把user-item rating矩陣中的空白填好,看穿這個本質之後,你可能會以爲問題一會兒簡單多了,填格子啊?填格子誰不會啊。所以不少高效加搞笑的算法就出來了。slope one就是其中,說實話,這個算法我本身沒有寫過,可是看到這個算法怎麼實現的,我就以爲應該很好作,並且算起來會很快,但結果確定不會特別理想。 性能

Slope One的基本概念很簡單, 例子1, 用戶X, Y和A都對Item1打了分. 同時用戶X,Y還對Item2打了分, 用戶A對Item2可能會打多少分呢? 學習

User Rating to Item 1 Rating to Item 2 網站

X 5 3 spa

Y 4 3 翻譯

A 4 ? rest

根據SlopeOne算法, 應該是:4 - ((5-3) + (4-3))/2 = 2.5.

固然這個只是個算例簡單地說明下原理,當user和item都不少的時候,你能夠用加權的辦法來作。爲何我會感受這個算法的效果會不理想呢?由於,這個算法老是把你的口味和大衆的平均口味做對等,推薦出來的東西很難是很是個性化的。很容易讓不少用戶的推薦結果趨向一致,也就是大數的平均值,也即大衆的平均口味。

六、Svd(奇異值分解)

svd的全稱是:Singular Value Decomposition,翻譯過來是奇異值分解,是一種矩陣分解的方法。其實,這個方法是提取通常實矩陣「特徵值」的算法,(這裏特徵值加引號是由於,特徵值是針對方陣來定義的,而通常的m*n的實矩陣是沒有特徵值的。)其實,矩陣就是一個線性變換的表示方法,由於一個向量乘一個矩陣的結果是一個向量,第一個向量經過線性變換來變成第二個向量。線性變換有許多變換方向,好比你能夠對一個圖像矩陣作伸縮同時也作平移。那麼特徵值和特徵向量又是什麼?一個特徵向量就是表示其中的一個變換方向,而對應的特徵值則表示這個變換方向對於整個線性變換有多麼重要。書歸正傳,那麼奇異值又是什麼?我以爲奇異值就是特徵值從方陣往通常實矩陣的一個推廣。你將一個m*n的實矩陣和它的轉置相乘,就會獲得一個方陣,而後對這個方陣作特徵值分解,獲得的特徵值就是所謂的奇異值的平方。個人意思是說,某種意義上,能夠講奇異值和特徵值理解爲一回事。那麼拿到奇異值又會有什麼用呢?拿到奇異值後,咱們就能夠抓到主要的成分,丟掉次要和很是次要的成分進行分析。也就是說,咱們能夠對原來的龐大的經常又很是稀疏的矩陣進行降維和分解,而分解後獲得的矩陣都是稠密矩陣。最終咱們會獲得一個表示user特性的矩陣和一個表示item特性的矩陣。拿到這些數據以後,咱們就能夠進行推薦了,並且也能夠很容易地進行聚類分析。這個算法的好處在於,能夠解決rating矩陣的稀疏性問題,同時能夠下降矩陣的維度,提升運算速度。但它的缺點是付出的空間代價太大。在作svd分解時,你須要先把一個大的rating矩陣分解成三個大的矩陣,這三個矩陣須要存在計算機內存中,而後才能進行降維。其實,svd這個方法的思路和PCA(主成分分析法)很像,抓住主要矛盾,忽略次要矛盾。分解降維後的矩陣很是約等於原來的矩陣。

七、聚類算法

這裏用到的聚類算法,是用來下降維度以及爲並行計算做準備的。拿到rating矩陣以後,能夠經過這些評分將用戶天然地聚成幾簇,而後用上述的算法對各個簇作推薦算法並行計算,充分地利用好全部計算資源。固然你也能夠在svd分解以後,拿到user和item矩陣以後,對這兩個矩陣分別做聚類分析,你能夠獲得user的簇以及item的簇。這樣的結果會很是有意義,你能夠做好友推薦,類似item推薦等等。在基於內容的算法中,由於不少資訊之間並非那麼的相關,把他們都相互計算類似度,會獲得不少的0,因此沒有必要。所以能夠在計算以前,對整個item作個聚類,而後分別對各簇來作類似度計算。聚類算法中,我用過性能最好的也是最簡單的就是k-means。

八、組合算法

任何一個算法都有它獨特的優點和固有的缺陷,所以單用一個算法的web應用不多,每每是將各類算法組合起來用。

一種方式是:將多種算法計算出來的結果,加權以後排序推薦給用戶。

一種方式是:將多種算法計算出來的結果,各取前幾個推薦給用戶,這樣作的好處是結果很豐富多彩。

一種方式是:用svd算法填充後的矩陣做爲輸入,用普通cf作計算來輸出,而後排序推薦。這種叫作層次推薦,能夠獲得兩種方法的好處。

一種方式是:對新用戶作基於內容的推薦,由於新用戶沒有任何評分數據,對老用戶用cf來作。

… …

二,性能評價

1. 訓練集大小對於推薦性能的影響

使用SlopeOne算法,每次隨機選取6%的用戶預測其喜愛,進行5次實驗,取MAE的均值,獲得下表:

訓練集大小(%

MAE

90

0.71718149

70

0.73005925

50

0.77483222

30

0.83092947

10

0.98020104

繪製成折線圖,以下圖所示:

clip_image001

由此可知,訓練集越大,則推薦的準確率越高。

2. 不一樣類似度度量對性能的影響

使用ItemCF算法,訓練集大小爲數據集的90%,每次隨機選取30%的用戶預測其喜愛,進行5次實驗,取MAE的均值,獲得下表:

類似度度量方法

MAE

皮爾遜相關係數

0.86158483

曼哈頓距離

0.82744657

歐幾里德距離

0.80844643

對數似然值類似度

0.80750607

Jaccard類似度

0.78540776

餘弦類似度

0.81422523

繪製成直方圖,以下圖:

clip_image002

由此可知,Jaccard類似度的性能略好於其餘幾種類似度,可是優點很小。使用不一樣類似度度量方法差異不大。

3. 不一樣推薦算法的性能

使用皮爾遜相關係數做爲類似度,訓練集大小爲數據集的90%,每次隨機選取6%的用戶預測其喜愛,進行5次實驗,取MAE的均值。其中KNN算法取近鄰大小爲5;EM算法的學習速度爲0.005,過分擬合值爲0.02,隨機噪聲值爲0.005,EM的迭代次數爲20。獲得下表:

推薦算法

MAE

ItemCF

0.86158483

UserCF

1.03740876

Slope One

0.71718149

KNN(k = 5)

0.83184328

SVD

(Compute SVD using EM Algorithm:

learning rate = 0.005,

overfitting prevention = 0.02,

random noise = 0.005,

epoch = 20)

0.70493273

繪製成直方圖,以下圖:

clip_image003

由此可知,SVD和Slope One算法的推薦結果最爲精確,UserCF最差。這個數據和推薦系統相關著做中的結論是吻合的。

此外,在內存方面,Slope One最佔內存,1G內存下最多隻能處理6%左右的用戶。而其餘算法均能輕鬆地處理30%以上的用戶量。

在速度方面,SVD速度最快,處理每一個用戶的平均時間約爲4ms,Slope One的平均時間約爲30ms,ItemCF和UserCF的平均處理時間都在10ms左右。KNN的速度是最慢的,平均處理時間約爲100ms。

相關文章
相關標籤/搜索