基于ItemCF的协同过滤算法
实训需要实现一个推荐系统,所以先实现了一个比较简单的协同过滤算法
协同过滤的思想来源是充分利用集体智慧,即在大量的人群的行为和数据集中收集答案,以帮助我们对整个人群得到统计意义上的结论:
协同过滤算法有两个基本出发点:
- 兴趣相近的用户可能会对同样的东西感兴趣;
- 用户可能较偏爱与其已购买的东西相类似的商品。
基于1的就是UserCF
基于2的就是ItemCF
这两个算法各有千秋,但是它们都需要离线计算,一般以天为单位更新
众所周知,用户可能产生新的行为,浏览新的物品,
这时候虽然ItemCF的相似度矩阵没有更新,但是仍然可以使用为用户推荐,
所以虽然ItemCF需要离线计算,但是它也具有一定的动态性
(一般来说,用户相似度变化要比物品相似度变化快)
ItemCF的步骤可以大致分为两个部分
- 将物品的用户当作物品的特征向量,然后物品产品之间的相似度,得到物品相似度矩阵
- 从用户已经产生行为的物品中找到于其相似的K个物品(从相似度矩阵中),两次加权累和(用户产生行为物品的评分*相似物品相似度),找出评分最高的N件物品推荐给用户
然而具体实现可以参考以下代码:
import random
import math
from operator import itemgetter
class ItemBasedCF:
# 初始化参数
def __init__(self):
# 找到相似的20个菜谱,为目标用户推荐10个菜谱
# K值:找到和已经看过菜谱最相似的20个菜谱
self.n_sim_cookbook = 20
# N值: 将其中前10名推荐给用户
self.n_rec_cookbook = 10
# 将数据集划分为训练集和测试集
self.trainSet = {}
self.testSet = {}
# 用户相似度矩阵
self.cookbook_sim_matrix = {}
self.cookbook_popular = {}
self.cookbook_count = 0
# print('Similar cookbook number = %d' % self.n_sim_cookbook)
# print('Recommended cookbook number = %d' % self.n_rec_cookbook)
# 读文件得到“用户-菜谱”数据(基于比例划分数据)
def