基于协同过滤的推荐算法及代码实现
基于项目协同过滤算法java代码

基于项目协同过滤算法java代码基于项目协同过滤算法Java代码引言:在当今互联网时代,个性化推荐系统已经成为了各大电商平台和社交媒体的重要组成部分。
协同过滤算法是个性化推荐系统中常用的一种算法,其主要思想是通过分析用户的历史行为,找到与当前用户最相似的其他用户或物品,从而给用户推荐相关的信息或商品。
本文将介绍基于Java代码实现的项目协同过滤算法。
一、协同过滤算法简介协同过滤算法是一种基于用户或物品之间相似度的推荐算法,其核心思想是“物以类聚、人以群分”。
协同过滤算法分为基于用户的协同过滤和基于物品的协同过滤两种方式。
1. 基于用户的协同过滤算法基于用户的协同过滤算法主要通过计算用户之间的相似度来进行推荐。
首先,需要构建用户-物品评分矩阵,矩阵中的每个元素表示用户对物品的评分。
然后,通过计算用户之间的相似度,找到与当前用户最相似的若干用户。
最后,根据这些相似用户的评分情况,推荐给当前用户未评分的物品。
2. 基于物品的协同过滤算法基于物品的协同过滤算法主要通过计算物品之间的相似度来进行推荐。
同样地,首先需要构建用户-物品评分矩阵。
然后,通过计算物品之间的相似度,找到与当前物品最相似的若干物品。
最后,根据用户的历史评分情况,推荐与当前物品最相似的其他物品。
二、项目协同过滤算法Java代码实现下面是一个基于用户的协同过滤算法的Java代码示例:```javaimport java.util.HashMap;import java.util.Map;public class UserBasedCF {// 用户-物品评分矩阵private static Map<String, Map<String, Integer>> userItemMatrix = new HashMap<>();// 用户之间的相似度矩阵private static Map<String, Map<String, Double>> userSimilarityMatrix = new HashMap<>();// 获取用户之间的相似度private static double getUserSimilarity(String user1, String user2) {// 根据用户-物品评分矩阵计算用户之间的相似度// ...return similarity;}// 为用户进行推荐public static Map<String, Double> recommend(String user) {Map<String, Double> recommendations = new HashMap<>();Map<String, Integer> items = userItemMatrix.get(user);for (String item : items.keySet()) {for (String otherUser : userItemMatrix.keySet()) {if (!otherUser.equals(user)) {double similarity = getUserSimilarity(user, otherUser);int rating = userItemMatrix.get(otherUser).getOrDefault(item, 0);recommendations.put(item, recommendations.getOrDefault(item, 0.0) + similarity * rating);}}}return recommendations;}public static void main(String[] args) {// 构建用户-物品评分矩阵// ...// 为指定用户进行推荐String user = "user1";Map<String, Double> recommendations = recommend(user);// 输出推荐结果for (Map.Entry<String, Double> entry : recommendations.entrySet()) {System.out.println("Item: " + entry.getKey() + ", Score: " + entry.getValue());}}}```三、实现原理解析以上代码实现了基于用户的协同过滤算法。
基于协同过滤的推荐算法及代码实现

