這個演算法是cf中的一種,也是當今很多大型**都在採用的核心演算法之一。對於****(以
amazon
為代表,當然也包括京東那種具有搞笑特色的推薦系統在內),影視類推薦,圖書類推薦,**類推薦系統來說,
item
的增長速度遠不如
user
的增長速度,而且
item
之間的相似性遠不如
user
之間的相似性那麼敏感,所以可以在離線系統中將
item
的相似度
矩陣計算好,以供線上可以近乎即時地進行推薦。因為這種方法靠的是item之間的相關性
進行推薦,所以推薦的item一般都和喜歡的
item
內容或者特性高度相似,很難推薦出使用者潛在喜歡的
item
,多樣性也比較差。
這個是cf中的另外一種,它的主要特色是可以發現和使用者具有同樣
taste
的人,有句俗話叫做觀其友知其人,大概也是這個道理吧。找到使用者的相似使用者,通過相似使用者喜歡的
item
推薦給該使用者。因為使用者的相似使用者群還是比較敏感的,所以要頻繁地計算出使用者的相似使用者矩陣,這樣的話運算量會非常大。而且這個演算法往往推薦出來的
item
很多都是大家都喜歡的比較
hot的
item
,有的時候它提供的結果並不是個性化,反而成了大眾化的推薦了。用這種演算法的
web應用一般都是
item
更新頻繁,比如提供資訊類服務的應用(以「指閱」為代表的),或者笑話類推薦(以「冷笑話精選」為代表的)。當然這種演算法的乙個中間產物
-----
key words
越多,兩篇資訊的相似度越高。當你的使用者很少很少,你的顯式反饋資料非常非常少的時候,你可以根據使用者的瀏覽或者搜尋等等各種行為,來給使用者進行推薦。再猥瑣一點的話,你可以在使用者剛剛註冊好你的應用的時候,給他一些提問,比如讓他輸入一些感興趣的話題啊,或者對以前看過的電影打分什麼的。(當然這些電影都是你從各個簇中隨機選取的,要足夠多樣性)這個演算法它好就好在,不需要拿到使用者
--item
。這個演算法需要每天都要根據你抓取的資訊,不斷地計算
item
之間的相似性。這個演算法有個好處在於可以從容應對上面的兩個演算法其實都很難應對的問題,就是如果你想推出乙個新的
item
,因為沒有乙個人有對這個
new item
的評分,所以上述的兩個演算法不可能推薦新的東西給你,但你可以用基於內容的演算法將新的
item
計算出它屬於哪個類,然後時不時地推出你的新
item
,這點對於**尤其重要。
k最近鄰
(k-nearest neighbor
,knn)
分類演算法,是乙個理論上比較成熟的方法,也是最簡單的機器學習演算法之一。該方法的思路是:如果乙個樣本在特徵空間中的
k個最相似
(即特徵空間中最鄰近
)的樣本中的大多數屬於某乙個類別,則該樣本也屬於這個類別。
knn演算法中,所選擇的鄰居都是已經正確分類的物件。該方法在定類決策上只依據最鄰近的乙個或者幾個樣本的類別來決定待分樣本所屬的類別。
knn方法雖然從原理上也依賴於極限定理,但在類別決策時,只與極少量的相鄰樣本有關。由於
knn方法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來確定所屬類別的,因此對於類域的交叉或重疊較多的待分樣本集來說,
knn方法較其他方法更為適合。
推薦系統的最最本質的事情就是把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
都很多的時候,你可以用加權的辦法來做。為什麼我會感覺這個演算法的效果會不理想呢?因為,這個演算法總是把你的口味和大眾的平均口味作對等,推薦出來的東西很難是非常個性化的。很容易讓很多使用者的推薦結果趨向一致,也就是大數的平均值,也即大眾的平均口味。
svd的全稱是:
singular value decomposition
,翻譯過來是奇異值分解,是一種矩陣分解的方法。其實,這個方法是提取一般實矩陣「特徵值」的演算法,(這裡特徵值加引號是因為,特徵值是針對方陣來定義的,而一般的
m*n的實矩陣是沒有特徵值的。)其實,矩陣就是乙個線性變換的表示方法,因為乙個向量乘乙個矩陣的結果是乙個向量,第乙個向量通過線性變換來變成第二個向量。線性變換有許多變換方向,比如你可以對乙個影象矩陣做伸縮同時也做平移。那麼特徵值和特徵向量又是什麼?乙個特徵向量就是表示其中的乙個變換方向,而對應的特徵值則表示這個變換方向對於整個線性變換有多麼重要。書歸正傳,那麼奇異值又是什麼?我覺得奇異值就是特徵值從方陣往一般實矩陣的乙個推廣。你將乙個
m*n的實矩陣和它的轉置相乘,就會得到乙個方陣,然後對這個方陣做特徵值分解,得到的特徵值就是所謂的奇異值的平方。我的意思是說,某種意義上,可以講奇異值和特徵值理解為一回事。那麼拿到奇異值又會有什麼用呢?拿到奇異值後,我們就可以抓到主要的成分,丟掉次要和非常次要的成分進行分析。也就是說,我們可以對原來的龐大的常常又非常稀疏的矩陣進行降維和分解,而分解後得到的矩陣都是稠密矩陣。最終我們會得到乙個表示
user
特性的矩陣和乙個表示
item
特性的矩陣。拿到這些資料之後,我們就可以進行推薦了,而且也可以很容易地進行聚類分析。這個演算法的好處在於,可以解決
rating
矩陣的稀疏性問題,同時可以降低矩陣的維度,提高運算速度。但它的缺點是付出的空間代價太大。在做
svd分解時,你需要先把乙個大的
rating
矩陣分解成三個大的矩陣,這三個矩陣需要存在計算機記憶體中,然後才能進行降維。其實,
svd這個方法的思路和
pca(主成分分析法)很像,抓住主要矛盾,忽略次要矛盾。分解降維後的矩陣非常約等於原來的矩陣。
推薦系統演算法總結
最近看推薦系統方面的東西也有段日子了,有書,部落格,唯獨沒有看 總感覺 對於工業界來說用處真的不如學校做課題 那麼大,只要知道某個演算法好不好用以及怎麼用就可以了,也不必知道太多的細節和數學推導。但根據乙個好的演算法,產品部門可以設計出很多很酷的產品,讓使用者倍感web應用的人性化。在看書,看大牛們...
推薦系統演算法總結
阿俊的部落格 最近看推薦系統方面的東西也有段日子了,有書,部落格,唯獨沒有看 總感覺 對於工業界來說用處真的不如學校做課題 那麼大,只要知道某個演算法好不好用以及怎麼用就可以了,也不必知道太多的細節和數學推導。但根據乙個好的演算法,產品部門可以設計出很多很酷的產品,讓使用者倍感web應用的人性化。在...
推薦系統演算法總結
最近看推薦系統方面的東西也有段日子了,有書,部落格,唯獨沒有看 總感覺 對於工業界來說用處真的不如學校做課題 那麼大,只要知道某個演算法好不好用以及怎麼用就可以了,也不必知道太多的細節和數學推導。但根據乙個好的演算法,產品部門可以設計出很多很酷的產品,讓使用者倍感web應用的人性化。在看書,看大牛們...