现在的位置: 首页 > 综合 > 正文

推荐系统3种主要算法学习笔记与总结

2018年04月29日 ⁄ 综合 ⁄ 共 3376字 ⁄ 字号 评论关闭

以下均为个人总结,“我认为”居多,欢迎指正,给菜鸟一个学习的机会。


音乐推荐与普通商品推荐的区别

1、消费歌代价小; 免费

2、物品重用率高
喜欢的歌会重复听,裤子未必会重复买

3、上下文相关性更大
和用户当前心情、工作环境相关更大


推荐系统的指标

precision 

recall

新颖度

惊喜度

转化率

覆盖率


各自的关注点分别是:

precision: 推荐的100件商品中有多少是用户确实喜欢的?

recall: 用户所有喜欢的商品(假设:100件)中你推荐了出来了多少件?

新颖度:你推荐的是热门的还是长尾的?

惊喜度:用户有多喜欢你推荐的?

转化率:你推荐给用户的,有多少转化为了购买(商品)或者收藏(音乐)?

覆盖率:仓库里的那100件商品你全都推荐过么?能否保证将每个商品至少推荐给了一个用户?


协同过滤 Collaborative Filtering:

1、常用的有

User-based
Collaborative Filtering

从跟目标用户相似的其他用户中找几个最相似的,把它们喜欢的商品推荐给目标用户

Item-based
Collaborative Filtering

把跟目标用户喜欢的商品相似的商品中找几个最相似的,把它们推荐给目标用户


2、如何衡量相似?

对User-based来说,用户A和用户B喜欢的东西如果经常重叠,认为他们相似;

对Item-based来说,物品1和物品2经常被同一个用户喜欢,认为它们相似;


3、如何表征相似?

算距离。

1)怎么算?

(欧式距离、pearson距离、古本系数、余弦距离等)。

2)怎么存?

用一个相似矩阵W存储,其中 wi,j 表示i和j的相似度。因而,在User-based中,wi,j 表示的是用户i和用户j的相似程度;

Item-based中,存的是物品相似程度。


4、如何处理热门商品(哈利波特问题)

为啥要处理:否则的话,会给每个买书的人推荐新华字典,因为够热门,上过小学都买过。

通常在计算相似度时,会考虑热门商品的问题

1)在User-based中,

其实主要是求了个倒数,喜欢i的人越多,得分越低。也即,i越热门,越不能表征用户是否相似。反之,越不热门,越能表征。

例如:两个人同时喜欢《资治通鉴》,或者同时喜欢一套6K多的珍藏版《指环王》,基本定性了~

2)在Item-based中(哈利波特问题),

假设j是热门商品,分母很大,从而降低了热门对相似判断的影响。阔是如果有些物品如果实在太热门了,即便这样惩罚了还是显得不够。


这样居然往往就显著提升了覆盖率和新颖性(降低流行度一般即能提高新颖度)。


5、如何计算用户 u 喜欢物品 i 的程度

1、User-based:

其中,S(u,k):与u兴趣相近的用户们       N(i):喜欢商品i的用户们W (u,v):u,v相似度r (v, i):v喜欢i的程度


2、Item-based:

其中,N(u):用户u喜欢的商品们s(j, k):与商品j相似的商品们W(j, j):j,i相似度 r(u,
i):u喜欢i的程度

例子:


6、为何现实应用中用Item-based的多:

1)通常user数远大于item数,维护一个庞大的用户相似度矩阵,不论计算或存储都是问题;

2)物品之间的相似度相对稳定,随时间变化的程度小;

3)Item-based可以对推荐的商品提供推荐理由:比如借上面那个例子,给你推荐《算法导论》,是因为你喜欢过《C++ Primer》和《编程之美》。


下边是一些更加细碎零散的东西,更多是志记和加深记忆的作用。

1、用户活跃度对物品相似度的影响

有paper提出一个成为IUF的观点,该观点认为:活跃的用户对物品相似度的贡献应该小于不活跃的用户。why呢? 因为如果你是一个来亚马逊进货的商人,你买了4000双鞋,阔能你会稍微挑一挑,但大概率意义上来说,你买它们并非完全出于喜欢。因此你的这次购买记录理论上来说,不应该用来衡量商品相似度。至少,weight应该调低一点。

很有道理的样子,如何做呢。类似上边对user-based热门商品的处理,调低一点的做法如下

简单解释:如果用户u同时买了或者说喜欢了i、j,但是u买了海量的商品(商人),或者喜欢了海量的商品(滥情),那么他对物品i、j是否相似的观点,我们尽量忽略。


