python推荐算法itemCF基于物品的协同过滤

# 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

发布了259 篇原创文章 · 获赞 118 · 访问量 187万+

猜你喜欢

转载自blog.csdn.net/c5113620/article/details/103911714
今日推荐