#!/usr/bin/python
# -*- coding: utf-8 -*-
'''
@desc 基于用户的协同过滤算法,方法为User-IIF
@author cheng.cheng
@email [email protected]
@date 2012-06-18
'''
import sys
import random
import math
from operator import itemgetter
def ReadData(file,data):
''' 读取评分数据
@param file 评分数据文件
@param data 储存评分数据的List
'''
for line in file:
line = line.strip('\n')
linelist = line.split("::")
data.append([linelist[0],linelist[1]])
def SplitData(data, M, key, seed):
''' 将数据分为训练集和测试集
@param data 储存训练和测试数据的List
@param M 将数据分为M份
@param key 选取第key份数据做为测试数据
@param seed 随机种子
@return train 训练数据集Dict
@return test 测试数据集Dict
'''
test = dict ()
train = dict ()
random.seed(seed)
for user,item in data:
if random.randint(0,M) == key:
if user in test:
test[user].append(item)
else:
test[user] = []
else:
if user in train:
train[user].append(item)
else:
train[user] = []
return train, test
def UserSimilarity(train):
''' 计算用户相似度
@param train 训练数据集Dict
@return W 记录用户相似度的二维矩阵
'''
#建立物品到用户之间的倒查表,降低计算用户相似度的时间复杂性
item_users = dict()
for u, items in train.items():
for i in items:
if(i not in item_users):
item_users[i] = set()
item_users[i].add(u)
C = dict()
N = dict()
#计算用户之间共有的item的数目
for i, users in item_users.items():
for u in users:
if(u not in N):
N[u] = 1
N[u] += 1
for v in users:
if u == v:
continue
if(u not in C):
C[u] = dict()
if(v not in C[u]):
C[u][v] = 0
#对热门物品进行了惩罚,采用这种方法被称做UserCF-IIF
C[u][v] += (1 / math.log(1+len(users)))
W = dict()
for u, related_users in C.items():
for v, cuv in related_users.items():
if(u not in W):
W[u] = dict()
#利用余弦相似度计算用户之间的相似度
W[u][v] = cuv / math.sqrt(N[u] * N[v])
return W
def Coverage(train, test, W, N, K):
''' 获取推荐结果
@param user 输入的用户
@param train 训练数据集Dict
@param W 记录用户相似度的二维矩阵
@param N 推荐结果的数目
@param K 选取近邻的数目
'''
recommned_items = set()
all_items = set()
for user in train.keys():
for item in train[user]:
all_items.add(item)
rank = GetRecommendation(user, train, W, N, K)
for item, pui in rank:
recommned_items.add(item)
#print 'len: ',len(recommned_items),'\n'
return len(recommned_items) / (len(all_items) * 1.0)
def GetRecommendation(user, train ,W, N, K):
''' 获取推荐结果
@param user 输入的用户
@param train 训练数据集Dict
@param W 记录用户相似度的二维矩阵
@param N 推荐结果的数目
@param K 选取近邻的数目
'''
rank = dict()
interacted_items = train[user]
#选取K个近邻计算得分
for v,wuv in sorted(W[user].items(), key=itemgetter(1),\
reverse = True)[0:K]:
for i in train[v]:
if i in interacted_items:
continue
if i in rank:
rank[i] += wuv
else:
rank[i] = 0
#取得分最高的N个item作为推荐结果
rank = sorted(rank.items(), key=itemgetter(1), reverse = True)[0:N]
return rank
def Recall(train, test, W, N, K):
''' 计算推荐结果的召回率
@param train 训练数据集Dict
@param test 测试数据集Dict
@param W 记录用户相似度的二维矩阵
@param N 推荐结果的数目
@param K 选取近邻的数目
'''
hit = 0
all = 0
for user in train.keys():
if user in test:
tu = test[user]
rank = GetRecommendation(user, train, W, N, K)
for item, pui in rank:
if item in tu:
hit+= 1
all += len(tu)
#print(hit)
#print(all)
return hit/(all * 1.0)
def Precision(train, test, W, N, K):
''' 计算推荐结果的准确率
@param train 训练数据集Dict
@param test 测试数据集Dict
@param W 记录用户相似度的二维矩阵
@param N 推荐结果的数目
@param K 选取近邻的数目
'''
hit = 0
all = 0
for user in train.keys():
if user in test:
tu = test[user]
rank = GetRecommendation(user, train, W, N, K)
for item, pui in rank:
if item in tu:
hit+= 1
all += N
#print(hit)
#print(all)
return hit/(all * 1.0)
def Popularity(train, test, W, N, K):
''' 计算推荐结果的流行度
@param train 训练数据集Dict
@param test 测试数据集Dict
@param W 记录用户相似度的二维矩阵
@param N 推荐结果的数目
@param K 选取近邻的数目
'''
item_popularity = dict()
for user, items in train.items():
for item in items:
if item not in item_popularity:
item_popularity[item] = 0
item_popularity[item] += 1
ret = 0
n = 0
for user in train.keys():
rank = GetRecommendation(user, train, W, N, K)
for item, pui in rank:
ret += math.log(1+ item_popularity[item])
n += 1
ret /= n * 1.0
return ret
if __name__ == '__main__':
data = []
M = 8
key = 1
seed = 1
N = 10
K = 80
W = dict()
rank = dict()
print("this is the main function")
file = open('./ml-1m/rat.dat')
ReadData(file,data)
train,test = SplitData(data, M, key, seed)
W = UserSimilarity(train)
recall = Recall(train, test, W, N, K)
precision = Precision(train, test, W, N, K)
popularity = Popularity(train, test, W, N, K)
coverage = Coverage(train, test, W, N, K)
print 'recall: ',recall,'\n'
print 'precision: ',precision,'\n'
print 'Popularity: ',popularity,'\n'
print 'coverage: ', coverage,'\n'
else :
print("this is not the main function")
没有合适的资源?快使用搜索试试~ 我知道了~
实现的基于user和item的协同过滤算法+源代码+文档说明
共8个文件
dat:5个
py:2个
readme:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 123 浏览量
2024-04-16
17:03:52
上传
评论
收藏 5.69MB ZIP 举报
温馨提示
- 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! <项目介绍> 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------
资源推荐
资源详情
资源评论
收起资源包目录
recommend-CF-master.zip (8个子文件)
recommend-CF-master
ml-1m
README 5KB
rating.dat 2.25MB
users.dat 131KB
ratings.dat 23.45MB
movies.dat 167KB
rat.dat 1.12MB
ItemCF.py 7KB
UserCF.py 7KB
共 8 条
- 1
资源评论
机器学习的喵
- 粉丝: 518
- 资源: 1269
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功