基于协同过滤的推荐算法(用户协同、物品协同、模型协同)

一、介绍

1.基于用户的协同过滤推荐

基于用户的协同过滤推荐的基本原理是,根据用户的偏好及行为习惯,发现与当前用户口味和偏好相似的“邻居”用户群。基于邻居的历史偏好信息,为当前用户进行推荐。
即:a与c为相似用户,用户a看过物品A和C,用户c看过物品A、C和D,则推荐c看过a没看过的物品D给a
在这里插入图片描述

2.基于项目(物品)的协同过滤推荐

基于物品的协同过滤推荐的基本原理是,根据物品的自然分类、定义及用户对物品的偏好,发现物品和物品之间的相似度,将类似的物品推荐给用户。
即:A与C为相似物品,若用户c浏览了物品A且没有浏览物品C,则向用户c推荐物品C
在这里插入图片描述
详细区别见下表:

-基于用户的协同过滤基于物品的协同过滤
性能一般用于用户数小于物品数的场景(新闻博客社交类),用户太多时用户相似度矩阵计算代价大同理,一般用于物品数小于用户数的场景(购物类)
领域时效性强,总是推送热门物品长尾物品丰富,用户个性化需求强
实时性用户有新行为,不一定造成推荐结果立马变化用户有新行为会导致推荐结果变化
推荐理由利用与当前用户相似的其他用户的行为给用户推荐做解释利用当前用户的历史行为给用户推荐做解释

ps:
1.用户协同场景下,系统会给出这种解释,某某和你有相似兴趣的人也看了这本书,这种解释适用于社交性较强用户彼此之间本身就有一定联系的网站,用户可能认识这个人,所以解释会令人信服。
2.物品协同场景下,系统会给出这种解释,这本书和你以前看的某本书相似,这种解释在任意场景下都是一个不错的解释。

3.基于模型的协同过滤推荐

基于模型的协同过滤推荐就是基于样本的用户喜好信息,训练一个推荐模型,然后根据实时的用户喜好的信息进行预测,计算推荐。
优点:1它不需要对物品或者用户进行严格的建模。2推荐是开放的,可以共用他人的经验
缺点:1用户历史偏好是用稀疏矩阵进行存储的,而稀疏矩阵上的计算有些明显的问题,包括可能少部分人的错误偏好会对推荐的准确度有很大的影响等等。2方法更新迭代慢。


二、实现步骤

1.用户协同过滤和物品协同过滤的实现方法

1)收集用户偏好

将不同的行为进行分组:
用户行为:查看、推荐、购买、借还、收藏等
物品行为:被查看、被推荐、被购买等

然后基于不同的行为,计算不同的用户 / 物品相似度。类似于
“查看了这本图书的人还查看了A …”
“没有搜到此书,但为您推荐类似图书B”
“和你同一专业的人都在看这些书”

加权操作:
根据不同行为反映用户喜好的程度将它们进行加权,得到用户对于物品的总体喜好。一般来说,显式的用户反馈比隐式的权值大,但比较稀疏,毕竟进行显示反馈的用户是少数;同时相对于“查看”,“购买”行为反映用户喜好的程度更大,但这也因应用而异。

收集了用户行为数据之后需要对数据进行预处理,主要就是 减噪 和 归一化。

减噪
用户行为数据是用户在使用应用过程中产生的,它可能存在大量的噪音和用户的误操作,可以通过一些算法过滤掉行为数据中的噪音。

归一化
将各个行为的数据统一在一个相同的取值范围中。最简单的归一化处理,就是将各类数据除以此类中的最大值,以保证归一化后的数据取值在 [0,1] 范围中。

进行的预处理后,根据不同应用的行为分析方法,可以选择分组或者加权处理,之后可以得到一个用户偏好的二维矩阵,一维是用户列表,另一维是物品列表,值是用户对物品的偏好,一般是 [0,1]或者[-1, 1]的浮点数值。

最后形成如下的 用户偏好表

用户偏好表物品1物品2物品3物品4物品5
用户10.50.80.10.3-
用户20.8-0.2-0.2
用户3-0.20.810.8

2)计算用户或物品的相似度

采用余弦相似度算法比较相似性(余弦相似度用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小。相比距离度量,余弦相似度更加注重两个向量在方向上的差异,而非距离或长度上)。
在这里插入图片描述
在这里插入图片描述
计算形成如下相似度表

用户相似度权值表用户A用户B用户C
用户A10.30.4
用户B0.310.2
用户C0.40.21
物品相似度权值表物品A物品B物品C
物品A10.80.9
物品B0.810.2
物品C0.90.21

ps:相似度权值归一化在[0,-1]或者[-1,1]之间

3)推荐

相似度矩阵 x 偏好矩阵 = 推荐列表
ps:矩阵相乘前需要先将缺失值补充为所有权值的平均值,否则相乘后的推荐矩阵会倾向于评价人数多的物品,而不是评价结果高的物品。

根据上面的相似度表查询出相似用户或相似物品 结合不同场景进行推荐

2.模型协同过滤的实现方法

1)待补充,根据具体需求实现

### 基于协同过滤推荐算法实现 #### 一、理解基于用户协同过滤算法 在构建推荐系统时,基于用户协同过滤是一种常用的技术。该技术依赖于用户历史行为数据来计算不同用户间的相似度,并据此向目标用户提供其他具有相似兴趣用户的偏好项作为推荐[^1]。 #### 二、解决冷启动问题的选择 值得注意的是,在应用此方法前需考虑是否有足够的数据支持;对于新平台或是数据稀缺的情况,则可能更适合采用基于物品协同过滤方案,即通过分析商品特性之间的关联来进行预测和建议[^2]。 #### 三、具体实施方案——以MATLAB为例 为了便于理解和实践操作,下面将以MATLAB环境下的简单例子展示如何利用基于用户协同过滤创建一个基本版本的电影推荐引擎: ```matlab % 加载并预处理数据集 load('movieRatings.mat'); % 假设已有一个名为 movieRatings 的矩阵存储着评分信息 [nUsers, nMovies] = size(movieRatings); % 计算用户间相似度 (这里简化为皮尔逊相关系数) similarityMatrix = zeros(nUsers); for i=1:nUsers for j=i+1:nUsers commonRatedItemsIdx = ~isnan(movieRatings(i,:)) & ~isnan(movieRatings(j,:)); if any(commonRatedItemsIdx), similarityMatrix(i,j) = corr(movieRatings(i,commonRatedItemsIdx)', ... movieRatings(j,commonRatedItemsIdx)'); similarityMatrix(j,i) = similarityMatrix(i,j); %#ok<SPRIX> end end end % 预测未打分项目的分数 predictedScores = nan(size(movieRatings)); for u=1:nUsers, ratedItemsByUserU = find(~isnan(movieRatings(u,:))); unratedItemsForUserU = setdiff(1:nMovies,ratedItemsByUserU); for m : unratedItemsForUserU, weightedSumOfSimilaritiesAndRatings = sum(similarityMatrix(u,:) .* movieRatings(:,m), 'omitnan'); normalizationFactor = sum(abs(similarityMatrix(u,:)), 'omitnan'); predictedScore = weightedSumOfSimilaritiesAndRatings / max(normalizationFactor,eps); predictedScores(u,m) = predictedScore; end end disp('Predicted ratings:'); disp(predictedScores); ``` 上述代码片段展示了如何在一个假设的数据集中执行基于用户协同过滤过程,包括加载数据、计算用户之间相似性和预测未知评价等步骤。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

什么都干的派森

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值