本節(jié)講述推薦系統(tǒng)之協(xié)同過濾算法,協(xié)同過濾算法包括兩類,一種基于用戶的協(xié)同過濾算法,另外一種基于項的協(xié)同過濾算法。

基于用戶的協(xié)同過濾算法
通過相似用戶進行推薦,給用戶推薦和他興趣形似的其他用戶喜歡的物品。
算法步驟如下:
1.用戶-商品數據轉換成用戶-商品矩陣;
2.計算用戶-商品矩陣中的用戶之前的相似度;
3.利用用戶之間的相似度為用戶中沒有打分的項打分;
代碼實現如下:
def user_based_recommend(data, w, user):
'''基于用戶相似性為用戶user推薦商品
input: data(mat):用戶商品矩陣
w(mat):用戶之間的相似度
user(int):用戶的編號
output: predict(list):推薦列表
'''
m, n = np.shape(data)
interaction = data[user, ] # 用戶user與商品信息
# 1、找到用戶user沒有互動過的商品
not_inter = []
for i in range(n):
if interaction[0, i] == 0: # 沒有互動的商品
not_inter.append(i)
# 2、對沒有互動過的商品進行預測
predict = {}
for x in not_inter:
item = np.copy(data[:, x]) # 找到所有用戶對商品x的互動信息
for i in range(m): # 對每一個用戶
if item[i, 0] != 0: # 若該用戶對商品x有過互動
if x not in predict:
predict[x] = w[user, i] * item[i, 0]
else:
predict[x] = predict[x] + w[user, i] * item[i, 0]
# 3、按照預測的大小從大到小排序
return sorted(predict.items(), key=lambda d:d[1], reverse=True)
基于項的協(xié)同過濾算法
通過相似項進行推薦,為用戶推薦與其打過分的項相似的項。
算法步驟如下:
1.用戶-商品數據轉換成商品-用戶矩陣;
2.計算商品-用戶矩陣中的商品之前的相似度;
3.利用商品之間的相似度為用戶中沒有打分的項打分;
代碼實現如下:
def item_based_recommend(data, w, user):
'''基于商品相似度為用戶user推薦商品
input: data(mat):商品用戶矩陣
w(mat):商品與商品之間的相似性
user(int):用戶的編號
output: predict(list):推薦列表
'''
m, n = np.shape(data) # m:商品數量 n:用戶數量
interaction = data[:,user].T # 用戶user的互動商品信息
# 1、找到用戶user沒有互動的商品
not_inter = []
for i in range(n):
if interaction[0, i] == 0: # 用戶user未打分項
not_inter.append(i)
# 2、對沒有互動過的商品進行預測
predict = {}
for x in not_inter:
item = np.copy(interaction) # 獲取用戶user對商品的互動信息
for j in range(m): # 對每一個商品
if item[0, j] != 0: # 利用互動過的商品預測
if x not in predict:
predict[x] = w[x, j] * item[0, j]
else:
predict[x] = predict[x] + w[x, j] * item[0, j]
# 按照預測的大小從大到小排序
return sorted(predict.items(), key=lambda d:d[1], reverse=True)
相似度的度量方法有以下三種:

1)歐式距離

2)皮爾遜相關系數

3)余弦相似度
