机器学习推荐算法之协同过滤(基于用户)【案例+代码】

简介: 机器学习推荐算法之协同过滤(基于用户)【案例+代码】

兴趣度计算

前面学习了关联规则的相关知识,接下来我们来学习协同过滤。

什么是协同过滤呢?我们以一个简单的问题来了解一下:如果你现在想看个电影,但你不知道具体看哪部,你会怎么做?


大部分的人会问问周围的朋友,看看最近有什么好看的电影推荐。朋友有很多,每一个都去问吗?


不是,我们一般更倾向于从口味比较类似的朋友那里得到推荐。


协同过滤是利用集体智慧的一种方法,但又稍有不同,它保留了个体的特征。简单来说是利用兴趣相投的、拥有共同经验的群体的喜好来向用户进行推荐他感兴趣的东西。


从这里我们可以发现协同过滤的核心问题就是:如何找到用户的兴趣?如何找到兴趣相投的其他用户?


协同过滤算法是最早也是最著名的推荐方法,主要有两类:基于用户的协同过滤算法(user-based collaboratIve filtering),和基于物品的协同过滤算法(item-based collaborative filtering)。简单的说就是:人以类聚,物以群分。


总结来说,协同过滤推荐分为三步:


第一步:发现用户的偏好


第二步:找到相似的用户或物品


第三步:计算推荐


电影推荐案例

接下来我们就以一个案例来了解一下基于用户的系统过滤:


假设有A-G,7个人分别看了如图所示的电影并且给电影有如下评分(5分最高,没看过的不评分),我们目的是要向A用户推荐一部电影


image.png


首先我们来理一下思路:我们要基于A看过的电影,向A推荐他未看过的电影


image.png


协同过滤算法

协同过滤的整体思路只有两步,非常简单:寻找相似用户邻居,用相似邻居偏好来推荐物品

寻找相似用户,有很多种方法可以用来判断相似性,,其实是对于电影品味的相似,也就是说需要将A与其他几位用户做比较,判断是不是品味相似。


用我们刚刚讲过的协同过滤的三步来分析这个问题,首先我们根据用户A的评分发现,他偏爱像老炮儿这样性质的电影;然后我们要根据他的爱好找到类似用户?如何寻找类似用户呢?如何找到跟用户A一样偏爱老炮儿这种电影的用户呢?从数学的角度出发,我们是不是可以理解为计算两个用户之间的相似度,越相似,证明他们口味越接近。


那么问题来了,相似度计算方式很多,我们采用什么样的相似度计算方法呢?


通过相似度的计算算法找出相似用户、物品


常见的相似度计算算法有:欧几里德距离,余弦相似度,皮尔逊相关系数,杰卡德相似系数等


image.png



image.png

image.png


image.png


很多同学会说采用效果最好的相似度计算方法,那怎么知道那种相似度计算方法最好呢?这需要大家在学习和使用过程中去分辨。


欧式距离案例

这里我们使用“欧式距离”来作为相似度计算方法。把每一部电影看成N维空间中的一个维度,这样每个用户对于电影的评分相当于维度的坐标,那么每一个用户的所有评分,相当于就把用户固定在这个N维空间的一个点上,然后利用欧几里德距离计算N维空间两点的距离。距离越短说明品味越接近。


在本例中用户A只看过两部电影(《老炮儿》和《唐人街探案》),那我们只能通过这两部电影来判断用户A的品味了,也就是说我们要计算A和其他几位用户的欧式距离


变换方法为:相似性 = 1/(1+欧几里德距离),这个相似性会落在【0,1】区间内,1表示完全品味一样,0表示完全品味不一样。这时我们就可以找到哪些人的品味和A最为接近了,计算后如下:


相似性:B-0.27,C-0.28,D-0.27,E-0.50,F-0.25,G-0.47


可见,E的口味与A最为接近,其次是G


image.png


前面我们说过欧式距离越近,越相似。对相似度的衡量我们习惯用[0,1]表示,1表示完全一样,0表示完全不一样。


当相似度为1时,我们可以理解为此时欧式距离为0;当相似度为0时,我们可以理解为此时欧式距离为无穷大


因此,欧式距离要与相似性要做一个转换,变换方法为:相似性 = 1/(1+欧几里德距离)


通过计算我们的出用户A与其他用户的相似度分别为:


B:0.27,C:0.28,D:0.27,E:0.50,F:0.25,G:0.47


从这些数据中我们可以看出E用户与A用户最为相似,相似度为50%,其次是G用户,相似度为47%


计算推荐

接下来我们就要进行协同过滤推荐的第三步:计算推荐。


如何计算推荐呢?我们把用户的相似度看作一个电影评分的一个加权相似,对A未看过的电影计算其他电影的加权评分,从而判别用户A会感兴趣的电影。


image.png


我们将用户A与其他用户的相似度以及其他用户对A未看过的电影分别看作两个矩阵,计算其他电影的加权评分就是计算两个矩阵对应位置的数的乘积。


image.png


除了加权,还要做少量的计算:总分是每个电影加权评分的总和,总相似度是对这个电影有评分的人的相似性综合,推荐度是总分/总相似性,目的是排除看电影人数对于总分的影响


最后一行就是电影的推荐度(因为是根据品味相同的人打分加权算出的分,可以近似认为如果A看了这部电影,预期的评分会是多少)


有了电影的加权得分,通常做法还要设定一个阈值,如果超过了阈值再给用户推荐,要不怎么推荐都是烂片,如果这里我们设置阈值为4,那么最终推荐给A的电影就是《寻龙诀》。


