1、推荐系统的重要性

推荐系统,简单的说,就是挖掘用户的喜好,精准的推送给用户想要的东西!推荐系统可以说是无处不在了,电商的猜你喜欢,浏览器右侧的推送消息,包括搜索结果的排序,广义来说都算推荐系统的一部分。而且据说,推荐系统给亚马逊带来了35%的销售收入,给Netflix带来了高达75%的消费,并且Youtube主页上60%的浏览来自推荐服务。推荐系统的重要性可见一斑!

2、推荐系统的目的是:

帮助用户快速找到想要的商品,提高用户对网站的忠诚度;
提高网站交叉销售能力、成交转化率;

3、推荐系统的表现形式:

Browsing : 推荐系统根据查询返回高质量的推荐;
Similar Item : 根据相似物品推荐;
Email : 通过邮件推送感兴趣的商品 (亚马逊);
Top-N : 推送最可能吸引用户的商品;
Order-Search Results : 搜索结果按照兴趣排列;

4、推荐系统的技术:

1、People-to-People correlation 协同过滤
2、Item-to-Item 根据产品推荐相关产品
3、Based on 用户基础信息
4、关联规则挖掘

5、协同过滤算法解析:

协同过滤中的“同”代表要找出有共同经验的群体;为特定用户找到他真正感兴趣的内容的好方法是,首先找到与此用户有相似兴趣的其他用户,然后将他们感兴趣的内容推荐给此用户。现在我们的目标是为User1找到可推荐的电影。

6、梳理步骤:

首先,找到User1 喜欢的电影;找出与User1具有相同的电影兴趣爱好的人群;找出该人群喜欢的其他电影;将这些电影推送给User1。
(一)、首先想象我们要这样一个表格:

1.png

横坐标,假设有10w部电影,所以横坐标有10w个movie_id,数据来源自数据库
纵坐标,假设有100w个用户,所以纵坐标有100w个user_id,数据也来自数据库
交叉处,“1”代表用户喜爱这部电影,数据来自日志(例如浏览过,查找过,点赞过,)"空白"代表用户不喜爱这部电影,因为没有任何浏览日志

(二)、找到用户A(user_id_1)的兴趣爱好
如图:用户user_id_1喜欢电影{m1,m2,m3}

2.png

(三)、找到与用户A(user_id_1)具有相同电影兴趣爱好的用户群体集合Set<user_id>
如图可以看到,喜欢{m1, m2, m3}的用户,除了u1,还有{u2, u3}

3.png

(四)、 找到该群体喜欢的电影集合Set<movie_id>
如图具备相同喜好的用户{u2, u3},还喜好的电影集合是{..., m10000} (橘色的位置)

4.png

(五)、未来用户(use_id_1)来访问网站时,要推荐电影{..., m10000}给用户。

7、Python 实现步骤

第一步:计算两者之间的相似度
a、曼哈顿距离计算(计算迅速,节省时间)
b、欧氏距离计算(计算两个点之间的直线距离) 本文采用欧式距离

数据已备好,是一个有关movie 的数据集,数据包含138,000 个用户对27,000 个电影的评价,评价分为0-5,数据集详细介绍点击:https://grouplens.org/datasets/movielens/

点击下面链接获取数据,解压,读入Python

数据 ranking : ml-latest-small(1MB):
http://files.grouplens.org/datasets/movielens/ml-latest-small.zip​files.grouplens.org

数据movies: ml-latest(234.2MB):
http://files.grouplens.org/datasets/movielens/ml-latest.zip​files.grouplens.org

数据格式如下:

pip install pandas
import pandas as pd                         #导入pandas包
ratings = pd.read_csv('Desktop/ratings.csv')    
print (ratings.head(20)) 

5.png

movies = pd.read_csv('Desktop/movies.csv') 
print(movie.head(5))

6.png

合并两个数据集,通过匹配movie_id

data = pd.merge(movies,ratings,on = 'movieId')
print(data.head(5))
data[['userId','rating','movieId','title']].sort_values('userId').to_csv('Desktop/data.csv',index=False)
# 将合并后的数据集输出保存到桌面 以备后续分析
files = pd.read_csv('Desktop/data.csv')
print(file.head(5))

合并后数据集的数据格式

7.png

采用python字典来表示每位用户评论的电影和评分

# 逐行读取刚刚合并并保存的数据集
content = []
with open('Desktop/data.csv') as fp:  
    content = fp.readlines()
# 将用户、评分、和电影写入字典data
data = {}
for line in content[1:100]:
    line = line.strip().split(',')
    #如果字典中没有某位用户,则使用用户ID来创建这位用户
    if not line[0] in data.keys():
        data[line[0]] = {line[3]:line[1]}
    #否则直接添加以该用户ID为key字典中
    else:
        data[line[0]][line[3]] = line[1]

8.png

计算任何两位用户之间的相似度,由于每位用户评论的电影不完全一样,所以首先要找到两位用户共同评论过的电影
然后计算两者之间的欧式距离,最后算出两者之间的相似度。

from math import *
def Euclidean(user1,user2):
    #取出两位用户评论过的电影和评分
    user1_data=data[user1]
    user2_data=data[user2]
    distance = 0
    #找到两位用户都评论过的电影,并计算欧式距离
    for key in user1_data.keys():
        if key in user2_data.keys():
            #注意,distance越大表示两者越相似
            distance += pow(float(user1_data[key])-float(user2_data[key]),2)
    return 1/(1+sqrt(distance))#这里返回值越小,相似度越大
#计算某个用户与其他用户的相似度
def top10_simliar(userID):
    res = []
    for userid in data.keys():
        #排除与自己计算相似度
        if not userid == userID:
            simliar = Euclidean(userID,userid)
            res.append((userid,simliar))
    res.sort(key=lambda val:val[1])
    return res[:4]
RES = top10_simliar('1')
print(RES)

# 用户之间相似度结果:0表示两位的影评几乎一样,1表示没有共同的影评

根据相似度来推荐用户:

def recommend(user):
    #相似度最高的用户
    top_sim_user = top10_simliar(user)[0][0]
    #相似度最高的用户的观影记录
    items = data[top_sim_user]
    recommendations = []
    #筛选出该用户未观看的电影并添加到列表中
    for item in items.keys():
        if item not in data[user].keys():
            recommendations.append((item,items[item]))
    recommendations.sort(key=lambda val:val[1],reverse=True)#按照评分排序
    #返回评分最高的10部电影
    return recommendations[:10]
Recommendations = recommend('1')
print(Recommendations)

9.png

至此,简版推荐系统结束。但是我们需要不断完善这个推荐系统,例如,我们使用两个用户对相同电影的评分来计算相似度其实不够准确,因为两个用户的评价标准不同,有的人对电影评价整体偏高(认为最差的也能给到3.5分),有的人对电影评价偏低(认为最好的电影也只给3.5分),所以在计算的过程中,应该分别减去两个用户对电影的整体评分,以修正相似度。

参考:

https://zhuanlan.zhihu.com/p/68373487