常用推薦系統演算法總結

2022-04-15 11:43:11 字數 4236 閱讀 7057

1、itemcf (基於商品的協同過濾)

這個演算法是cf中的一種,也是當今很多大型**都在採用的核心演算法之一。對於****(以amazon為代表,當然也包括京東那種具有搞笑特色的推薦系統在內),影視類推薦,圖書類推薦,**類推薦系統來說,item的增長速度遠不如user的增長速度,而且item之間的相似性遠不如user之間的相似性那麼敏感,所以可以在離線系統中將item的相似度矩陣計算好,以供線上可以近乎即時地進行推薦。因為這種方法靠的是item之間的相關性進行推薦,所以推薦的item一般都和喜歡的item內容或者特性高度相似,很難推薦出使用者潛在喜歡的item,多樣性也比較差。

2、usercf (基於使用者的協同過濾)

3、content_based(基於內容的推薦)

4、knn(鄰近演算法)

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

5、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

y 4 3

a 4 ?

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

當然這個只是個算例簡單地說明下原理,當user和item都很多的時候,你可以用加權的辦法來做。為什麼我會感覺這個演算法的效果會不理想呢?因為,這個演算法總是把你的口味和大眾的平均口味作對等,推薦出來的東西很難是非常個性化的。很容易讓很多使用者的推薦結果趨向一致,也就是大數的平均值,也即大眾的平均口味。

6、svd(奇異值分解)

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

7、聚類演算法

這裡用到的聚類演算法,是用來降低維度以及為平行計算作準備的。拿到rating矩陣之後,可以通過這些評分將使用者自然地聚成幾簇,然後用上述的演算法對各個簇做推薦演算法平行計算,充分地利用好所有計算資源。當然你也可以在svd分解之後,拿到user和item矩陣之後,對這兩個矩陣分別作聚類分析,你可以得到user的簇以及item的簇。這樣的結果會非常有意義,你可以作好友推薦,相似item推薦等等。在基於內容的演算法中,因為很多資訊之間並不是那麼的相關,把他們都相互計算相似度,會得到很多的0,所以沒有必要。因此可以在計算之前,對整個item做個聚類,然後分別對各簇來做相似度計算。聚類演算法中,我用過效能最好的也是最簡單的就是k-means。

8、組合演算法

任何乙個演算法都有它獨特的優勢和固有的缺陷,因此單用乙個演算法的web應用很少,往往是將各種演算法組合起來用。

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

使用slopeone演算法,每次隨機選取6%的使用者**其喜好,進行5次實驗,取mae的均值,得到下表:

訓練集大小(%

mae

0.71718149

0.73005925

0.77483222

0.83092947

0.98020104

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

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

2. 不同相似度度量對效能的影響

使用itemcf演算法,訓練集大小為資料集的90%,每次隨機選取30%的使用者**其喜好,進行5次實驗,取mae的均值,得到下表:

相似度度量方法

mae

皮爾遜相關係數

0.86158483

曼哈頓距離

0.82744657

歐幾里德距離

0.80844643

對數似然值相似度

0.80750607

jaccard相似度

0.78540776

余弦相似度

0.81422523

繪製成直方圖,如下圖:

由此可知,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

繪製成直方圖,如下圖:

此外,在記憶體方面,slope one最佔記憶體,1g記憶體下最多只能處理6%左右的使用者。而其他演算法均能輕鬆地處理30%以上的使用者量。

在速度方面,svd速度最快,處理每個使用者的平均時間約為4ms,slope one的平均時間約為30ms,itemcf和usercf的平均處理時間都在10ms左右。knn的速度是最慢的,平均處理時間約為100ms。

推薦系統常用演算法

在推薦系統簡介中,我們給出了推薦系統的一般框架。很明顯,推薦方法是整個推薦系統中最核心 最關鍵的部分,很大程度上決定了推薦系統效能的優劣。目前,主要的推薦方法包括 基於內容推薦 協同過濾推薦 基於關聯規則推薦 基於效用推薦 基於知識推薦和組合推薦。一 基於內容推薦 基於內容的推薦 content b...

推薦系統演算法總結

最近看推薦系統方面的東西也有段日子了,有書,部落格,唯獨沒有看 總感覺 對於工業界來說用處真的不如學校做課題 那麼大,只要知道某個演算法好不好用以及怎麼用就可以了,也不必知道太多的細節和數學推導。但根據乙個好的演算法,產品部門可以設計出很多很酷的產品,讓使用者倍感web應用的人性化。在看書,看大牛們...

推薦系統演算法總結

阿俊的部落格 最近看推薦系統方面的東西也有段日子了,有書,部落格,唯獨沒有看 總感覺 對於工業界來說用處真的不如學校做課題 那麼大,只要知道某個演算法好不好用以及怎麼用就可以了,也不必知道太多的細節和數學推導。但根據乙個好的演算法,產品部門可以設計出很多很酷的產品,讓使用者倍感web應用的人性化。在...