协同过滤推荐

1.启发式推荐算法(Memory-based algorithms

启发式推荐算法易于实现,并且推荐结果的可解释性强。启发式推荐算法又可以分为两类:

基于用户的协同过滤(User-based collaborative filtering):主要考虑的是用户和用户之间的相似度,只要找出相似用户喜欢的物品,并预测目标用户对对应物品的评分,就可以找到评分最高的若干个物品推荐给用户。举个例子,李老师和闫老师拥有相似的电影喜好,当新电影上映后,李老师对其表示喜欢,那么就能将这部电影推荐给闫老师。

基于物品的协同过滤(Item-based collaborative filtering):主要考虑的是物品和物品之间的相似度,只有找到了目标用户对某些物品的评分,那么就可以对相似度高的类似物品进行预测,将评分最高的若干个相似物品推荐给用户。举个例子,如果用户A、B、C给书籍X,Y的评分都是5分,当用户D想要买Y书籍的时候,系统会为他推荐X书籍,因为基于用户A、B、C的评分,系统会认为喜欢Y书籍的人在很大程度上会喜欢X书籍。

2.基于模型的推荐算法(Model-based algorithms)

基于模型的推荐算法利用矩阵分解,有效的缓解了数据稀疏性的问题。矩阵分解是一种降低维度的方法,对特征进行提取,提高推荐准确度。基于模型的方法包括决策树、基于规则的模型、贝叶斯方法和潜在因素模型。

推荐框架:tensorflow,pytorch

3.推荐系统的目的:

1.帮助用户快速找到想要的商品,提高用户对网站的忠诚度;

2.提高网站交叉销售能力、成交转化率;

 

  • 流程

首先,找到User1 喜欢的商品;

找出与User1具有相同的商品兴趣爱好的人群;

找出该人群喜欢的其他商品;

将这些商品推送给User1。

  • 例子

两名用户都在某电商网站购买了A、B两种产品。当他们产生购买这个动作的时候,两名用户之间的相似度便被计算了出来。其中一名用户除了购买了产品A和B,还购买了C产品,此时推荐系统会根据两名用户之间的相似度会为另一名用户推荐项目C。

难点1:如何获取兴趣相似的用户

思路:通过购买过相同商品为介质,关联用户的关系

难点2:计算相似度

欧氏距离计算(计算两个点之间的直线距离)

 

import math
# 计算两点之间的距离
def eucliDist(A,B):
    return math.sqrt(sum([(a - b)**2 for (a,b) in zip(A,B)]))
X = [1,2,3,4]
Y = [0,1,2,3]
print(eucliDist(X,Y))

 

难点3:如何将算法落地,实现推荐功能

根据用户的购买/收藏关系推荐商品

data = {
    "1":{"诺基亚":4.8,'iphone':5.0,"联想":0.1},
    "2":{"诺基亚":3.0,"vivo":5.0,"htc":0.2},
    "3":{"锤子":0.1,"魅族":0.3,"一加":5.0}
}

#| x | = √(x[1]2 + x[2]2 + … + x[n]2)


from math import *

#pow返回 xy(x的y次方) 的值
#sqrt返回数字x的平方根

#计算用户之间的相似度
def Euclid(user1,user2):
    #根据key获取value
    user1_data = data[user1]
    user2_data = data[user2]
    distance = 0


    for key in user1_data.keys():
        if key in user2_data.keys():
            distance += pow(float(user1_data[key]) - float(user2_data[key]),2)


    #变成小数便于比较,值越小相似度越高
    return 1/(1+sqrt(distance))

print(Euclid("1","2"))


#构建最相似的用户top_people
def top_user(user):
    res = []
    for uid in data.keys():
        if not uid == user:
            simliar = Euclid(user,uid)
            res.append((uid,simliar))

    res.sort(key=lambda val:val[1])

    return res

print(top_user('1'))


#构建推荐商品
def recommend(user):
    top_people = top_user(user)[0][0]

    #获取当前相似度最高的用户的商品列表
    items = data[top_people]

    recommed_list = []


    for item in items.keys():
        #当这个商品不存在于目标用户的商品列表中,添加到推荐列表中
        if item not  in data[user].keys():
            recommed_list.append((item,items[item]))

    #根据推荐列表里的打分请款从小到大排序,然后反转
    recommed_list.sort(key=lambda val:val[1],reverse=True)

    #取出top10推荐
    return recommed_list[:10]

print(recommend("1"))

 

posted @ 2020-05-11 08:57  子非鱼且于  阅读(262)  评论(0编辑  收藏  举报
Live2D