如果我们把一开始的评分表的行列调换,其他过程都不变,那么就变成了把电影推荐给合适的受众。因此,要根据不同场景选择不同的思考维度。


基于用户协同过滤的缺点



image.png

基于用户的协同过滤算法,一般应用于用户较少,物品比较多,时效性比较强的场合,比如新闻推荐等


代码实操

完整代码下载:


机器学习-推荐系统(基于用户).ipynb-机器学习文档类资源-CSDN下载


主要代码展示

from collections import defaultdict
critics = defaultdict(dict)
for i in range(df.shape[0]):
    critics[str(df.iloc[i,0])][df.iloc[i,2]]=df.iloc[i,3]
name=input("请输入你的学号:")
n=int(input("请输入你要推荐的数目:"))
result=getRecommendations(critics,name)
X1=[]
X2=[]
X3=[]
x1=0
x2=0
x3=0
for i in result:
#     print(df.iloc[df[df['产品名称']==i[1]].index[1],1])
    if df.iloc[df[df['产品名称']==i[1]].index[0],1]=='酒店' and x1<n:
        X1.append(i)
        x1+=1
    elif df.iloc[df[df['产品名称']==i[1]].index[0],1]=='餐饮' and x2<n:
        X2.append(i)
        x2+=1
    elif df.iloc[df[df['产品名称']==i[1]].index[0],1]=='景区' and x3<n:
        X3.append(i)
        x3+=1
    elif x1==n and x2==n and x3==n:
        break
print("酒店推荐你选择这几家:")
print(X1[:n])
print()
print("餐饮推荐你选择这几家:")
print(X2[:n])
print()
print("景区推荐你选择这几家:")
print(X3[:n])



image.png

image.png

相关文章
|
8天前
|
机器学习/深度学习 人工智能 算法
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
手写数字识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Flask框架,开发网页端操作平台,实现用户上传一张图片识别其名称。
28 0
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
|
10天前
|
机器学习/深度学习 数据采集 人工智能
探索机器学习:从理论到Python代码实践
【10月更文挑战第36天】本文将深入浅出地介绍机器学习的基本概念、主要算法及其在Python中的实现。我们将通过实际案例,展示如何使用scikit-learn库进行数据预处理、模型选择和参数调优。无论你是初学者还是有一定基础的开发者,都能从中获得启发和实践指导。
24 2
|
13天前
|
机器学习/深度学习 数据采集 人工智能
揭秘AI:机器学习的魔法与代码
【10月更文挑战第33天】本文将带你走进AI的世界,了解机器学习的原理和应用。我们将通过Python代码示例,展示如何实现一个简单的线性回归模型。无论你是AI新手还是有经验的开发者,这篇文章都会给你带来新的启示。让我们一起探索AI的奥秘吧!
|
1月前
|
数据采集 移动开发 数据可视化
模型预测笔记(一):数据清洗分析及可视化、模型搭建、模型训练和预测代码一体化和对应结果展示(可作为baseline)
这篇文章介绍了数据清洗、分析、可视化、模型搭建、训练和预测的全过程,包括缺失值处理、异常值处理、特征选择、数据归一化等关键步骤,并展示了模型融合技术。
55 1
模型预测笔记(一):数据清洗分析及可视化、模型搭建、模型训练和预测代码一体化和对应结果展示(可作为baseline)
|
29天前
|
机器学习/深度学习 算法 Java
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
|
1月前
|
机器学习/深度学习 人工智能 算法
揭开深度学习与传统机器学习的神秘面纱:从理论差异到实战代码详解两者间的选择与应用策略全面解析
【10月更文挑战第10天】本文探讨了深度学习与传统机器学习的区别,通过图像识别和语音处理等领域的应用案例,展示了深度学习在自动特征学习和处理大规模数据方面的优势。文中还提供了一个Python代码示例,使用TensorFlow构建多层感知器(MLP)并与Scikit-learn中的逻辑回归模型进行对比,进一步说明了两者的不同特点。
64 2
|
1月前
|
机器学习/深度学习 人工智能 算法
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
玉米病害识别系统,本系统使用Python作为主要开发语言,通过收集了8种常见的玉米叶部病害图片数据集('矮花叶病', '健康', '灰斑病一般', '灰斑病严重', '锈病一般', '锈病严重', '叶斑病一般', '叶斑病严重'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。再使用Django搭建Web网页操作平台,实现用户上传一张玉米病害图片识别其名称。
56 0
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
|
17天前
|
机器学习/深度学习 人工智能 算法
探索机器学习中的决策树算法
【10月更文挑战第29天】本文将深入浅出地介绍决策树算法,一种在机器学习中广泛使用的分类和回归方法。我们将从基础概念出发,逐步深入到算法的实际应用,最后通过一个代码示例来直观展示如何利用决策树解决实际问题。无论你是机器学习的初学者还是希望深化理解的开发者,这篇文章都将为你提供有价值的见解和指导。
|
1月前
|
机器学习/深度学习 算法 数据处理
EM算法对人脸数据降维(机器学习作业06)
本文介绍了使用EM算法对人脸数据进行降维的机器学习作业。首先通过加载ORL人脸数据库,然后分别应用SVD_PCA、MLE_PCA及EM_PCA三种方法实现数据降维,并输出降维后的数据形状。此作业展示了不同PCA变种在人脸数据处理中的应用效果。
34 0
|
1月前
|
JSON 测试技术 API
阿里云PAI-Stable Diffusion开源代码浅析之(二)我的png info怎么有乱码
阿里云PAI-Stable Diffusion开源代码浅析之(二)我的png info怎么有乱码