基于协同过滤的推荐算法与代码实现什么是协同过滤?协同过滤是利用集体智慧的一个典型方法。
要理解什么是协同过滤(Collaborative Filtering, 简称CF),首先想一个简单的问题,如果你现在想看个电影,但你不知道具体看哪部,你会怎么做?大部分的人会问问周围的朋友,看看最近有什么好看的电影推荐,而我们一般更倾向于从口味比较类似的朋友那里得到推荐。
这就是协同过滤的核心思想。
协同过滤一般是在海量的用户中发掘出一小部分和你品位比较类似的,在协同过滤中,这些用户成为邻居,然后根据他们喜欢的其他东西组织成一个排序的目录作为推荐给你。
当然其中有一个核心的问题:如何确定一个用户是不是和你有相似的品位?如何将邻居们的喜好组织成一个排序的目录?简单来说:1. 和你兴趣合得来的朋友喜欢的,你也很有可能喜欢;2. 喜欢一件东西A,而另一件东西B 与这件十分相似,就很有可能喜欢B;3. 大家都比较满意的,人人都追着抢的,我也就很有可能喜欢。
三者均反映在协同过滤的评级(rating)或者群体过滤(social filtering)这种行为特性上。
深入协同过滤的核心首先,要实现协同过滤,需要一下几个步骤:1. 收集用户偏好2. 找到相似的用户或物品3. 计算推荐(1)收集用户偏好要从用户的行为和偏好中发现规律,并基于此给予推荐,如何收集用户的偏好信息成为系统推荐效果最基础的决定因素。
用户有很多方式向系统提供自己的偏好信息,而且不同的应用也可能大不相同,下面举例进行介绍:以上列举的用户行为都是比较通用的,推荐引擎设计人员可以根据自己应用的特点添加特殊的用户行为,并用他们表示用户对物品的喜好。
在一般应用中,我们提取的用户行为一般都多于一种,关于如何组合这些不同的用户行为,基本上有以下两种方式:将不同的行为分组:一般可以分为“查看”和“购买”等等,然后基于不同的行为,计算不同的用户/物品相似度。
类似于当当网或者Amazon 给出的“购买了该图书的人还购买了...”,“查看了图书的人还查看了...”根据不同行为反映用户喜好的程度将它们进行加权,得到用户对于物品的总体喜好。
协同过滤算法python代码

协同过滤算法python代码协同过滤算法是一种基于用户行为数据的推荐算法,可以帮助用户发现自己可能感兴趣的物品或者服务。
下面是一个简单的协同过滤算法的Python代码示例:```python# 导入相关的库import numpy as np# 定义基于用户的协同过滤算法def user_cf(data, user, k=3):# 计算用户之间的相似度矩阵sims = {}for u in data:if u != user:sims[u] = np.dot(data[user], data[u]) /(np.linalg.norm(data[user]) * np.linalg.norm(data[u]))# 对相似度矩阵进行排序,取出前k个相似的用户sorted_sims = sorted(sims.items(), key=lambda x: x[1], reverse=True)[:k]top_users = [u[0] for u in sorted_sims]# 对物品进行推荐items = {}for u in top_users:for item in data[u]:if item not in data[user]:if item not in items:items[item] = 0items[item] += sims[u] * data[u][item]# 对推荐结果进行排序sorted_items = sorted(items.items(), key=lambda x: x[1], reverse=True)return sorted_items# 测试代码data = {'user1': {'item1': 1, 'item2': 1, 'item3': 1}, 'user2': {'item1': 1, 'item3': 1},'user3': {'item2': 1, 'item4': 1},'user4': {'item3': 1, 'item4': 1}}print(user_cf(data, 'user1'))```上面的代码定义了一个基于用户的协同过滤算法,并且对一个简单的数据进行了测试。
基于协同过滤算法的音乐推荐系统设计与实现

