本章主要內容是,如何根據羣體偏好來爲人們提供推薦,構建一個系統,用來尋找具有相同品味的人,並根據他人的喜好來推薦物品。基於此的應用有很多,比如電商系統的商品推薦、熱門網站推薦,以及音樂和電影推薦等等應用。
協同過濾
想要推薦,首先應該知道用戶的喜好,最簡單的方式莫過於詢問,但是隨着數據量的增多,這種方式不切實際。因此人們發展了一種稱爲協同過濾的技術。
基於用戶的協同過濾的做法是對一大羣人進行搜索,並且從中找出與我們喜好相近的一小羣人。然後我們通過某種算法對這些人偏愛的其他內容進行考查,並且將他們組合起來構造出來一個經過排名了的推薦列表。這就是最簡單的一個實現。
- 蒐集用戶偏好
此書用Python實現算法,蒐集偏好使用的是字典嵌套字典,形如critics={'Lisa': {'film1':2,'film2':3}}
這樣的評分方式,評分從1–5代表喜好程度。 - 尋找相近用戶
找到某一種算法可以計算用戶之間的相似度,從而得到相似度評價值,這裏介紹了兩種方式:歐幾里得距離和皮爾遜相關度。
(一)歐幾里得距離:最簡單的解釋就是距離公式。將每一個電影作爲一個特徵,評分作爲在此特徵上的偏移,兩個人對於電影評分的空間距離越近,代表兩人越相似。
歐幾里得公式:
d=sqrt(∑(x1−x2)2)
(二)皮爾遜相關係數:某些情況下,兩個人對於某些電影的評價相似,但是評價分數一個人比另一個人偏高。例如,A對於電影1評分1分,對於電影2評分4分,而B對於電影1評分2分,對於電影2評分5分,這時,我們也認爲兩人爲相似用戶,在這個情況之下,用歐幾里得公式計算是不行的,因此可以使用皮爾遜相關係數。
ρ=cov(X,Y)σxσy=E((X−μx)(Y−μy))σxσy=E(XY)−E(X)E(Y)E(X2)−E2(X)−−−−−−−−−−−−−√E(Y2)−E2(Y)−−−−−−−−−−−−−√
計算公式如下:
ρ=N∑XY−∑X∑YN∑X2−(∑X)2−−−−−−−−−−−−−−−√N∑Y2−(∑Y)2−−−−−−−−−−−−−−√
計算要點:找出兩者都曾評價過的物品。然後計算兩者的評分總和以及平方和,並求得評分的乘積之和。最後利用上述公式計算ρ.
代碼實現
#Python
critics = {'Lisa Rose': {'Lady in the Water': 2.5, 'Snakes on a Plane': 3.5,
'Just My Luck': 3.0, 'Superman Returns': 3.5, 'You, Me and Dupree': 2.5,
'The Night Listener': 3.0},
'Gene Seymour': {'Lady in the Water': 3.0, 'Snakes on a Plane': 3.5,
'Just My Luck': 1.5, 'Superman Returns': 5.0, 'The Night Listener': 3.0,
'You, Me and Dupree': 3.5},
'Michael Phillips': {'Lady in the Water': 2.5, 'Snakes on a Plane': 3.0,
'Superman Returns': 3.5, 'The Night Listener': 4.0},
'Claudia Puig': {'Snakes on a Plane': 3.5, 'Just My Luck': 3.0,
'The Night Listener': 4.5, 'Superman Returns': 4.0,
'You, Me and Dupree': 2.5},
'Mick LaSalle': {'Lady in the Water': 3.0, 'Snakes on a Plane': 4.0,
'Just My Luck': 2.0, 'Superman Returns': 3.0, 'The Night Listener': 3.0,
'You, Me and Dupree': 2.0},
'Jack Matthews': {'Lady in the Water': 3.0, 'Snakes on a Plane': 4.0,
'The Night Listener': 3.0, 'Superman Returns': 5.0, 'You, Me and Dupree': 3.5},
'Toby': {'Snakes on a Plane': 4.5, 'You, Me and Dupree': 1.0, 'Superman Returns': 4.0}}
from math import sqrt
def sim_pearson(prefs, p1, p2):
# Get the list of mutually rated items
si = {}
for item in prefs[p1]:
if item in prefs[p2]:
si[item] = 1
# if they are no ratings in common, return 0
if len(si) == 0:
return 0
# Sum calculations
n = len(si)
# Sums of all the preferences
sum1 = sum([prefs[p1][it] for it in si])
sum2 = sum([prefs[p2][it] for it in si])
# Sums of the squares
sum1Sq = sum([pow(prefs[p1][it], 2) for it in si])
sum2Sq = sum([pow(prefs[p2][it], 2) for it in si])
# Sum of the products
pSum = sum([prefs[p1][it] * prefs[p2][it] for it in si])
# Calculate r (Pearson score)
num = pSum - (sum1 * sum2 / n)
den = sqrt((sum1Sq - pow(sum1, 2) / n) * (sum2Sq - pow(sum2, 2) / n))
if den == 0:
return 0
r = num / den
return r
print(sim_pearson(critics,'Lisa Rose','Gene Seymour'))
0.396059017191
物品推薦
用上述計算相似度方法計算得出相似度以後,將所有用戶對某一部電影的評分乘以相似度再求和再除以相似度求和,從而得到預測的用戶對該部電影的評分,從而決定是否推薦給用戶。代碼如下:
#Python
見書 P16
匹配商品
基於物品的協同過濾使用的方式是,用戶羣體對於該物品的評分如果對其他另外一個物品相似,則認爲兩物品爲相似物品。算法跟上述相似度算法相同。
兩者的選擇
基於用戶的協同過濾和物品的協同過濾,在數據集變大的時候,生成推薦列表的速度,很明顯是基於物品的協同過濾較快,因爲沒有冷啓動的問題,但是它會有維護相似用戶表的空間消耗。
補充說明
下面說明一下幾種常用的相似度計算的方法。
1. 餘弦相似性
2. 修正的餘弦相似性
3. 相關相似性
4. 歐氏距離