协同过滤原理及实现(Collaborative Filtering)

原项目地址:https://github.com/Daya-Jin/ML_for_learner/tree/master/recommend

概述

协同过滤(Collaborative Filtering)是推荐系统中最经典的方法了,本文做一个简单的概述。

User-based Collaborative Filtering

假设一个场景,我们想买一个东西或者想吃一个东西,但是自己不知道哪种东西比较好,那么通常的选择就是去询问身边有着相似喜好的朋友寻求推荐。这就是基于用户的协同过滤,核心思想就是相似的用户(user)会喜欢相似的物品(item)。

用户数据

为了在用户群体中找到跟自己相似的用户,很明显需要收集所有用户的数据,如所有用户对多个商品的评价,那么该数据的矩阵形状为(n_{users},n_{items})。在该矩阵中计算其他所有用户与指定用户的相似度,并使用前k个相似用户的数据来做推荐。推荐,肯定是该用户未曾见过或用过的东西,那么需要选出这些相似用户对指定用户未评价过的物品的评价数据,再做下一步计算。

相似用户对物品的加权评价为:相似度\times评分;另外,考虑到热门物品与冷门物品在评价人数上的巨大差别,还需要对加权平价做一个归一化的处理:加权评分/评价人数。对指定用户所有未接触过的物品做加权评价求和,按得分排序就得到了一个推荐物品序列。

假设现在有如下评价数据,其中的0为缺失值的填充值:

item1 item2 item3 item4 item5 item6
user1 2.5 3.5 3 3.5 2.5 3
user2 3 3.5 1.5 5 3.5 3
user3 2.5 3 0 3.5 0 4
user4 0 3.5 3 0 4 4
user5 3 4 2 3 2 3
user6 3 4 0 5 3.5 3
user7 0 4.5 0 4 1 0

现需要针对用户7做推荐。首先计算用户之间的相似度,这里使用:

sim=\frac{1}{1+dist_{E}}

其中dist_{E}为欧氏距离。与用户7最相似的前3个用户及其相似度为:

user5 user6 user3
user7 0.1687 0.1652 0.1646

用户7未接触过的物品为item1、item3和item6,相似用户对其的加权评价数据为:

sim item1 item3 item6
user3 0.1646 2.5*0.1646 0 4*0.1646
user5 0.1687 3*0.1687 2*0.1687 3*0.1687
user6 0.1652 3*0.1652 0 3*0.1652
item score - 1.4138 0.3375 1.6607
sim sum - 0.1646+0.1687+0.1652 0.1687 0.1646+0.1687+0.1652
scaling score - 2.8349 2 3.33

从上述表中可以发现,对于评价人数较少的item1在计算得分时会处于劣势,为了消除这种劣势,所有的得分还需除以一个可以表征评价人数的相似度和sim_sum。

实现指导

以上过程实现的是把物品推荐给人,如果对原数据做转置操作,就可以实现把人推荐给物品。

Item-based Collaborative Filtering

从上节过程对应的实现代码中发现,系统需要维护一个大小为(n_{users},n_{users})的相似度矩阵,并且每次做推荐都需要在原数据中去查找数据,当然在实现上可以将一些中间数据缓存起来以减少计算。但是注意到,对于大多数系统而言,用户是频繁变化的,但是物品却是稳定的,并且通常用户的数据量远远大于物品数量。所以在通常情况下使用的是基于物品的协同过滤,而不是基于用户的协同过滤。并且在实现上,有几个可以优化的地方。

首先,因为物品数量通常远小于用户数量,所以维护一个物品相似度矩阵肯定比维护一个用户相似度矩阵要好得多;另外,在推荐物品时,通常的推荐数在20个以下,这就大大降低了需要缓存的数据量。

实现指导

Latent Factor Model

