Skip to content

Commit c3354aa

Browse files
Create item_based_recommend.py
1 parent 0360f4d commit c3354aa

File tree

1 file changed

+69
-0
lines changed

1 file changed

+69
-0
lines changed
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
# coding:UTF-8
2+
'''
3+
Date:20160928
4+
@author: zhaozhiyong
5+
'''
6+
7+
import numpy as np
8+
from user_based_recommend import load_data, similarity
9+
10+
def item_based_recommend(data, w, user):
11+
'''基于商品相似度为用户user推荐商品
12+
input: data(mat):商品用户矩阵
13+
w(mat):商品与商品之间的相似性
14+
user(int):用户的编号
15+
output: predict(list):推荐列表
16+
'''
17+
m, n = np.shape(data) # m:商品数量 n:用户数量
18+
interaction = data[:,user].T # 用户user的互动商品信息
19+
20+
# 1、找到用户user没有互动的商品
21+
not_inter = []
22+
for i in xrange(n):
23+
if interaction[0, i] == 0: # 用户user未打分项
24+
not_inter.append(i)
25+
26+
# 2、对没有互动过的商品进行预测
27+
predict = {}
28+
for x in not_inter:
29+
item = np.copy(interaction) # 获取用户user对商品的互动信息
30+
for j in xrange(m): # 对每一个商品
31+
if item[0, j] != 0: # 利用互动过的商品预测
32+
if x not in predict:
33+
predict[x] = w[x, j] * item[0, j]
34+
else:
35+
predict[x] = predict[x] + w[x, j] * item[0, j]
36+
# 按照预测的大小从大到小排序
37+
return sorted(predict.items(), key=lambda d:d[1], reverse=True)
38+
39+
def top_k(predict, k):
40+
'''为用户推荐前k个商品
41+
input: predict(list):排好序的商品列表
42+
k(int):推荐的商品个数
43+
output: top_recom(list):top_k个商品
44+
'''
45+
top_recom = []
46+
len_result = len(predict)
47+
if k >= len_result:
48+
top_recom = predict
49+
else:
50+
for i in xrange(k):
51+
top_recom.append(predict[i])
52+
return top_recom
53+
54+
if __name__ == "__main__":
55+
# 1、导入用户商品数据
56+
print "------------ 1. load data ------------"
57+
data = load_data("data.txt")
58+
# 将用户商品矩阵转置成商品用户矩阵
59+
data = data.T
60+
# 2、计算商品之间的相似性
61+
print "------------ 2. calculate similarity between items -------------"
62+
w = similarity(data)
63+
# 3、利用用户之间的相似性进行预测评分
64+
print "------------ 3. predict ------------"
65+
predict = item_based_recommend(data, w, 0)
66+
# 4、进行Top-K推荐
67+
print "------------ 4. top_k recommendation ------------"
68+
top_recom = top_k(predict, 2)
69+
print top_recom

0 commit comments

Comments
 (0)