python代码怎样写可以在movielens数据集下载中获取每个用户的行为时间

当前访客身份:游客 [
生活在计算机虚构的荣誉世界中,不要忘乎所以;计算机能力很有限,需要借助其他领域的合作。xiaoqiangkx.github.io
目前还没有任何评论
今日访问:0
昨日访问:4
本周访问:96
本月访问:179
所有访问:4148
使用Mahout搭建推荐系统之入门篇2-玩转你的数据1
发表于2年前( 19:35)&&
阅读(586)&|&评论()
0人收藏此文章,
用意: 搞推荐系统或者数据挖掘的, 对数据要绝对的敏感和熟悉, 并且热爱你的数据. 分析数据既要用统计分析那一套,又要熟悉业务发掘有趣的特征(feature). 后者有意思的多,但是因为我业务做的不多,还不太熟悉, 跪求大牛们分析业务经历.&听豆瓣上的大神"懒惰啊我"说过,有一个Nokia的比赛,有一个团队直接用陀螺仪参数就发现了性别分布,因为男生手机都放在口袋里, 而女生往往放在包里面. 不知道记错没有.
下面主要讲些统计分析或者简单的内容分析, 说说我自己的总结, 这个话题以后可以常说.
这部分不涉及Mahout的内容,主要是使用Python和Linux命令简单处理数据. 不感兴趣的朋友可以直接跳到最后面看看一些不错的数据集推荐.&
一. 前期数据分析的三个阶段
1. 打开你的数据,读懂每一行的含义
2. 统计你的数据, 用python\excel pivot table\R\SPSS等都可以, 考虑到复用性建议写代码
& & 数据的行数
&&&&item和user的数量
&&&&rate的评分方式,是boolean还是1-5分或者其它.
& & 数据稀疏还是稠密 sparse or dense
3. 找到合适的存储方式存储,DenseVector还是SparseVector
二. 数据分析实例
&&&现在国内的数据还比较少, 感谢下百度,提供了一些不错的数据.
& & 首先来看一份国内的数据
& &&百度举办的电影推荐系统算法创新大赛提供的用户数据.&
<span style="font-family:Helvetica, Arial, 'Droid Sans', sans-font-size:14line-height:19.. 读懂你的数据, 知道每一行的含义.
一共有五个文件:
movie_tag.txt 每行表示一个有效数据项, 下面类似. 每行由电影id以及tag的id, 用"\t"隔开; tag用","隔开.
training_set.txt &每行表示用户id, 电影id, 评分, 用"\t"隔开.
user_social.txt &每行表示用户id和用户关注的好友id集合; 好友id集合用","隔开.
predict.txt 每行表示用户id和电影id
user_history.txt 每行表示用户id和用户看过的电影id.&
数据如下图所示:&head -n 2 *.txt
2. 数据统计
&&&&用户个数\电影个数
&&&&每个用户平均电影个数,平均值,标准差\每个电影平均用户个数,平均值,标准差
& & 评分的范围
行数分析: wc -l *.txt
traning_set.txt数量为1262741行,predict.txt数量为314679行, 电影和用户数量未知,大概在万的级别,所以写些
python代码简单分析一下. 100万用户级别的数据项使用python dict数据结构消耗内存在MByte级别且由于Python使用共享池共享int类,对象的冗余开销也不会暴涨, 普通PC既可以计算.
Python数据分析
Python代码输出如下:
&&&& 用户(总数,平均值,标准差)=( . )
&&&& 电影(总数,平均值,标准差)=( . )
&&&& 评分范围=( 1.0 5.0 )
& & 由数据可见,用户数量和电影数量在10000左右级别, 由于电影更少一些,使用item-based较合适;当然,由于用户和电影数量差距不大,最终还是要用实验来证明一下两者的性能优异.
& & 另外:两者标准差分别为223与336可见, 基本可以判定数据为稀疏矩阵.
[比较: 我使用了movieLens上的1M数据集进行对比, 运行结果如下]
用户(总数,平均值,标准差)=( . )
电影(总数,平均值,标准差)=( . )
评分范围=( 1.0 5.0 )
& & 评价: 平均值更大, 数据更加致密一些. 每个用户和电影的数据推荐效果应该也会更好一些.
[吐槽点: 你给了id不给电影和标签的真实名称,看着一堆id, 推荐一大堆数字有个毛兴趣啊. &但是movieLens给出了电影名称,以后还是使用movieLens来作为预测数据更加有兴趣一些.]
Python代码如下:
# -*- coding: utf-8 -*-
Created on 2 Nov, 2013
@author: cool
import math
#return user_num, movie_num, movie_mean, movie_variant
def countData(filename):
user_count = {} #the number of movie about every user
movie_count = {} #the number of user about every movie
max = -100
#Assuming no duplicate data
for line in open(filename):
(user, movie, rating) = line.split("\t")
#(user, movie, rating, xx) = line.split("::")
rating = float(rating.replace(r"\r\r\n", ""))
#print rating
user_count.setdefault(user, 0)
user_count[user] += 1
movie_count.setdefault(movie, 0)
movie_count[movie] += 1
if (max & rating): max = rating
if (min & rating): min = rating
uSum = sum([user_count[user] for user in user_count])
uSqSum = sum([user_count[user]**2 for user in user_count])
user_mean = float(uSum) / len(user_count)
user_variant = math.sqrt(float(uSqSum) / len(user_count) - user_mean**2)
mSum = sum([movie_count[movie] for movie in movie_count])
mSqSum = sum([movie_count[movie]**2 for movie in movie_count])
movie_mean = float(mSum) / len(movie_count)
movie_variant = math.sqrt(float(mSqSum) / len(movie_count) - movie_mean**2)
return len(user_count), len(movie_count), user_mean, user_variant, movie_mean, movie_variant, min, max
if __name__ == '__main__':
(user_count, movie_count, user_mean, user_variant, movie_mean, movie_variant, min, max) \
= countData("../data/baidu/training_set.txt")
#(user_count, movie_count, user_mean, user_variant, movie_mean, movie_variant, min, max) \
# = countData("../data/baidu/ratings.dat")
print "用户(总数,平均值,标准差)=(", user_count, user_mean, user_variant, ")"
print "电影(总数,平均值,标准差)=(", movie_count, movie_mean, movie_variant, ")"
print "评分范围=(", min, max, ")"
三. 不错的数据来源
[1] GroupLens数据集(推荐相关:电影数据\书\笑话等):
[2] UCI数据集(数据丰富,无所不包)
[3] Kaggle数据(数据丰富,规范,KDD2012是腾讯提供的微博数据)
[4] Scikit-learn 提供的一些Python数据库,可以教你怎么玩转数据,我自己只玩过一点,以后得深挖一下. 此外这个Python机器学习库的文档堪称天人所写&
1)">1)">1" ng-class="{current:{{currentPage==page}}}" ng-repeat="page in pages"><li class='page' ng-if="(endIndex<li class='page next' ng-if="(currentPage
相关文章阅读[转载]用python写一个载入和处理Movielens数据的示例程序
movielens是一个开源的训练和测试推荐系统的数据包。
测试自己的推荐系统的准备工作就是把这个测试数据载入程序,并且处理成自己程序设定的格式。
以下是python源码:(路径都是我电脑中的文件路径,大家需要修改成自己的路径)
#!/usr/bin/python
#这个程序先把100k那个包里u.item的电影id和电影名称提取出来,并生成一个电影字典movies,然后
#将u.data中的用户id和电影id以及对应的rating提取出来,生成一个用户的打分字典。
loadMovieLens_100k(path='C:/Users/Administrator/Desktop/ci_code/ml-100k'):
# Get movie titles
for line in open(path+'/u.item'):
(id,title)=line.split('|')[0:2]
movies[id]=title
# Load data
for line in open(path+'/u.data'):
(user,movieid,rating,ts)=line.split('t')
prefs.setdefault(user,{})
prefs[user][movies[movieid]]=float(rating)
return prefs
#这个程序用同样的方法生成了1m那个包的评分字典
loadMovieLens_1M(path='C:/Users/Administrator/Desktop/ci_code/ml-1m'):
#get ratings
for line in open(path+'/ratings.dat'):
(user,movie,rating,ts)=line.split('::')
prefs.setdefault(user,{})
prefs[user][movie]=float(rating)
return prefs
#将电影和流派提取出来,写成一个电影-流派的矩阵字典
loadMovieTag(path='C:/Users/Administrator/Desktop/ci_code/ml-1m'):
#get movie-tag matrix
for line in open(path+'/movies.dat'):
(id,title,tag)=line.split('::')
movies[id]=tag
# movies=sorted(movies.items(),key=lambda
d:d[0],reverse=False)
return movies
#将电影和流派提取出来,写成一个用户-电影-流派的字典
loadUserTag(path='C:/Users/Administrator/Desktop/ci_code/ml-1m'):
#get movie-tag matrix
for line in open(path+'/movies.dat'):
(movie,title,tag)=line.split('::')
movies[movie]=tag
for line in open(path+'/ratings.dat'):
(userid,movieid)=line.split('::')[0:2]
users.setdefault(userid,{})
users[userid][movieid]=movies[movieid]
# users=sorted(users.items(),key=lambda
d:d[0],reverse=False)#sort the users dict as the key of dict
return users
#将电影--流派字典输出成文件
def outputMovieTag():
movie_tag=loadMovieTag()
f=file('tag.dat','w+')
for num in movie_tag:
f.write('%s::' %num)
for tag in movie_tag[num]:
f.write('%s' %tag)
outputMovieTag()
#将用户-电影--流派字典输出成文件
def outputUserTag():
user_tag=loadUserTag()
f=file('user_tag.dat','w+')
for user in user_tag:
f.write('userid:%sn' %user)#user id
for movie in user_tag[user]:
f.write('t%s: ' %movie)
f.write('%s' %user_tag[user][movie])
f.write('n')
outputUserTag()
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。当前访客身份:游客 [
当前位置:
在 用户 —— 物品(user - item)的数据关系下很容易收集到一些偏好信息(preference),比如评分。利用这些分散的偏好信息,基于其背后可能存在的关联性,来为用户推荐物品的方法,便是协同过滤,或称协作型过滤(collaborative filtering)。
这种过滤算法的有效性基础在于:
用户的偏好具有相似性,即用户是可分类的。这种分类的特征越明显,推荐的准确率就越高
物品之间是存在关系的,即偏好某一物品的任何人,都很可能也同时偏好另一件物品
不同环境下这两种理论的有效性也不同,应用时需做相应调整。如豆瓣上的文艺作品,用户对其的偏好程度与用户自身的品位关联性较强;而对于电子商务网站来说,商品之间的内在联系对用户的购买行为影响更为显著。当用在推荐上,这两种方向也被称为基于用户的和基于物品的。本文内容为基于用户的。
影评推荐实例
本文主要内容为基于用户偏好的相似性进行物品推荐,使用的数据集为 GroupLens Research 采集的一组从 20 世纪 90 年代末到 21 世纪初由 MovieLens 用户提供的电影评分数据。数据中包含了约 6000 名用户对约 4000 部电影的 100万条评分,五分制。数据包可以从网上下载到,里面包含了三个数据表——users、movies、ratings。因为本文的主题是基于用户偏好的,所以只使用 ratings 这一个文件。另两个文件里分别包含用户和电影的元信息。
本文使用的数据分析包为 pandas,环境为 IPython,因此其实还默认携带了 Numpy 和 matplotlib。下面代码中的提示符看起来不是 IPython 环境是因为 Idle 的格式发在博客上更好看一些。
首先将评分数据从 ratings.dat 中读出到一个 DataFrame 里:
&&&importpandas as pd
&&&frompandasimportSeries,DataFrame
&&& rnames=['user_id','movie_id','rating','timestamp']
&&& ratings=pd.read_table(r'ratings.dat',sep='::',header=None,names=rnames)
&&& ratings[:3]
&&&user_id& movie_id& rating& timestamp
0&&&&&&&1&&&&&1193&&&&&&5&
1&&&&&&&1&&&&&&661&&&&&&3&
2&&&&&&&1&&&&&&914&&&&&&3&
[3rows x4columns]
ratings 表中对我们有用的仅是 user_id、movie_id 和 rating 这三列,因此我们将这三列取出,放到一个以 user 为行,movie 为列,rating 为值的表 data 里面。(其实将 user 与 movie 的行列关系对调是更加科学的方法,但因为重跑一遍太麻烦了,这里就没改。)
&&& data=ratings.pivot(index='user_id',columns='movie_id',values='rating')
&&& data[:5]
movie_id&1&&2&&3&&4&&5&&6&
user_id&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
1&&&&&&&&&5NaN NaN NaN NaN NaN ...
2&&&&&&&NaN NaN NaN NaN NaN NaN ...
3&&&&&&&NaN NaN NaN NaN NaN NaN ...
4&&&&&&&NaN NaN NaN NaN NaN NaN ...
5&&&&&&&NaN NaN NaN NaN NaN&&2...
可以看到这个表相当得稀疏,填充率大约只有 5%,接下来要实现推荐的第一步是计算 user 之间的相关系数,DataFrame 对象有一个很亲切的.corr(method='pearson', min_periods=1)方法,可以对所有列互相计算相关系数。method 默认为皮尔逊相关系数,这个 ok,我们就用这个。问题仅在于那个 min_periods 参数,这个参数的作用是设定计算相关系数时的最小样本量,低于此值的一对列将不进行运算。这个值的取舍关系到相关系数计算的准确性,因此有必要先来确定一下这个参数。
相关系数是用于评价两个变量间线性关系的一个值,取值范围为 [-1, 1],-1代表负相关,0 代表不相关,1 代表正相关。其中 0~0.1 一般被认为是弱相关,0.1~0.4 为相关,0.4~1 为强相关。
min_periods 参数测定
测定这样一个参数的基本方法为统计在 min_periods 取不同值时,相关系数的标准差大小,越小越好;但同时又要考虑到,我们的样本空间十分稀疏,min_periods 定得太高会导致出来的结果集太小,所以只能选定一个折中的值。
这里我们测定评分系统标准差的方法为:在 data 中挑选一对重叠评分最多的用户,用他们之间的相关系数的标准差去对整体标准差做点估计。在此前提下对这一对用户在不同样本量下的相关系数进行统计,观察其标准差变化。
首先,要找出重叠评分最多的一对用户。我们新建一个以 user 为行列的方阵 foo,然后挨个填充不同用户间重叠评分的个数:
&&& foo=DataFrame(np.empty((len(data.index),len(data.index)),dtype=int),index=data.index,columns=data.index)
&&&foriinfoo.index:
&&&&&&&&forjinfoo.columns:
&&&&&&&&&&&&foo.ix[i,j]=data.ix[i][data.ix[j].notnull()].dropna().count()
这段代码特别费时间,因为最后一行语句要执行
= 1600万遍;(其中有一半是重复运算,因为 foo 这个方阵是对称的)还有一个原因是 Python 的 GIL,使得其只能使用一个 CPU 线程。我在它执行了一个小时后,忍不住去测试了一下总时间,发现要三个多小时后就果断 Ctrl + C 了,在算了一小半的 foo 中,我找到的最大值所对应的行列分别为 424 和 4169,这两位用户之间的重叠评分数为 998:
中的这段代码是什么意思??求教详细解释。。。。
&&& foo=DataFrame(np.empty((len(data.index),len(data.index)),dtype=int),index=data.index,columns=data.index)
&&&foriinfoo.index:
&&&&&&&&forjinfoo.columns:
&&&&&&&&&&&&foo.ix[i,j]=data.ix[i][data.ix[j].notnull()].dropna().count()
共有3个答案
<span class="a_vote_num" id="a_vote_num_
我觉得你仔细看看pandas 的教程就好了。程序大意是创建DataFrame,填数据。去掉空数据,数一数。详细的自己看教程琢磨吧。
<span class="a_vote_num" id="a_vote_num_
不明觉厉,友情支持一下
<span class="a_vote_num" id="a_vote_num_
&&foo.ix[i,j]=data.ix[i][data.ix[j].notnull()].dropna().count()
有什么技术问题吗?
类似的话题}

我要回帖

更多关于 movielens数据集下载 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信