不难发现真实情境下的user-item矩阵是一个(n_{users},n_{items})的大型稀疏矩阵,无论是基于用户还是基于物品的协同过滤算法,都需要在这个稀疏矩阵中找到若干个相似对象,这一步是既费时又费空间的操作。实际上,评价数据一般是以table的形式存储在数据库中,所以我们拥有的原数据格式并不是矩阵形式,而是类似于key-val对的多元组形式。

首先引入矩阵分解的概念,形状为(n_{users},n_{items})可以表示成两个形如(n_{users},k)(n_{items},k)^{T}的矩阵相乘,矩阵中的k列表示的是数据中的隐因子(Latent Factor)。那么是不是直接分解user-item矩阵来得到压缩后的两矩阵呢?刚刚说过,原数据并不是矩阵形式;其次,SVD在大型矩阵上的运行速度很慢;最后,如果使用矩阵分解的方法,还需要再构造一个user-item矩阵,相当麻烦。所以使用的是迭代优化的方法来得到两个压缩矩阵。

设用户隐因子矩阵为p_{(n_{users},k)},物品隐因子矩阵为q_{(n_{items},k)},那么user-item矩阵中对应位置的值可以由下式计算:

\hat{r}_{ui}=p_{u}q_{i}^{T}

得到最简单的优化问题为:

\min_{p,q} \ \sum\limits_{u,i}(r_{ui}-\hat{r}_{ui})^{2}

该问题可以使用梯度下降法来解决。注意这种方法并不需要构造user-item矩阵,也不需要维护相似度矩阵,只需要user与item的索引即可从数据库中直接取出r_{ui}

了解了LFM的基本原理之后,我们再引入一些修正。假设所有用户与所有物品之间有一个基准分数,并且用户与物品自身都有着一些影响客观评分的特征,如某个用户要求很高,倾向于给物品打低分;而某些物品则品质极好,更容易获得高分。令全局基准分数为\mu,用户的偏好数组为bias_{user},物品的偏好数组为bias_{item},同时结合上述矩阵分解的思想,那么此时对user-item对的预测值为:

\hat{r}_{ui}=\mu+b_{u}+b_{i}+p_{u}q_{i}^{T}

易得带正则项的优化问题为:

\min_{b_{u},b_{i},p,q} \ \sum\limits_{u,i}(r_{ui}-\mu-b_{u}-b_{i}-p_{u}q_{i}^{T})^{2}+\alpha(||b_{u}||_{2}+||b_{i}||_{2}+||p||_{2}+||q||_{2})

令学习率为\eta,预测误差e_{ui}=r_{ui}-\hat{r}_{ui},求导得各参数的迭代优化公式(省略常数项):

\begin{aligned} b_{u}&:=b_{u}+\eta(e_{ui}-{\alpha}b_{u}) \\ b_{i}&:=b_{i}+\eta(e_{ui}-{\alpha}b_{i}) \\ p&:=p+\eta(e_{ui}q-{\alpha}p) \\ q&:=q+\eta(e_{ui}p-{\alpha}q) \\ \end{aligned}

实现指导

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容

  • 引言 昨日看到几个关键词:语义分析,协同过滤,智能推荐,想着想着便兴奋了。于是昨天下午开始到今天凌晨3点,便研究了...
    Alukar阅读 1,572评论 1 14
  • 什么是协同过滤 协同过滤推荐(Collaborative Filtering recommendation)是在信...
    小灰灰besty阅读 34,185评论 7 51
  • 作者 | HCY崇远 01 前言 本文源自于前阵子连续更新的推荐系统系列,前段时间给朋友整理一个关于推荐系统相关的...
    daos阅读 5,648评论 0 77
  • 在习惯用键盘敲字之前,坚信纸笔书写这唯一的书写途径,是最舒服与美妙的体验。一本喜欢的笔记本,翻开空白第一页落笔时的...
    静水aloha阅读 286评论 1 1
  • 亲爱的伙伴们好久不见啊!前段时间一直在准备考研,所以也没有更新简书的动态,有点小小的内疚!不过没关系,以后我就...
    MM书吧阅读 282评论 1 1