基于协同过滤算法的音乐推荐系统设计与实现一、绪论随着互联网技术的发展,网络音乐逐渐成为人们日常生活中不可或缺的一部分。
然而,用户在面对海量音乐资源时,往往难以找到自己感兴趣的音乐,因此音乐推荐系统成为了一个备受关注的研究方向。
本文将介绍一种基于协同过滤算法的音乐推荐系统的设计与实现。
二、协同过滤算法协同过滤算法是一种经典的推荐算法,它基于用户以往的历史行为来预测用户未来的兴趣。
对于音乐推荐系统,协同过滤算法的核心思想是将用户与音乐看作一个二维矩阵,其中每个元素表示用户对音乐的评分。
如果两个用户对同一首歌曲的评分相似,那么可以认为他们具有相似的兴趣,因此可以将一位用户对于一首他尚未听过的歌曲的喜欢度预测为与他兴趣相似的其他用户对于该歌曲的评分的加权平均值。
协同过滤算法又可分为基于用户的协同过滤算法和基于物品的协同过滤算法。
基于用户的协同过滤算法认为具有相似兴趣的用户在过去一定会对同一首歌曲有相似的评价,因此可以通过对多个相似用户对该歌曲的评分进行加权平均,来预测该用户对该歌曲的喜欢度。
而基于物品的协同过滤算法则认为对于一首歌曲喜欢的用户在未来对其他相似的歌曲也有可能会有相似的喜欢度,因此可以通过对相似歌曲的评分进行加权平均,来预测用户对该歌曲的喜欢度。
两种方法各有优缺点,实践中通常采用两种方法的加权平均值进行综合推荐。
三、音乐推荐系统设计本文设计的音乐推荐系统主要分为数据预处理、协同过滤算法实现、推荐结果可视化展示三部分。
3.1 数据预处理本文所使用的数据来源为公开的网易云音乐数据集,其中包含了多个维度的数据信息,包括歌曲名、歌手、专辑、标签等信息。
在数据预处理过程中,首先需要对数据集进行去重、过滤、清洗等操作,以确保数据的完整性和可用性。
同时,需要对数据进行特征提取操作,将复杂的数据信息转换为协同过滤算法所需的二维矩阵形式,以便于算法的实现和优化。
3.2 协同过滤算法实现本文采用了基于物品的协同过滤算法,具体实现流程如下:(1)计算每首歌曲之间的相似度。
基于项目的协同过滤推荐算法

基于项目的协同过滤推荐算法
协同过滤推荐算法是一种常见的推荐算法,它通过分析用户行为数据,找到用户之间的相似性,从而为用户推荐感兴趣的项目。
基于项目的协同
过滤推荐算法是协同过滤算法的一种变体,它主要关注项目之间的相似性,从而为用户推荐与其感兴趣的项目类似的项目。
本文将介绍基于项目的协
同过滤推荐算法的原理和实现方式。
1.计算项目之间的相似度:
该步骤的目标是根据项目之间的相似度度量方法,计算出各个项目之
间的相似度。
常见的相似度度量方法有:
-余弦相似度:基于项目的用户行为向量,计算向量之间的余弦相似度。
余弦相似度越大,项目之间的相似度越高。
-欧氏距离:通过计算项目的用户行为特征向量之间的欧氏距离,来
度量项目之间的相似度。
欧氏距离越小,项目之间的相似度越高。
-皮尔逊相关系数:通过计算项目的用户行为特征向量之间的皮尔逊
相关系数,来度量项目之间的相似度。
皮尔逊相关系数越接近1,项目之
间的相似度越高。
2.为用户推荐项目:
该步骤的目标是根据用户对项目的评分或点击行为,为用户推荐与其
感兴趣的项目相似的项目。
推荐的方法有:。
基于协同过滤的推荐算法及代码实现

基于协同过滤的推荐算法及代码实现基于协同过滤的推荐算法是一种常用的个性化推荐算法,其基本思想是根据用户的历史行为数据推断用户可能喜欢的物品,然后将这些物品推荐给用户。
这种算法不依赖于物品的属性信息,而是通过分析用户之间的相似性来进行推荐。
协同过滤算法主要有两类:基于用户的协同过滤和基于物品的协同过滤。
基于用户的协同过滤算法是通过计算用户之间的相似度,找到和目标用户相似度最高的一组用户,然后将这组用户喜欢的物品推荐给目标用户。
基于物品的协同过滤算法是通过计算物品之间的相似度,找到用户喜欢的物品相似度最高的一组物品,然后将这组物品推荐给用户。
下面是一个基于用户的协同过滤推荐算法的代码实现的示例:```pythonimport numpy as np#创建用户-物品矩阵data = np.array([[4, 0, 2, 0, 1],[5,1,0,0,0],[1,0,3,4,0],[0,6,0,3,2]])#计算用户之间的相似度def user_similarity(data):similarity = np.dot(data, data.T)norm = np.linalg.norm(data, axis=1)norm_similarity = np.outer(norm, norm)similarity /= norm_similarityreturn similarity#根据用户相似度和历史评分预测用户对未评分物品的评分def predict(user_similarity, data):return np.dot(user_similarity, data) /np.sum(user_similarity, axis=1)#用户之间的相似度矩阵similarity_matrix = user_similarity(data)#预测用户对未评分物品的评分prediction = predict(similarity_matrix, data)#输出预测评分矩阵print(prediction)```以上代码实现了一个基于用户的协同过滤推荐算法。
推荐系统中的协同过滤算法原理及实现步骤

