首页 > IT职业 > IT生活 > 推荐算法——基于物品的协同过滤算法
基于用户的协同过滤算法在用户增长的时候,相似度计算的计算会越来越困难。基于物品的算法给用户推荐他们之前喜欢的物品相似的物品。
算法步骤
计算物品之间的相似度
根据物品的相似度和用户的历史行为给用户生成推荐列表
相似度公式如下:
该公式减轻了热门物品和很多物品相似的可能性。在计算相似度的时候,建立倒排表。相似度的计算与基于用户的相同,不再赘述。
计算相似度之后,u对物品j的兴趣如下:
用户活跃度对物品相似度的影响
考虑到并不是每个用户对推荐的贡献度是一样的,例如某书店店主买了当当上的80%的书存货,这80%的书都会产生关联,但是并不是根据用户的兴趣爱好关联的。我们要降低这个用户的贡献度,引入IUF(inverse user frequence),即用户活跃度对数的倒数。利用IUF修正物品相似度的计算:
物品相似度归一化
Karypis在研究中心发现如果将相似度矩阵按照最大值归一化会提高推荐的准确率。即
完整代码如下
import random
import sys
import math
import os
from operator import itemgetter
random.seed(0)
class ItemBasedCF(object):
def __init__(self):
self.trainset = {}
self.testset = {}
self.n_sim_movie = 20
self.n_rec_movie = 10
self.movie_sim_mat = {}
self.movie_popular = {}
self.movie_count = 0
print('Similar movie number = %d' % self.n_sim_movie, file = sys.stderr)
print('Recommendend movie number = %d' % self.n_rec_movie,file = sys.stderr)
@staticmethod
def loadfile(filename):
fp = open(filename, 'r')
for i, line in enumerate(fp):
yield line.strip('rn')
if i % 100000 == 0:
print ('load %s(%s)' %(filename,i), file = sys.stderr)
fp.close()
print('load %s succ' %filename, file = sys.stderr)
def generate_dataset(self, filename, pivot = 0.7):
trainset_len = 0
testset_len = 0
for line in self.loadfile(filename):
user, movie, rating , _= line.split('::')
if random.random()
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/1499/viewspace-2808656/ ,如需转载,请注明出处,否则将追究法律责任。