協同過濾的實現
我們弄清楚協同過濾是什么之后,再來討論下協同過濾是怎么實現的。
協同過濾主要有三個步驟,首先是獲取用戶群體的喜好記錄,然后找到與特定用戶相類似的其他用戶,最后得出推薦預測。下面詳細說明一下每個步驟。
-
獲取用戶群體的喜好記錄
獲取用戶的喜好數據是協同過濾算法的第一步,也是最基礎的一步。推薦系統的輸入之一就是用戶的喜好信息,所以不管你后面的推薦算法做得有多好,如果第一步沒做好,那么最終得出的推薦效果也會很差。那么,系統是怎么有效獲得用戶的喜好信息的呢?其實,用戶的所有行為都會被系統所記錄,所以系統可以從用戶的行為信息中抽取出用戶的喜好信息。典型的用戶行為分為顯式和隱式兩類,顯式的用戶行為比如有對內容的評分,投票和轉發(fā)等,而隱式的用戶行為比如有在某個頁面停留的時間,對某些物品的點擊查看和購買行為等等。
推薦系統收集完用戶的行為信息后,還需要對這大量的數據信息進行數據清洗,其中最關鍵的兩步是減噪和歸一化。減噪的目的是為了過濾掉用戶行為中的一些失誤操作以及數據中的一些噪聲,從而使得系統分析可以更加的準確。而歸一化的原因在于,在度量用戶對內容喜好程度時,需要對不同類型的用戶數據進行統計。而有的數據取值范圍很大,有的卻很小,如果不進行歸一化處理的話,這些數據將不具有可比性,因為大數值區(qū)間的數據屬性權重會變得很大,而小數值區(qū)間的數據屬性權重就會變得微乎其微。所以,我們應該將這些數據都限制在同一個區(qū)間內,但又不能破壞不同數據之間的相對關系,最簡單的歸一化操作就是將所有數據都進行適當的縮放,使得它們的取值范圍為[0,1]。
進行完以上的預處理操作后,系統可以選擇不同的用戶行為分析方法,最終得到一個反映用戶對不同內容喜好程度的二維相似矩陣,如下圖所示:
相似矩陣.png
矩陣里的值表示的是用戶對不同內容的喜好程度,取值范圍為歸一化后的[0,1]區(qū)間,類型是浮點數值。
尋找與特定用戶相類似的其他用戶
推薦系統收集到用戶的喜好記錄后,會根據這些用戶信息來計算每兩個用戶之間喜好的相似程度,然后對指定用戶進行推薦。用于推薦的協同過濾算法具體分為三類:基于用戶的協同過濾,基于內容項的協同過濾和基于模型的協同過濾,具體的區(qū)別會在下一節(jié)作出詳細介紹。不管是哪類的協同過濾算法,都涉及到計算用戶或者物品間的相似度,而計算相似度有幾種比較經典的方法,下面給出具體介紹。
我們把上面得到的相似矩陣的每一行抽取出來,作為每個對應用戶的行向量,而該行向量其實就對應著該用戶對所有內容的喜好程度。接著我們計算每兩個行向量之間的相似度,其實就是在計算對應用戶間的相似度評價值。當然,也可以把用戶-內容喜好的二維矩陣的每一列抽取出來,對應所有用戶對該內容的喜好程度,然后再計算內容之間的相似度。常用的相似度計算方法有歐幾里得距離,余弦相似度以及皮爾森相關系數。
歐幾里得距離(Euclidean Distance),也稱歐式距離,是最常用,也是最簡單的計算兩個點之間距離的方法,它的數學定義如下:
假設在n維空間里,存在兩點A和B,它們的坐標分別為:A=(x1,x2,...,xn ) ,B=(y1,y2,...,yn )。則它們的歐幾里得距離為:
當n=2或者n=3時,也就是在二維或者三維空間中,兩個點之間的歐氏距離其實就是它們的實際距離。
兩個點距離越小,表示它們的相似度越大,所以歐氏距離其實和相似度成反比關系,我們需要將歐氏距離取個倒數(分母加一是為了防止出現距離為0時的情況):
余弦相似度(Cosine Similarity),主要用于計算文檔之間的相似度,因為文檔向量是比較稀疏的,所以向量中很多值會等于0,表示該文檔不具備某個詞。又因為任意兩個文檔肯定不會包含太多相同的詞,所以如果統計 0-0 匹配的話,那么很多文檔都會與其他文檔很相似(因為每個文檔向量都有很多 0),這顯然是不合理的。而余弦相似度則可以滿足文檔相似性匹配的要求,因為它不僅能忽略 0-0 匹配,而且還能處理非二元向量。余弦相似度的具體公式如下:
我們可以看出,余弦相似度其實就是在計算兩個向量之間的夾角,它們的夾角越小,余弦值越大,說明相似性也越高。
皮爾森相關系數(Pearson Correlation Coefficient),是一種常用于度量兩個變量間緊密程度的方法,取值范圍在 -1 到 1 之間。其中,-1 表示兩個變量完全負相關,0 表示無關,1 表示完全正相關。它的數學表達式如下:
Sx,Sy 分別代表 A 和 B 的樣品標準偏差。
3.得出預測推薦
了解完相似度的計算后,我們就可以根據相似度進行推薦了。前面已經說過,推薦的關鍵步驟是要找出用戶-內容的鄰居,而挑選鄰居的規(guī)則有兩種:一是K近鄰原則,二是基于閾值的鄰居原則。
K近鄰原則(K-neighborhoods)示意圖如 Fig 3 所示,我們假設為用戶1尋找他的鄰居用戶,K近鄰原則要求我們找到與之距離最近的前K個用戶,如示意圖中K取值為 4,則找到與用戶1最近的前 4 個用戶,分別為用戶 2,3,4 和 5。這樣做有著明顯的缺點,因為它不管實際距離為多少,都固定取 K 個鄰居,這樣可能導致的后果是那 K 個鄰居可能有些與指定用戶距離很遠,但被迫被認為與指定用戶喜好相似,從而影響系統的推薦精度。這個問題對孤立點來說更為嚴重。
基于閾值的鄰居原則(Threshold-based neighborhoods)示意圖如 Fig 4 所示,它與 K 近鄰原則有著很大的不同。該原則給定距離 R,然后以指定用戶為中心,距離 R 為半徑畫一個圓,落進該圓范圍內的用戶都認為是指定用戶的鄰居,而不管這些用戶的具體個數有多少。這樣的好處在于,可以確保得到的鄰居用戶與指定用戶的相似度不會相差很遠。基于閾值的鄰居原則強調的是“寧缺毋濫”,它比 K 近鄰原則效果要好,尤其是在數據稀疏的情況下。