推荐系统中的协同过滤算法原理及实现步骤协同过滤算法是一种常用于推荐系统的算法,通过利用用户行为数据和物品属性信息来预测用户对物品的偏好,并推荐给他们可能感兴趣的物品。
本文将介绍协同过滤算法的原理和实现步骤。
一、协同过滤算法原理协同过滤算法基于相似性原理来进行推荐,可以分为两种类型:基于用户的协同过滤和基于物品的协同过滤。
1. 基于用户的协同过滤基于用户的协同过滤算法计算用户之间的相似性,然后根据相似用户的行为来推荐物品。
其核心原理是:如果两个用户在过去的行为中有相似的偏好和兴趣,那么他们在未来的行为中可能也会有相似的偏好和兴趣。
2. 基于物品的协同过滤基于物品的协同过滤算法计算物品之间的相似性,然后根据用户对相似物品的偏好来推荐物品。
其核心原理是:如果一个用户对某个物品有兴趣,那么他可能对与该物品相似的其他物品也有兴趣。
二、协同过滤算法实现步骤协同过滤算法的实现步骤可以分为以下几个步骤:1. 数据预处理在实施协同过滤算法之前,需要对用户行为数据进行预处理。
预处理的目的是清洗数据、处理缺失值和离群值,以及将数据转换为适合算法处理的格式。
2. 计算用户相似度或物品相似度对于基于用户的协同过滤,需要计算用户之间的相似性;对于基于物品的协同过滤,需要计算物品之间的相似性。
相似性可以使用余弦相似度、皮尔逊相关系数等方法进行计算。
3. 预测评分通过用户相似度或物品相似度,预测用户对未评分物品的评分。
对于基于用户的协同过滤,可以根据相似用户的评分加权平均来进行预测;对于基于物品的协同过滤,可以根据用户对相似物品的评分加权平均来进行预测。
4. 推荐物品根据预测的评分,为用户推荐可能感兴趣的物品。
可以根据预测评分的降序排序,选取Top N的物品作为推荐结果。
5. 评估算法效果为了评估协同过滤算法的效果,可以使用常见的评测指标,如准确率、召回率、覆盖率等。
三、总结协同过滤算法是一种常用的推荐算法,可以根据用户行为数据和物品属性信息进行预测和推荐。
协同过滤算法matlab代码

