使用SVD方法实现电影推荐系统

更新时间:2023-07-11 03:34:53 阅读: 评论:0

使⽤SVD⽅法实现电影推荐系统
这学期选了⼀门名叫《web智能与社会计算》的课,⽼师最后偷懒,最后的课程project作业直接让我们参加百度的⼀个,然后以在这个⽐赛中的成绩作为这门课⼤作业的成绩。不过,最终的结果并不需要百度官⽅的评估,只需要我们的截图即可(参看),例如下⾯这个:
上⾯最重要的就是RMSE的数值,数值越⼩代表偏差越⼩,百度排⾏榜就是按值从⼩到⼤来排列的,这些⼈使⽤的可能是⽐SVD更好的算法,即使这样达到⼀定范围后再想进步就很难了,估计不会有⼈低于0.6这个值。
⾔归正传,下⾯来说说针对百度这个⽐赛如何如何⽤SVD来实现推荐系统,为了了解基本原理可以看看这篇⽂章:
1、数据预处理
本课程的要求是只完成任务⼀即可,做任务⼀的时候只需要⽤到两个数据集,⼀个是训练数据training_t,⼀个是待预测的数据predict,百度的要求如下:
狮子壁纸l任务⼀
怎么贴双眼皮贴n ⽤户评分数据共三列,从左到右依次为urId、movieId、rating。即⽤户id、电影id、该⽤户对该电影的评分。列之间以’\t’分隔,⾏之间以’\r\n’分隔。
n 为预测集合,共两列。从左到右依次是urId,movieId。即⽤户id,电影id.列之间以’\t’分隔,⾏之间以’\r\n’分隔。参赛者需要预测出第三列,即该⽤户对该电影的评分,作为第三列,并提交给评测平台。需要注意的是,参赛者最终提
的是三列,列之间以’\t’分隔,⾏之间以’\r\n’分隔。⾏之间的顺序不能乱,⾏的总数不能少。
下载下来以后发现数据并不是从0开始计数的,training_t格式如下:
7245481 962729 4.0
7245481 356405 4.0
7245481 836383 4.0
7245481 284550 4.0
7245481 723581 4.0
7245481 827305 4.0
7245481 572786 4.0
7245481 473690 4.0
.....................
.....................
.....................
predict集数据格式如下:
7245481 381060
7245481 776002
7245481 980705
7245481 354292
7245481 738735
7245481 624561
7245481 985808
7245481 378349
7245481 778269
7245481 242057
...................
...................
...................
在使⽤SVD的时候需要⽤数组存储每⼀个⽤户和每⼀个电影,这⾥⽤户的ID都是7位,电影的都是6位,如果直接开个七⼋位⼤数组来存储内存估计不够,⽽且还浪费空间,为此需要先把⽤户和电影ID进⾏映射到从0开始⼀个较⼩的范围内。
movieMap = {}
with open('') as fp:
fp_ur = open('', 'w')
寺加偏旁
fp_movis = open('', 'w')
fp_out = open('', 'w')
fp_prediction = open('', 'r')
fp_out2 = open('','w')
for line in fp:
line = line.strip()
if line == '':
continue
tup = line.split()
raw_ur = tup[0]
raw_movie = tup[1]
一汽马自达官网rate = float(tup[2])
if raw_ur not in urMap:
urMap[raw_ur] = len(urMap.keys())
ur_id = urMap[raw_ur]
if raw_movie not in movieMap:
movieMap[raw_movie] = len(movieMap.keys())
movie_id = movieMap[raw_movie]
猪和虎合不合
fp_out.write('{0} {1} {2}\n'.format(ur_id, movie_id, rate))
for raw_ur, ur_id in urMap.items():
fp_ur.write('{0} {1}\n'.format(raw_ur, ur_id))
for raw_movie, movie_id in movieMap.items():
fp_movis.write('{0} {1}\n'.format(raw_movie, movie_id))
for line2 in fp_prediction:
line2 = line2.strip()
if line2 == '':
continue
tup2 = line2.split()
raw_ur2 = tup2[0]
raw_movie2 = tup2[1]
ur_id2 = urMap[raw_ur2]
movie_id2 = movieMap[raw_movie2]
fp_out2.write('{0} {1}\n'.format(ur_id2, movie_id2))
上⾯代码实现了⽤户ID和电影ID的映射过程,实现思想很简单,来⼀个ID,看看之前是否存在过,如果存在⽤那个值替换,如果不存在新加⼊⼀个,这⾥是从0开始存储的,处理完以后得到四个⽂件,⽤户ID,电影ID的键值对,处理完的⼩范围训练集,处理完的⼩范围预测集。
⼩范围的训练集如下:
0 0 4.0
0 1 4.0
0 2 4.0
0 3 4.0
0 4 4.0
0 5 4.0
0 6 4.0
0 7 4.0
0 8 4.0
0 9 4.0
0 10 4.0
0 11 4.0
0 12 4.0
0 13 4.0
0 14 4.0
0 15 4.0
0 16 4.0
0 17 4.0
0 18 4.0
0 19 4.0
0 20 4.0
0 21 4.0
0 22 4.0
0 23 4.0
0 24 4.0
0 25 4.0
0 26 4.0
0 27 4.0
0 28 4.0
0 29 4.0
0 30 4.0
0 31 4.0
0 32 4.0
网络文明倡议书0 33 4.0
0 34 4.0
0 35 4.0
0 36 4.0
0 37
⼩范围预测集如下:
0 617
0 567
0 575
0 1211
0 1735
0 1255
0 620
0 795
0 890
0 706
0 599
0 1248
0 1651
0 621
0 1996
0 1003
经过这步处理,就不需要再开⼤数组存储,统计下来不同的⽤户数,电影数都不到⼀万个。
2、利⽤SVD进⾏训练
得到了⼩规模数据,修改f⽂件⾥⾯的值,这⾥avarageScore这个值需要⾃⼰计算后填⼊,urNum,itemNum是⽤户和电影数⽬的范围,后⾯⼏个值也并不是固定的,可以根据实际情况进⾏修改
去香港留学3.579231 10000 10000 10 0.01 0.05
averageScore urNum itemNum factorNum learnRate regularization
然后运⾏svd.py⽂件即可,我们这⾥训练数据时迭代⼀次⼀般需要⼗五秒的时间,显然训练是很耗时的,为了简单就迭代了五次⽽已。
3、预测数据
预测数据其实就是矩阵的乘法运算,相⽐训练来说速度要快很多。这⾥我们参考上⾯那篇博客⾥⾯的代码,把训练和预测放在⼀起执⾏,最终代码如下:
import math
import random
import cPickle as pickle
#calculate the overall average
def Average(fileName):
fi = open(fileName, 'r')
result = 0.0
cnt = 0
for line in fi:
cnt += 1
arr = line.split()
result += int(arr[2].strip())
return result / cnt
def InerProduct(v1, v2):
result = 0
for i in range(len(v1)):
物质享受
result += v1[i] * v2[i]
return result
def PredictScore(av, bu, bi, pu, qi):
pScore = av + bu + bi + InerProduct(pu, qi)
if pScore < 1:
pScore = 1
elif pScore > 5:
pScore = 5
return pScore
#def SVD(configureFile, testDataFile, trainDataFile, modelSaveFile):
def SVD(configureFile, trainDataFile, modelSaveFile):
#get the configure
fi = open(configureFile, 'r')
line = fi.readline()
arr = line.split()
averageScore = float(arr[0].strip())

本文发布于:2023-07-11 03:34:53,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1090121.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:需要   数据   训练   电影   预测   范围   存在
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图