基于用户的协同过滤推荐算法原理和实现

转载自 http://www.cnblogs.com/technology/p/4467895.html


        在推荐系统众多方法中,基于用户的协同过滤推荐算法是最早诞生的,原理也较为简单。该算法1992年提出并用于邮件过滤系统,两年后1994年被 GroupLens 用于新闻过滤。一直到2000年,该算法都是推荐系统领域最著名的算法。

        本文简单介绍基于用户的协同过滤算法思想以及原理,最后基于该算法实现园友的推荐,即根据你关注的人,为你推荐博客园中其他你有可能感兴趣的人。

基本思想

        俗话说物以类聚、人以群分,拿看电影这个例子来说,如果你喜欢《蝙蝠侠》、《碟中谍》、《星际穿越》、《源代码》等电影,另外有个人也都喜欢这些电影,而且他还喜欢《钢铁侠》,则很有可能你也喜欢《钢铁侠》这部电影。

        所以说,当一个用户 A 需要个性化推荐时,可以先找到和他兴趣相似的用户群体 G,然后把 G 喜欢的、并且 A 没有听说过的物品推荐给 A,这就是基于用户的协同过滤算法。

原理

根据上述基本原理,我们可以将基于用户的协同过滤推荐算法拆分为两个步骤:

1. 找到与目标用户兴趣相似的用户集合

2. 找到这个集合中用户喜欢的、并且目标用户没有听说过的物品推荐给目标用户

1. 发现兴趣相似的用户

通常用 Jaccard 公式或者余弦相似度计算两个用户之间的相似度。设 N(u) 为用户 u 喜欢的物品集合,N(v) 为用户 v 喜欢的物品集合,那么 u v 的相似度是多少呢:

Jaccard 公式:


余弦相似度:


假设目前共有4个用户: ABCD;共有5个物品:abcde。用户与物品的关系(用户喜欢物品)如下图所示:


如何一下子计算所有用户之间的相似度呢?为计算方便,通常首先需要建立物品用户的倒排表,如下图所示:


然后对于每个物品,喜欢他的用户,两两之间相同物品加1。例如喜欢物品 a 的用户有 A B,那么在矩阵中他们两两加1。如下图所示:


计算用户两两之间的相似度,上面的矩阵仅仅代表的是公式的分子部分。以余弦相似度为例,对上图进行进一步计算:


到此,计算用户相似度就大功告成,可以很直观的找到与目标用户兴趣较相似的用户。

2. 推荐物品

首先需要从矩阵中找出与目标用户 u 最相似的 K 个用户,用集合 S(u, K) 表示,将 S 中用户喜欢的物品全部提取出来,并去除 u 已经喜欢的物品。对于每个候选物品 i ,用户 u 对它感兴趣的程度用如下公式计算:


其中 rvi 表示用户 v i 的喜欢程度,在本例中都是为 1,在一些需要用户给予评分的推荐系统中,则要代入用户评分。

举个例子,假设我们要给 A 推荐物品,选取 K = 3 个相似用户,相似用户则是:BCD,那么他们喜欢过并且 A 没有喜欢过的物品有:ce,那么分别计算 p(A, c) p(A, e)



看样子用户 A c e 的喜欢程度可能是一样的,在真实的推荐系统中,只要按得分排序,取前几个物品就可以了。


园友推荐

在社交网络的推荐中,物品其实就是喜欢一件物品变为关注的人,这一节用上面的算法实现给我推荐 10 个园友。

1. 计算 10 名与我兴趣最相似的园友

由于只是为我一个人做用户推荐,所以没必要建立一个庞大的用户两两之间相似度的矩阵了,与我兴趣相似的园友只会在这个群体产生:我关注的人的粉丝。除我自己之外,目前我一共关注了23名园友,这23名园友一共有22936个唯一粉丝,我对这22936个用户逐一计算了相似度,相似度排名前10的用户及相似度如下:

昵称

关注数量

共同数量

相似度

蓝枫叶1938

5

4

0.373001923296126

FBI080703

3

3

0.361157559257308

鱼非鱼

3

3

0.361157559257308

Lauce

3

3

0.361157559257308

蓝色蜗牛

3

3

0.361157559257308

shanyujin

3

3

0.361157559257308

Mr.Huang

6

4

0.340502612303499

对世界说你好

6

4

0.340502612303499

strucoder

28

8

0.31524416249564

Mr.Vangogh

4

3

0.312771621085612

2. 计算对推荐园友的兴趣度

10名相似用户一共推荐了25名园友,计算得到兴趣度并排序:

排序

昵称

兴趣度

1

wolfy

0.373001923296126

2

Artech

0.340502612303499

3

Cat Chen

0.340502612303499

4

WXWinter()

0.340502612303499

5

DanielWise

0.340502612303499

6

一路前行

0.31524416249564

7

Liam Wang

0.31524416249564

8

usharei

0.31524416249564

9

CoderZh

0.31524416249564

10

博客园团队

0.31524416249564

11

深蓝色右手

0.31524416249564

12

Kinglee

0.31524416249564

13

Gnie

0.31524416249564

14

riccc

0.31524416249564

15

Braincol

0.31524416249564

16

滴答的雨

0.31524416249564

17

Dennis Gao

0.31524416249564

18

刘冬.NET

0.31524416249564

19

李永京

0.31524416249564

20

浪端之渡鸟

0.31524416249564

21

李涛

0.31524416249564

22

阿不

0.31524416249564

23

JK_Rush

0.31524416249564

24

xiaotie

0.31524416249564

25

Leepy

0.312771621085612

只需要按需要取相似度排名前10名就可以了,不过看起来整个列表的推荐质量都还不错!


参考

项亮:《推荐系统实践》


考虑柔性负荷的综合能源系统低碳经济优化调度【考虑碳交易机制】(Matlab代码实现)内容概要:本文围绕“考虑柔性负荷的综合能源系统低碳经济优化调度”展开,重点研究在碳交易机制下如何实现综合能源系统的低碳化与经济性协同优化。通过构建包含风电、光伏、储能、柔性负荷等多种能源形式的系统模型,结合碳交易成本与能源调度成本,提出优化调度策略,以降低碳排放并提升系统运行经济性。文中采用Matlab进行仿真代码实现,验证了所提模型在平衡能源供需、平抑可再生能源波动、引导柔性负荷参与调度等方面的有效性,为低碳能源系统的设计与运行提供了技术支撑。; 适合人群:具备一定电力系统、能源系统背景,熟悉Matlab编程,从事能源优化、低碳调度、综合能源系统等相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①研究碳交易机制对综合能源系统调度决策的影响;②实现柔性负荷在削峰填谷、促进可再生能源消纳中的作用;③掌握基于Matlab的能源系统建模与优化求解方法;④为实际综合能源项目提供低碳经济调度方案参考。; 阅读建议:建议读者结合Matlab代码深入理解模型构建与求解过程,重点关注目标函数设计、约束条件设置及碳交易成本的量化方式,可进一步扩展至多能互补、需求响应等场景进行二次开发与仿真验证。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值