协同过滤算法是一种常用的推荐系统算法,它基于用户的偏好和行为数据来进行个性化推荐。
而MATLAB作为一种广泛应用的数学软件,能够很好地支持协同过滤算法的实现。
本文将介绍协同过滤算法的原理和MATLAB代码实现,并结合实际案例进行说明。
一、协同过滤算法原理1. 相似度计算协同过滤算法首先需要计算用户或物品之间的相似度。
对于用户来说,可以通过计算其之间的余弦相似度或皮尔逊相关系数来衡量它们之间的相似程度。
对于物品来说,可以通过计算它们之间的相关系数或者基于内容的相似度来进行相似度计算。
2. 预测评分在计算出相似度后,就可以根据其他用户对物品的评分数据来预测目标用户对该物品的评分。
对于用户来说,可以利用与其相似的其他用户对该物品的评分加权平均来进行预测;对于物品来说,则可以利用该物品与目标物品相似的其他物品的评分加权平均来进行预测。
3. 推荐结果根据预测出的评分,可以将评分最高的物品推荐给用户,或者将评分最高的用户推荐给物品。
二、协同过滤算法MATLAB代码实现1. 数据准备需要准备好用户对物品的评分数据,通常是一个用户-物品-评分的三元组。
在MATLAB中可以使用矩阵或稀疏矩阵来表示这种三元组数据。
2. 相似度计算利用MATLAB内置的函数或者自定义函数来计算用户或物品之间的相似度。
对于内置函数,可以使用pdist2来计算余弦相似度或者corrcoef来计算皮尔逊相关系数;对于自定义函数,则需要根据相似度的定义来进行计算。
3. 预测评分根据相似度计算出的结果,利用加权平均的方式来预测用户对物品的评分。
在MATLAB中可以使用矩阵运算来实现这一步骤。
4. 推荐结果根据预测出的评分,可以得到推荐结果。
在MATLAB中可以使用排序函数来获取评分最高的物品或用户。
三、实例说明假设有一个电影推荐系统,其中包含用户对电影的评分数据。
将评分数据表示为一个用户-电影-评分的稀疏矩阵,然后利用MATLAB来实现协同过滤算法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于协同过滤的推荐算法与代码实现什么是协同过滤?协同过滤是利用集体智慧的一个典型方法。
要理解什么是协同过滤(Collaborative Filtering, 简称CF),首先想一个简单的问题,如果你现在想看个电影,但你不知道具体看哪部,你会怎么做?大部分的人会问问周围的朋友,看看最近有什么好看的电影推荐,而我们一般更倾向于从口味比较类似的朋友那里得到推荐。
这就是协同过滤的核心思想。
协同过滤一般是在海量的用户中发掘出一小部分和你品位比较类似的,在协同过滤中,这些用户成为邻居,然后根据他们喜欢的其他东西组织成一个排序的目录作为推荐给你。
当然其中有一个核心的问题:如何确定一个用户是不是和你有相似的品位?如何将邻居们的喜好组织成一个排序的目录?简单来说:1. 和你兴趣合得来的朋友喜欢的,你也很有可能喜欢;2. 喜欢一件东西A,而另一件东西B 与这件十分相似,就很有可能喜欢B;3. 大家都比较满意的,人人都追着抢的,我也就很有可能喜欢。
三者均反映在协同过滤的评级(rating)或者群体过滤(social filtering)这种行为特性上。
深入协同过滤的核心首先,要实现协同过滤,需要一下几个步骤:1. 收集用户偏好2. 找到相似的用户或物品3. 计算推荐(1)收集用户偏好要从用户的行为和偏好中发现规律,并基于此给予推荐,如何收集用户的偏好信息成为系统推荐效果最基础的决定因素。
用户有很多方式向系统提供自己的偏好信息,而且不同的应用也可能大不相同,下面举例进行介绍:以上列举的用户行为都是比较通用的,推荐引擎设计人员可以根据自己应用的特点添加特殊的用户行为,并用他们表示用户对物品的喜好。
在一般应用中,我们提取的用户行为一般都多于一种,关于如何组合这些不同的用户行为,基本上有以下两种方式:将不同的行为分组:一般可以分为“查看”和“购买”等等,然后基于不同的行为,计算不同的用户/物品相似度。
类似于当当网或者Amazon 给出的“购买了该图书的人还购买了...”,“查看了图书的人还查看了...”根据不同行为反映用户喜好的程度将它们进行加权,得到用户对于物品的总体喜好。
一般来说,显式的用户反馈比隐式的权值大,但比较稀疏,毕竟进行显示反馈的用户是少数;同时相对于“查看”,“购买”行为反映用户喜好的程度更大,但这也因应用而异。
收集了用户行为数据,我们还需要对数据进行一定的预处理,其中最核心的工作就是:减噪和归一化。
减噪:用户行为数据是用户在使用应用过程中产生的,它可能存在大量的噪音和用户的误操作,我们可以通过经典的数据挖掘算法过滤掉行为数据中的噪音,这样可以是我们的分析更加精确。
归一化:如前面讲到的,在计算用户对物品的喜好程度时,可能需要对不同的行为数据进行加权。
但可以想象,不同行为的数据取值可能相差很大,比如,用户的查看数据必然比购买数据大的多,如何将各个行为的数据统一在一个相同的取值范围中,从而使得加权求和得到的总体喜好更加精确,就需要我们进行归一化处理。
最简单的归一化处理,就是将各类数据除以此类中的最大值,以保证归一化后的数据取值在[0,1] 范围中。
进行的预处理后,根据不同应用的行为分析方法,可以选择分组或者加权处理,之后我们可以得到一个用户偏好的二维矩阵,一维是用户列表,另一维是物品列表,值是用户对物品的偏好,一般是[0,1] 或者[-1, 1] 的浮点数值。
(2)找到相似的用户或物品当已经对用户行为进行分析得到用户喜好后,我们可以根据用户喜好计算相似用户和物品,然后基于相似用户或者物品进行推荐,这就是最典型的CF 的两个分支:基于用户的CF和基于物品的CF。
这两种方法都需要计算相似度,下面我们先看看最基本的几种计算相似度的方法。
相似度的计算关于相似度的计算,现有的几种基本方法都是基于向量(Vector)的,其实也就是计算两个向量的距离,距离越近相似度越大。
在推荐的场景中,在用户-物品偏好的二维矩阵中。
我们可以将一个用户对所有物品的偏好作为一个向量来计算用户的相似度;或者将所有用户对某个物品的偏好作为一个向量来计算物品之间的相似度。
下面我们详细介绍几种常用的相似度计算方法:相似邻居的计算介绍完相似度的计算方法,下面我们看看如何根据相似度找到用户-物品的邻居,常用的挑选邻居的原则可以分为两类:下图给出了二维平面空间上点集的示意图。
固定数量的邻居:K-neighborhoods 或者Fix-size neighborhoods不论邻居的“远近”,只取最近的K 个,作为其邻居。
如上图中的A,假设要计算点1 的5-邻居,那么根据点之间的距离,我们取最近的5 个点,分别是点2,点3,点4,点7 和点5。
但很明显我们可以看出,这种方法对于孤立点的计算效果不好,因为要取固定个数的邻居,当它附近没有足够多比较相似的点,就被迫取一些不太相似的点作为邻居,这样就影响了邻居相似的程度,比如上图中,点1 和点5 其实并不是很相似。
基于相似度门槛的邻居:Threshold-based neighborhoods与计算固定数量的邻居的原则不同,基于相似度门槛的邻居计算是对邻居的远近进行最大值的限制,落在以当前点为中心,距离为K 的区域中的所有点都作为当前点的邻居,这种方法计算得到的邻居个数不确定,但相似度不会出现较大的误差。
如上图中的B,从点1 出发,计算相似度在K 内的邻居,得到点2,点3,点4 和点7,这种方法计算出的邻居的相似度程度比前一种好,尤其是对孤立点的处理。
(3)计算推荐经过前期的计算已经得到了相邻用户和相邻物品,下面介绍如何基于这些信息为用户进行推荐。
本系列的上一篇综述文章已经简要介绍过基于协同过滤的推荐算法可以分为基于用户的CF 和基于物品的CF,下面我们深入这两种方法的计算方法,使用场景和优缺点。
基于用户的CF(User CF)基于用户的CF 的基本思想相当简单,基于用户对物品的偏好找到相邻邻居用户,然后将邻居用户喜欢的推荐给当前用户。
计算上,就是将一个用户对所有物品的偏好作为一个向量来计算用户之间的相似度,找到K 邻居后,根据邻居的相似度权重以及他们对物品的偏好,预测当前用户可能喜欢的物品,计算得到一个排序的物品列表作为推荐(排序列表中每个物品都有相应的预测值)。
下图给出了一个例子,对于用户A,根据用户的历史偏好,这里只计算得到一个邻居用户C,然后将用户C 喜欢的物品D 推荐给用户A。
基于物品的CF(Item CF)基于物品的CF 的原理和基于用户的CF 类似,只是在计算邻居时采用物品本身,而不是从用户的角度,即基于用户对物品的偏好找到相似的物品,然后根据用户的历史偏好,推荐相似的物品给他。
从计算的角度看,就是将所有用户对某个物品的偏好作为一个向量来计算物品之间的相似度,得到物品的相似物品后,根据用户历史的偏好预测当前用户还没有表示偏好的物品,计算得到一个排序的物品列表作为推荐。
下图给出了一个例子,对于物品A,根据所有用户的历史偏好,喜欢物品A 的用户都喜欢物品C,得出物品A 和物品C 比较相似,而用户C 喜欢物品A,那么可以推断出用户C 可能也喜欢物品C。
User CF vs Item CF前面介绍了User CF 和Item CF 的基本原理,下面我们分几个不同的角度深入看看它们各自的优缺点和适用场景:计算复杂度Item CF和User CF 是基于协同过滤推荐的两个最基本的算法,User CF 是很早以前就提出来了,Item CF 是从Amazon 的论文和专利发表之后(2001 年左右)开始流行,大家都觉得Item CF 从性能和复杂度上比User CF 更优,其中的一个主要原因就是对于一个在线网站,用户的数量往往大大超过物品的数量,同时物品的数据相对稳定,因此计算物品的相似度不但计算量较小,同时也不必频繁更新。
但我们往往忽略了这种情况只适应于提供商品的电子商务网站,对于新闻,博客或者微内容的推荐系统,情况往往是相反的,物品的数量是海量的,同时也是更新频繁的,所以单从复杂度的角度,这两个算法在不同的系统中各有优势,推荐引擎的设计者需要根据自己应用的特点选择更加合适的算法。
适用场景在非社交网络的网站中,内容内在的联系是很重要的推荐原则,它比基于相似用户的推荐原则更加有效。
比如在购书网站上,当你看一本书的时候,推荐引擎会给你推荐相关的书籍,这个推荐的重要性远远超过了网站首页对该用户的综合推荐。
可以看到,在这种情况下,Item CF 的推荐成为了引导用户浏览的重要手段。
同时Item CF 便于为推荐做出解释,在一个非社交网络的网站中,给某个用户推荐一本书,同时给出的解释是某某和你有相似兴趣的人也看了这本书,这很难让用户信服,因为用户可能根本不认识那个人;但如果解释说是因为这本书和你以前看的某本书相似,用户可能就觉得合理而采纳了此推荐。
相反的,在现今很流行的社交网络站点中,User CF 是一个更不错的选择,User CF 加上社会网络信息,可以增加用户对推荐解释的信服程度。
推荐多样性和精度研究推荐引擎的学者们在相同的数据集合上分别用User CF 和Item CF 计算推荐结果,发现推荐列表中,只有50% 是一样的,还有50% 完全不同。
但是这两个算法居然有相似的精度,所以可以说,这两个算法是很互补的。
关于推荐的多样性,有两种度量方法:第一种度量方法是从单个用户的角度度量,就是说给定一个用户,查看系统给出的推荐列表是否多样,也就是要比较推荐列表中的物品之间两两的相似度,不难想到,对这种度量方法,Item CF 的多样性显然不如User CF 的好,因为Item CF 的推荐就是和以前看的东西最相似的。
第二种度量方法是考虑系统的多样性,也被称为覆盖率(Coverage),它是指一个推荐系统是否能够提供给所有用户丰富的选择。
在这种指标下,Item CF 的多样性要远远好于User CF, 因为User CF 总是倾向于推荐热门的,从另一个侧面看,也就是说,Item CF 的推荐有很好的新颖性,很擅长推荐长尾里的物品。
所以,尽管大多数情况,Item CF 的精度略小User CF,但如果考虑多样性,Item CF 却比User CF 好很多。
如果你对推荐的多样性还心存疑惑,那么下面我们再举个实例看看User CF 和Item CF 的多样性到底有什么差别。
首先,假设每个用户兴趣爱好都是广泛的,喜欢好几个领域的东西,不过每个用户肯定也有一个主要的领域,对这个领域会比其他领域更加关心。
给定一个用户,假设他喜欢3 个领域A、B、C,A 是他喜欢的主要领域,这个时候我们来看User CF 和Item CF 倾向于做出什么推荐:如果用User CF, 它会将A,B,C 三个领域中比较热门的东西推荐给用户;而如果用ItemCF,它会基本上只推荐 A 领域的东西给用户。