数据分析学习笔记8

推荐系统

1、协同过滤–找出电影的相似度
2、基于项目的协同过滤应用–向人们推荐电影
# 读入数据
import pandas as pd

r_cols=['user_id','movie_id','rating']
ratings=pd.read_csv('./u.data',sep='\\t',names=r_cols,usecols=range(3),encoding="ISO-8859-1")  # 我们只使用文件的前三列 
ratings.head()

m_cols=['movie_id','title']
movies=pd.read_csv('./u.item',sep='|',names=m_cols,usecols=range(2),encoding="ISO-8859-1")  # 只用u.item文件的前两列
movies.head()

# 将上面的两个数据框合并
ratings=pd.merge(movies,ratings)
ratings.head()


# 得到根据看了每部影片的用户所得到的两部影片之间的关系
movieRatings=ratings.pivot_table(index=['user_id'],columns=['title'],values='rating')
movieRatings.head()
# 得到的结果既适用于基于用户的协同过滤,也适用于基于项目的协同过滤


# 接下来,我们进行基于项目的协同过滤
starWarsRatings=movieRatings['Star Wars (1977)']
starWarsRatings.head()
# 我们发现很多人都看过Star Wars 且评分也很高

similarMovies=movieRatings.corrwith(starWarsRatings)  # 计算出星球大战与其他电影之间的相关系数
similarMovies.dropna()  # 删除缺失值
df=pd.DataFrame(similarMovies)   # 新建一个数据框
df.head()

# 对结果进行一下排序,看看那些相似度比较高
similarMovies.sort_values(ascending=False).head(10)
# 结果发现一些冷门电影也同样被推荐了,这显然不符合,所以需要找到那些只有少数人评分的电影,将其丢弃掉

import numpy as np
movieStats=ratings.groupby('title').agg({'rating':[np.size,np.mean]})
movieStats.head()


# 然后我们将评分人数少于100的丢弃掉
popularMovies=movieStats['rating']['size']>=100
movieStats[popularMovies].sort_values([('rating','mean')],ascending=False)[:15]

df.sort_values(['similarity'],ascending=False)[:15]
#  最后我们得到一个比较满意的效果



#  接下来我们来建立一个推荐电影的完整系统
ratings.head()

userRatings=ratings.pivot_table(index=['user_id'],columns=['title'],values='rating')
userRatings.head()


# 计算出整个矩阵中任意两列之间的相关系数
corrMatrix=userRatings.corr()
corrMatrix.head()

# 继续将少于100人评分的给过滤掉
corrMtrix=userRatings.corr(method='pearson',min_periods=100)
corrMatrix.head()


myRatings=userRatings.loc[0].dropna()
myRatings

simCandidates = pd.Series()
for i in range(0, len(myRatings.index)):
    print ("Adding sims for " + myRatings.index[i] + "...")
    # 找出我评价过的电影
    sims = corrMatrix[myRatings.index[i]].dropna()
    # 通过我对电影的评分放大相似度
    sims = sims.map(lambda x: x * myRatings[i])
    # 将分数添加到相似度候选列表中
    simCandidates = simCandidates.append(sims)
    
# 看一下目前的结果
print ("sorting...")
simCandidates.sort_values(inplace = True, ascending = False)
print (simCandidates.head(10))


simCandidates = simCandidates.groupby(simCandidates.index).sum()
simCandidates.sort_values(inplace = True, ascending = False)
simCandidates.head(10)


filteredSims = simCandidates.drop(myRatings.index)
filteredSims.head(10)
#  好了,推荐系统完成
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灯下夜无眠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值