Slope_one

**Slope One** 是一系列應用於協同過濾的算法的統稱。由 Daniel Lemire 和 Anna Maclachlan 於 2005 年發表的論文中提出。 有爭議的是，該算法堪稱基於項目評價的 non-trivial 協同過濾算法最簡潔的形式。該系列算法的簡潔特性使它們的實現簡單而高效，而且其精確度與其它複雜費時的算法相比也不相上下。 . 該系列算法也被用來改進其它算法。.

## 協同過濾簡介及其主要優缺點

協同過濾推薦（Collaborative Filtering recommendation）在信息過濾和信息系統中正迅速成為一項很受歡迎的技術。與傳統的基於內容過濾直接分析內容進行推薦不同，協同過濾分析用戶興趣，在用戶群中找到指定用戶的相似（興趣）用戶，綜合這些相似用戶對某一信息的評價，形成系統對該指定用戶對此信息的喜好程度預測。 
與傳統文本過濾相比，協同過濾有下列優點:

1. 能夠過濾難以進行機器自動基於內容分析的信息。如藝術品、音樂。
2. 能夠基於一些複雜的，難以表達的概念（信息質量、品位) 進行過濾。
3. 推薦的新穎性。

儘管協同過濾技術在個性化推薦系統中獲得了極大的成功，但隨著站點結構、內容的複雜度和用戶人數的不斷增加，協同過濾技術的一些缺點逐漸暴露出來。 
主要有以下三點:

1. 稀疏性 (sparsity)：在許多推薦系統中，每個用戶涉及的信息量相當有限，在一些大的系統如亞馬遜網站中，用戶最多不過就評估了上百萬本書的 1%~2%。造成評估矩陣數據相當稀疏，難以找到相似用戶集，導致推薦效果大大降低。
2. 擴展性 (scalability)：「最近鄰居」算法的計算量隨著用戶和項的增加而大大增加，對於上百萬之巨的數目，通常的算法將遭遇到嚴重的擴展性問題。
3. 精確性 (accuracy)：通過尋找相近用戶來產生推薦集，在數量較大的情況下，推薦的可信度隨之降低。

## Item-based 協同過濾 和 過適

當可以對一些項目評分的時候，比如人們可以對一些東西給出 1 到 5 星的評價的時候，協同過濾意圖基於一個個體過去對某些項目的評分和（龐大的）由其他用戶的評價構成的資料庫，來預測該用戶對未評價項目的評分。**例如**: 如果一個人給披頭四的評分為 5（總分 5）的話，我們能否預測他對席琳狄翁新專輯的評分呢？

這種情形下，item-based 協同過濾系統根據其它項目的評分來預測某項目的分值，一般方法為 線性回歸 ( $f(x)=ax+b$ ). 於是，需要列出 x^2 個線性回歸方程和 2x^2 個回歸量，例如：當有 1000 個項目時，需要列多達 1,000,000 個線性回歸方程， 以及多達 2,000,000 個回歸量。除非我們只選擇某些用戶共同評價過的項目對，否則協同過濾會遇到過適 (過擬合) 問題。

另外一種更好的方法是使用更簡單一些的式子，比如 $f(x)=x+b$ ：實驗證明當使用一半的回歸量的時候，該式子（稱為 Slope One）的表現有時優於線性回歸方程。該簡化方法也不需要那麼多存儲空間和延遲。

Item-based 協同過濾只是 協同過濾的一種形式。其它還有像 user-based 協同過濾一樣研究用戶間的聯繫的過濾系統。但是，考慮到其他用戶數量龐大，item-based 協同過濾更可行一些。

## 電子商務中的 Item-based 協同過濾

人們並不總是能給出評分，當用戶只提供二進位數據（購買與否）的時候，就無法應用 Slope One 和其它基於評分的算法。
二進位 item-based 協同過濾應用的例子之一就是 Amazon 的 item-to-item 專利算法，該算法中用二進位向量表示用戶 - 項目購買關係的矩陣，並計算二進位向量間的 cosine 相關係數。

有人認為 Item-to-Item 算法甚至比 Slope One 還簡單，例如：

在本例當中，項目 1 和項目 2 間的 cosine 相關係數為：

 ${\frac {(1,0,0)\cdot (0,1,1)}{\Vert (1,0,0)\Vert \Vert (0,1,1)\Vert }}=0$ ,

項目 1 和項目 3 間的 cosine 相關係數為：

 ${\frac {(1,0,0)\cdot (1,1,0)}{\Vert (1,0,0)\Vert \Vert (1,1,0)\Vert }}={\frac {1}{\sqrt {2}}}$ ,

而項目 2 和項目 3 的 cosine 相關係數為：

 ${\frac {(0,1,1)\cdot (1,1,0)}{\Vert (0,1,1)\Vert \Vert (1,1,0)\Vert }}={\frac {1}{2}}$ .

於是，瀏覽項目 1 的顧客會被推薦買項目 3 (兩者相關係數最大), 而瀏覽項目 2 的顧客會被推薦買項目 3, 瀏覽了項目 3 的會首先被推薦買項目 1（再然後是項目 2, 因為 2 和 3 的相關係數小於 1 和 3）。該模型只使用了每對項目間的一個參數（cosine 相關係數）來產生推薦。因此，如果有 n 個項目，則需要計算和存儲 n（n-1）/2 個 cosine 相關係數。

## Slope One 協同過濾

為了大大減少過適 (過擬合) 的發生，提升算法簡化實現， **Slope One** 系列易實現的 Item-based 協同過濾算法被提了出來。本質上，該方法運用更簡單形式的回歸表達式 ( $f(x)=x+b$ ) 和單一的自由參數，而不是一個項目評分和另一個項目評分間的線性回歸 ( $f(x)=ax+b$ )。 該自由參數只不過就是兩個項目評分間的平均差值。甚至在某些實例當中，它比線性回歸的方法更準確，而且該算法只需要一半（甚至更少）的存儲量。

**例**:

1. User A 對 Item I 評分為 1 對 Item J. 評分為 1.5
2. User B 對 Item I 評分為 2.
3. 你認為 User B 會給 Item J 打幾分？
4. Slope One 的答案是：2.5 (1.5-1+2=2.5).

舉個更實際的例子，考慮下表：

在本例中，項目 2 和 1 之間的平均評分差值為 (2+(-1))/2=0.5. 因此，item1 的評分平均比 item2 高 0.5。同樣的，項目 3 和 1 之間的平均評分差值為 3。因此，如果我們試圖根據 Lucy 對項目 2 的評分來預測她對項目 1 的評分的時候，我們可以得到 2+0.5 = 2.5。同樣，如果我們想要根據她對項目 3 的評分來預測她對項目 1 的評分的話，我們得到 5+3=8.

如果一個用戶已經評價了一些項目，可以這樣做出預測：簡單地把各個項目的預測通過加權平均值結合起來。當用戶兩個項目都評價過的時候，權值就高。在上面的例子中，項目 1 和項目 2 都評價了的用戶數為 2, 項目 1 和項目 3 都評價了的用戶數為 1, 因此權重分別為 2 和 1.
我們可以這樣預測 Lucy 對項目 1 的評價：

 ${\frac {2\times 2.5+1\times 8}{2+1}}={\frac {13}{3}}=4.33$ 於是，對「n」個項目，想要實現 Slope One，只需要計算並存儲「n」對評分間的平均差值和評價數目即可。

## Slope One 的算法複雜度

設有「n」個項目，「m」個用戶，「N」個評分。計算每對評分之間的差值需要 _n(n-1)/2_ 單位的存儲空間，最多需要 _m n_2 步。計算量也有可能挺悲觀的：假設用戶已經評價了最多 _y_ 個項目，那麼計算不超過 _n_2+_my_2 個項目間計算差值是可能的。 . 
如果一個用戶已經評價過「x」個項目，預測單一的項目評分需要「x」步，而對其所有未評分項目做出評分預測需要最多 (_n-x_)_x_ 步. 
當一個用戶已經評價過「x」個項目時，當該用戶新增一個評價時，更新資料庫需要 _x_ 步.

可以通過分割數據（參照分割和稀疏存儲（沒有共同評價項目的用戶可以被忽略）) 來降低存儲要求，

## 應用 Slope One 的推薦系統

* hitflip（頁面存檔備份，存於網際網路檔案館） DVD 推薦系統
* How Happy（頁面存檔備份，存於網際網路檔案館）
* inDiscover（頁面存檔備份，存於網際網路檔案館） MP3 推薦系統
* RACOFI Composer
* Value Investing News（頁面存檔備份，存於網際網路檔案館） 股票新聞網站
* AllTheBests 購物推薦引擎

## 腳註