import sys,random, math, operator
from operator import itemgetter
random.seed(0)
class UserBasedCF:
def __init__(self):
self.trainset = {}
self.testset = {}
self.resultset = {}
self.mean = {}
self.user_max = 0
self.item_max = 0
self.sim_vector = {}
self.sim_rank = {}
self.mse = 0.0
@staticmethod
def loadfile(filename):
fp = open(filename, 'r')
for i, line in enumerate(fp):
yield line.strip('\r\n')
fp.close()
def generate_dataset(self, filename, pivot=0.7):
trainset_len = 0
testset_len = 0
for line in UserBasedCF.loadfile(filename):
user, movie, rating, timestamp = line.split('\t')
user = int(user)
movie = int(movie)
rating = int(rating)
self.user_max = max(self.user_max, user)
self.item_max = max(self.item_max, movie)
self.trainset.setdefault(user, {})
self.testset.setdefault(user, {})
if random.random() < pivot:
self.trainset[user][movie] = rating
trainset_len += 1
else:
self.testset[user][movie] = rating
testset_len += 1
for user in range(1, self.user_max+1):
all = 0.0
num = 0
for item in range(1, self.item_max+1):
if item in self.trainset[user]:
all += self.trainset[user][item]
num += 1
self.mean[user] = all / num
print testset_len
def cal_user_sim(self):
self.sim_vector.clear()
for u1 in range(1, self.user_max+1):
self.sim_vector.setdefault(u1, {})
# if u1 % 100 == 0:
# print u1
for u2 in range(u1+1, self.user_max+1):
self.sim_vector.setdefault(u2, {})
xy = 0.0
xx = 0.0
yy = 0.0
if u1 in self.trainset and u2 in self.trainset:
for index in range(1, self.item_max+1):
if index in self.trainset[u1] and index in self.trainset[u2]:
xy += self.trainset[u1][index] * self.trainset[u2][index]
xx += self.trainset[u1][index] * self.trainset[u1][index]
yy += self.trainset[u2][index] * self.trainset[u2][index]
if math.sqrt(xx)*math.sqrt(yy) > 0:
self.sim_vector[u1][u2] = xy / (math.sqrt(xx)*math.sqrt(yy))
self.sim_vector[u2][u1] = self.sim_vector[u1][u2]
else:
self.sim_vector[u1][u2] = 0
self.sim_vector[u2][u1] = self.sim_vector[u1][u2]
def cal_user_sim2(self):
self.sim_vector.clear()
for u1 in range(1, self.user_max+1):
self.sim_vector.setdefault(u1, {})
# if u1 % 100 == 0:
# print u1
for u2 in range(u1+1, self.user_max+1):
self.sim_vector.setdefault(u2, {})
xy = 0.0
xx = 0.0
yy = 0.0
num_both = 0.0
num1 = 0.0
num2 = 0.0
if u1 in self.trainset and u2 in self.trainset:
for i in range(1, self.item_max+1):
if i in self.trainset[u1]:
num1 += 1
if i in self.trainset[u2]:
num2 += 1
if i in self.trainset[u1] and i in self.trainset[u2]:
num_both += 1
xy += self.trainset[u1][i] * self.trainset[u2][i]
xx += self.trainset[u1][i] * self.trainset[u1][i]
yy += self.trainset[u2][i] * self.trainset[u2][i]
if math.sqrt(xx) * math.sqrt(yy) > 0:
self.sim_vector[u1][u2] = xy / (math.sqrt(xx)*math.sqrt(yy)) * num_both * num_both / num1 / num2
self.sim_vector[u2][u1] = self.sim_vector[u1][u2]
else:
self.sim_vector[u1][u2] = 0
self.sim_vector[u2][u1] = self.sim_vector[u1][u2]
def getRecommendation(self, k):
self.sim_rank.clear()
self.resultset.clear()
for i in range(1, self.user_max+1):
self.sim_rank.setdefault(1, {})
self.sim_rank[i] = sorted(self.sim_vector[i].iteritems(), key=lambda x: x[1], reverse=True)
for i in range(1, self.user_max+1):
self.resultset.setdefault(i, {})
for j in range(1, self.item_max+1):
sim_sum = 0.0
if j not in self.trainset[i]:
self.resultset[i][j] = 0.0
for kk in range(0, k):
sim_user = self.sim_rank[i][kk][0]
sim_value = self.sim_rank[i][kk][1]
if j in self.trainset[sim_user]:
self.resultset[i][j] += (self.trainset[sim_user][j] - self.mean[sim_user]) * sim_value
sim_sum += sim_value
self.resultset[i][j] /= sim_sum
self.resultset[i][j] += self.mean[i]
if self.resultset[i][j] < 0:
self.resultset[i][j] = 0
def evaluation(self):
mse_cnt = 0
self.mse = 0.0
for i in range(1, self.user_max+1):
for j in range(1, self.item_max+1):
if j in self.testset[i]:
self.mse += (self.testset[i][j] - self.resultset[i][j]) * (self.testset[i][j] - self.resultset[i][j])
mse_cnt += 1
self.mse /= mse_cnt
if __name__ == '__main__':
usercf = UserBasedCF()
usercf.generate_dataset('u.data')
for i in range(5, 35, 5):
print '---------------------------------------'
usercf.cal_user_sim()
usercf.getRecommendation(i)
usercf.evaluation()
print i, usercf.mse
usercf.cal_user_sim2()
usercf.getRecommendation(i)
usercf.evaluation()
print i, usercf.mse
没有合适的资源?快使用搜索试试~ 我知道了~
基于用户的协同过滤.zip
共4个文件
py:2个
jpg:1个
data:1个
需积分: 5 0 下载量 76 浏览量
2024-05-19
22:01:18
上传
评论
收藏 868KB ZIP 举报
温馨提示
协同过滤算法(Collaborative Filtering)是一种经典的推荐算法,其基本原理是“协同大家的反馈、评价和意见,一起对海量的信息进行过滤,从中筛选出用户可能感兴趣的信息”。它主要依赖于用户和物品之间的行为关系进行推荐。 协同过滤算法主要分为两类: 基于物品的协同过滤算法:给用户推荐与他之前喜欢的物品相似的物品。 基于用户的协同过滤算法:给用户推荐与他兴趣相似的用户喜欢的物品。 协同过滤算法的优点包括: 无需事先对商品或用户进行分类或标注,适用于各种类型的数据。 算法简单易懂,容易实现和部署。 推荐结果准确性较高,能够为用户提供个性化的推荐服务。 然而,协同过滤算法也存在一些缺点: 对数据量和数据质量要求较高,需要大量的历史数据和较高的数据质量。 容易受到“冷启动”问题的影响,即对新用户或新商品的推荐效果较差。 存在“同质化”问题,即推荐结果容易出现重复或相似的情况。 协同过滤算法在多个场景中有广泛的应用,如电商推荐系统、社交网络推荐和视频推荐系统等。在这些场景中,协同过滤算法可以根据用户的历史行为数据,推荐与用户兴趣相似的商品、用户或内容,从而提高用户的购买转化率、活跃度和社交体验。 未来,协同过滤算法的发展方向可能是结合其他推荐算法形成混合推荐系统,以充分发挥各算法的优势。
资源推荐
资源详情
资源评论
收起资源包目录
基于用户的协同过滤.zip (4个子文件)
content
result.jpg 84KB
Main.py 6KB
u.data 1.89MB
test.py 623B
共 4 条
- 1
资源评论
生瓜蛋子
- 粉丝: 3824
- 资源: 5235
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功