# itemCF Demo
# python 3.7
import numpy as np
import math
# test data
users=["u1","u2","u3"]
item_like_list=["a,b,c","a,b,c,e,f","a,e"]
# 单个商品喜欢人数
def check_1item(item):
return sum(list(map(lambda x:item in x,item_like_list)))
# print(check_1item("a"))
# 同时喜欢item1与item2的人数
def check_2items(item1,item2):
m = sum(list(map(lambda x: item1 in x and item2 in x,item_like_list)))
# print("%s与%s的交集数为%d"%(item1,item2,m))
return m
# print(check_2items("a","e"))
# 商品唯一列表
itemAll=set()
for items in item_like_list:
for itemOne in items.split(","):
itemAll.add(itemOne)
itemUniList=list(itemAll)
itemUniList.sort()
print("商品唯一总列表:")
print(itemUniList)
# 共现矩阵,对称矩阵
mat = np.mat(np.zeros([len(itemUniList),len(itemUniList)],dtype=int))
for i in range(len(itemUniList)):
for j in range(len(itemUniList)):
if (i == j):
continue
m=check_2items(itemUniList[i],itemUniList[j])
if (mat[i, j] == 0):
mat[i, j] = m
if (mat[j, i] == 0):
mat[j, i] = m
print("商品共现矩阵统计:")
print (mat)
# 喜欢单个商品的人数
singleCount={}
for item in itemUniList:
singleCount[item]=check_1item(item)
print("单个商品人数统计:")
print(singleCount)
# 余弦相似度矩阵
matCos = np.mat(np.zeros([len(itemUniList),len(itemUniList)],dtype=float))
for i in range(mat.shape[0]):
for j in range(mat.shape[1]):
matCos[i,j] = mat[i,j]/(math.sqrt(singleCount[itemUniList[i]])*math.sqrt(singleCount[itemUniList[j]]))
print("余弦相似度矩阵:")
print(matCos)
# 计算给u1的推荐,取k为3
# u1喜欢abc,所以计算剩余的ef得分
# 先从余弦相似度矩阵的ef行,根据余弦值最大值排序取k个,e-->a,f,b f-->b,c,e
# 上面的集合与u1喜欢的abc取交集,e-->a,b f-->b,c
# (e,a)*1 + (e,b)*1为u1对e物品的兴趣度
# (f,b)*1 + (f,c)*1为u1对f物品的兴趣度
推荐系统初探:ItemCF算法实现知乎问题推荐
协同过滤推荐算法:UserCF、ItemCF
«推荐系统实践 » p63