python电影推荐系统_电影推荐系统---协同过滤算法(SVD,NMF)

论坛 期权论坛     
选择匿名的用户   2021-5-23 02:04   47   0
<div style="font-size:16px;">
<p>SVD</p>
<p>1 推荐系统概述</p>
<p>1.1 项目安排</p>
<p>1.2 三大协同过滤</p>
<p>1.3 项目开发工具</p>
<p>2 Movielens数据集简介</p>
<p>MovieLens是推荐系统常用的数据集;</p>
<p>MovieLens数据集中,用户对自己看过的电影进行评分,分值为1~5;</p>
<p>MovieLens包括两个不同大小的库,适用于不同规模的算法;</p>
<p>·小规模的库事943个独立用户对1682部电影做的10000次评分的数据;</p>
<p>·大规模的库事6040个独立用户对3900部电影做的100万次评分的数据;</p>
<p>3 数据探索</p>
<p>3.1 导入小规模的库数据</p>
<p>importnumpy asnp</p>
<p>importpandas aspd</p>
<p>importmatplotlib.pyplot asplt</p>
<p>data&#61;pd.read_csv(&#39;ml-100k/u.data&#39;,sep&#61;&#39;\t&#39;,names&#61;[&#39;user_id&#39;,&#39;item_id&#39;,&#39;rating&#39;,&#39;timestamp&#39;])</p>
<p>data.head()</p>
<p>3.2 数据探索及发现</p>
<p># 数据信息查看</p>
<p>data.info()</p>
<p># 数据描述</p>
<p>data.describe()</p>
<p>data.user_id.nunique()# nunique() --&gt; 返回不重复user_id的个数,统计用户的个数</p>
<p>data.item_id.nunique()# 统计被评价电影的个数</p>
<p>&gt;&gt; 943</p>
<p>&gt;&gt; 1682</p>
<p>data.duplicated(subset&#61;[&#39;user_id&#39;,&#39;item_id&#39;]).sum()# 查看user_id与item_id是否有重复的情况</p>
<p>&gt;&gt; 0</p>
<p>从导入的数据可以看出,user_id共有943个,item_id共有1682个,与数据对于的user_id及item_id的编号刚好是1~943和1~1682,可见数据已经清洗好的,不需要重新处理</p>
<p>然后将数据集拆分为训练集和测试集,分别进行处理</p>
<p>且user_id与item_id均不存在重复的情况,数据可以直接使用。</p>
<p>3.3 数据检查</p>
<p>3.3.1 查看每个物品对应用户的数量</p>
<p>a. 根据item_id分类聚合</p>
<p># 统计每个物品对应的用户数</p>
<p>item_id_usercnt &#61;train_data.groupby(&#39;item_id&#39;).count().user_id</p>
<p>item_id_usercnt[:5]</p>
<p>b. 直方图展示</p>
<p># 展示分类聚合结果</p>
<p>plt.hist(item_id_usercnt.values)</p>
<p>plt.show()</p>
<p>c. 查看十分位数</p>
<p># 分别查看每一物品对应的用户的十分位数(十分位数、二十分位数...一百分位数)</p>
<p>item_id_usercnt.quantile(q&#61;np.arange(0,1.1,0.1))</p>
<p>d. 物品对应用户数量数据查看发现</p>
<p>约有30%左右的物品对应的用户数少于10个,对这部分物品计算与其他物品的相似度不会太准确</p>
<p>3.3.2 查看每个用户对应物品的数量</p>
<p>a. 根据user_id分类聚合</p>
<p># 统计每个用户对应的物品数</p>
<p>user_id_itemcnt &#61;train_data.groupby(&#39;user_id&#39;).count().item_id</p>
<p>user_id_itemcnt[:5]</p>
<p>b. 直方图展示</p>
<p># 展示分类聚合结果</p>
<p>plt.hist(user_id_itemcnt.values)</p>
<p>plt.show()</p>
<p>c. 查看十分位数</p>
<p># 分别查看每一用户对应的物品的十分位数(十分位数、二十分位数...一百分位数)</p>
<p>user_id_itemcnt.quantile(q&#61;np.arange(0,1.1,0.1))</p>
<p>d. 物品对应用户数量数据查看发现</p>
<p>从每个用户对应的物品数量至少为20个的情况来看,基于用户相似度的准确度会比基于物品要好</p>
<p>3.4 构建用户-物品矩阵</p>
<p>3.4.1 获取矩阵行数m、列数n</p>
<p># 通过nunique()方法分别获得user_id、item_id的去重计数</p>
<p>m_users &#61;train_data.user_id.nunique()#</p>
<p>n_items &#61;train_data.item_id.nunique()</p>
<p>3.4.2 创建一个全是0的m*n的矩阵并向矩阵中填充对应数据</p>
<p>user_item_matrix &#61;np.zeros((m_users,n_items))# 创建一个全是0的m*n的矩阵</p>
<p>&#39;&#39;&#39;</p>
<p>itertuples() 将每一行转换为对应的元组,且数据一一对应</p>
<p>for line in data.head().itertuples():</p>
<p>print(line)</p>
<p>&gt;&gt; Pandas(Index&#61;0, user_id&#61;196, item_id&#61;242, rating&#61;3, timestamp&#61;881250949)</p>
<p>&gt;&gt; Pandas(Index&#61;1, user_id&#61;186, item_id&#61;302, rating&#61;3, timestamp&#61;891717742)</p>
<p>&gt;&gt; Pandas(Index&#61;2, user_id&#61;22, item_id&#61;377, rating&#61;1, timestamp&#61;878887116)</p>
<p>&gt;&gt; Pandas(Index&#61;3, user_id&#61;244, item_id&#61;51, rating&#61;2, timestamp&#61;880606923)</p>
<p>&gt;&gt; Pandas(Index&#61;4, user_id&#61;166, item_id&#61;346, rating&#61;1, timestamp&#61;886397596)</p>
<p>&#39;&#39;&#39;</p>
<p>forline indata.itertuples():</p>
<p>user_item_matrix[line[1]-1,line[2]-1]&#61;line[3]</p>
<p>&#39;&#39;&#39;</p>
<p>因为user_id 和 item_id都是从1开始编号的,而矩阵的索引是从零开始</p>
<p>data数据的第二列为user_id,第三列为item_id,第三列则为对应user对item的评分</p>
<p>&#39;&#39;&#39;</p>
<p>user_item_matrix #展示一下用户物品矩阵</p>
<p>3.4.3 查看用户-物品矩阵的稀疏性</p>
<p># 统计矩阵中非0值的个数与矩阵总元素个数的比值,保留3位小数</p>
<p>sparsity &#61;round(len(user_item_matrix.nonzero()[1])/float(m_users*n_items),3)</p>
<p>sparsity</p>
<p>&gt;&gt; 0.063</p>
<p>发现:用户-
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP