ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

协同过滤推荐

2020-05-11 09:03:12  阅读:178  来源: 互联网

标签:协同 key 推荐 用户 过滤 user 相似 data


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"))

 

标签:协同,key,推荐,用户,过滤,user,相似,data
来源: https://www.cnblogs.com/liudaya/p/12866974.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有