2、物品相似度的归一化

有人(KARYPIS)发现,如果将item-based的相似度矩阵按最大值(列)归一化,可以提高推荐的准确率。项亮老师表示,不仅如此,还能提高推荐的覆盖率和多样性。

简单解释:如果A类商品之间计算出来的相似度普遍在0.6左右,而B类商品之间的相似度普遍在0.5左右。那么此时如果一个用户喜欢了5个A类商品,5个B类商品,用ItemCF给他推荐,全部都是A类,因为0.6 > 0.5,如果各自归一化一下,相似度都是1,再推荐的话可能A、B类掺杂。从而提高了多样性。项老师又定性地表示  - -!:热门商品类之间的相似性比较大,不归一化的话推荐热门的可能性比较大,所以归一化也提高了覆盖率。


3、UserCF和ItemCF的比较

简而言之,UserCF的推荐结果着重于反映和用户兴趣相似的小群体的热点,而ItemCF的推荐结果着重于维系用户的历史兴趣。

换句话说,UserCF更偏向社会化,ItemCF更偏向个性化。

因此,如果是新闻网站,社会化色彩比较浓,UserCF更靠谱;其他的大部分,如电商、音乐、电影、图书,更具象的说Amazone、豆瓣、Netflix中,ItemCF更靠谱。

如果从技术角度考量,新闻每天更新,维护一个不停更新的相似度矩阵。。 ORZ;而对商品更新相对没有那么迅速的其他网站,ItemCF就比较OK了。附一张优缺点对比图:

 


隐语义模型:

对商品进行分类,给一个用户推荐前,首先得到他的兴趣分类,再从他的兴趣分类里边挑选他可能喜欢的商品推荐给他。


其中,p(u, k)度量了用户u的兴趣和第k个隐类的关系,q(i, k)度量了第k个隐类和物品i之间的关系。这两个参数都可以通过机器学习的方法训练得到。


隐语义模型 LFM 和 基于邻域的方法(UserCF、ItemCF)的区别

1、理论基础

LFM有比较好的理论基础,它是一种学习方法,通过优化一个设定的指标建立最优的模型;基于邻域的方法是基于统计的方法,没有学习过程。


2、空间复杂度

UserCF的空间复杂度是 O(M ^ 2), ItemCF的空间复杂度是O(N ^ 2),而LFM的空间复杂度为O(K * (M + N))。

当M、N 很大的时候,LFM能节省不少空间。


3、时间复杂度

假设M个用户、N个物品、K条用户对物品的行为记录。UserCF计算用户相似性矩阵需要 O(N * (K / N) ^ 2);

ItemCF计算物品相似性矩阵需要O(M * (K / M) ^ 2);

LFM 如果用F个隐类,迭代S次, 时间复杂度为O(K * F *S)。一般略高于前两者,也相差不大。


4、在线实时推荐

LFM的缺点。不能在线实时推荐,ItemCF维护一个Item相似矩阵,来一个新物品就实时更新一下。而LFM在给用户生成推荐列表时,需要计算用户对所有物品的兴趣权重,然后排名,返回权重最大的N个物品。那么如果物品较多,时间复杂度O(M * N * F)。


5、推荐解释

ItemCF是3者中唯一能够提供合理性解释的。


基于图的模型

将用户行为表示成二分图模型后,推荐的任务即建模为:度量与用户u没有路径直连的物品i,推荐相关性最大的物品。

因而转化为图论的问题。

度量图中任意两点间相关性,主要看3个点:

1、两点间有多少条路径?

2、路径有多长?

3、途径过 出度很大的点么?


于此对应的,一对相关性很大的点,具备3个特征

1、很多路相连;

2、路径都很短;

3、没有途径过出度很大的点。

在此基础上,有paper提出了一种“基于随机游走的PersonalRank”算法:

假设要给用户u进行个性化推荐,就以V(u)为起点开始走,到达一个点就停下来以概率p决定是否继续走

1)继续走,看V(cur) 点的出度,均匀分布地决定走哪条路离开;

2)不走,退回到V(u)重新开始走。


这样,经过多次随机游走后,每个点被访问到的概率会收敛到一个数。这个数就是最终该节点被推荐的权重。

这个过程写成公式如下:



缺点:迭代,慢。


转化为矩阵的形式,令M为用户物品二分图的转移概率矩阵,即

M(v, v') = 1 / |out(v)|, 迭代公式因此可以转化为:


解得:

从稀疏矩阵的快速求逆入手,提速。

抱歉!评论已关闭.