集体的力量如钢铁,世人的聪明如日月协同过滤(Collaborative Filtering)是现今推荐体系中应用最为成熟的一个推荐算法系类,它哄骗爱好相投、拥有共同经验之群体的爱好来推荐应用者感爱好的资讯,小我透过合作的机制赐与资讯相当程度的回应(如评分)并记录下来以达到过滤的目标进而帮助别人筛选资讯(参考wiki,文字有点生硬,不过却很好的描述了协同过滤的一个互动性:用户参与用户获益)。
边收拾边写了整整一天o(╯□╰)o
简单来说:
三者均反应在协同过滤的评级(rating)或者群体过滤(social filtering)这种行动特点上。
协同过滤上斗劲经典有名的组织贸易有:
长处:首要从应用者角度来看:
毛病:首要从设计与实现的角度
本末节参考《Toward the next generation of recommender systems: A survey of the state-of-the-art and possible extensions》的2.2节翻译。
为了使推荐体系加倍正确,体系必须从用户的评分中学惯用户的偏好,有很多办法测验测验这方面研究,它们大多半应用混淆推荐模型,包含了基于内容以及协同过滤推荐办法。别的的一种办法是发掘一些条目供给给新用户来进行评级,以便快速学惯用户的偏好。这些发掘条目标技巧是基于项目标风行度,项目标熵,用户个性化,以及以上技巧的糅合。
新的项目会经常添加到推荐体系中,协同过滤根蒂根基上是经由过程用户的偏好进行推荐,如许,直到新的项目被足够数量的用户进行评级,推荐体系才有可能推荐它,这个题目同样是经由过程混淆推荐办法来解决。
在很多推荐体系中,已经获获得的评级数据比拟全部待猜测的项只是很小的一项目组,那么从一个很小的样例数据集中高效的猜测评分是很首要的。同样推荐体系的成功在于拥有足够数量的用户,列于,在电影推荐体系中,有很多电影只被小项目组用户评级,并且这些电影会很少被推荐,即使那小项目组用户赐与很高评级。同样,对于那些有着不合咀嚼的小众群体,找不到雷同特定同口味的用户,也导致较差的推荐成果了。
一个降服数据稀少性题目的办法,是经由过程应用用户材料信息来策画用户类似度。也就是,两个用户会被认为类似不只单在雷同的电影评级类似,并且也有可能属于同一小我口统计区块(demographic),比如,用户的性别,春秋,居住地,教导景象,工作信息。这种基于传统协同过滤的扩大办法称为demographic filtering。详见M. Pazzani, 《A Framework for Collaborative, Content-Based, and Demographic Filtering, Artificial Intelligence Rev》
别的的一个测验测验在于发掘被推荐出的用户之间的类似性,在客户的汗青交易和反馈数据中,经由过程接洽关系检索框架,以及相干传播扩散算法来发明客户间的可传递性接洽关系。
别的的一个路子解决思路是,是经由过程一种降维技巧( dimensionality reduction ),奇怪值分化(SVD:Singular Value Decomposition ),来降落稀少矩阵的维度。SVD是今朝一个已知的矩阵分化技巧,来为原始矩阵求的最好的低维近似。详见B. Sarwar, 的《Application of Dimensionality Reduction in Recommender Systems—A Case Study》
协同过滤作为推荐体系中的一个主流办法路子,在推荐体系中所处地位是怎么样的呢,下面首要对推荐体系的办法类别进行介绍,从两种不合的角度上,推荐体系中办法技巧分类首要有以下两种分类:
起首参考Adomavicius, G的论文《Toward the next generation of recommender systems: A survey of the state-of-the-art and possible extensions》
推荐体系中的总体办法有:
并且论文中总结的近况技巧分类概述如下图:
参考Carleton College, Northfield, MN.官方网站上:
协同过滤实际上与推荐体系中的其他办法是交错叠加的,没有一个明白的界线,推荐体系的办法测验测验都有连络协同过滤的思惟身分去实现,参考wiki百科中协同过滤大体可以分为三类:
用类似统计的办法获得具有类似爱好或者爱好的相邻应用者,最早是在1994年由来自美国Minnesota大学Paul Resnick等人揭晓的《GroupLens: An Open Architecture for Collaborative Filtering of Netnews》一文中提出的。
收集可以代表应用者爱好的资讯。概括首要分为两类:
以应用者为根蒂根基(User-based)的协同过滤的出发点是与应用者爱好爱好雷同的另一组应用者,就是策画两个应用者的类似度。
例如:寻找n个和A有类似爱好应用者,把他们对M的评分作为A对M的评分猜测。一般会按照材料的不合选择不合的算法。
今朝较多应用的类似度算法有:
有了比来邻凑集,就可以对目标应用者的爱好进行猜测,产生推荐成果。
根据推荐目标不合情势的推荐,较常见的推荐成果有Top-N 推荐和接洽关系推荐。
鉴于基于用户的协同推荐算法跟着应用者数量的增多,策画的时候就会变长,最早是在2001年由Sarwar提出了基于项目标协同过滤推荐算法《Item-based Collaborative Filtering Algorithms》中所提出的。
基于项目协同过滤在于透过策画项目之间的类似性来庖代应用者之间的类似性。
所建树的一个根蒂根基的假设:”可以或许引起应用者爱好的项目,必然与其之前评分高的项目类似”,通俗的来说:根蒂根基上喜好《长尾理论》的人,都邑去看《世界是平的》,不知道你怎么想,反正豆瓣推荐体系就是这么认为的。
同以应用者为根蒂根基(User-based)的协同过滤。
先策画己评价项目和待猜测项目标类似度,并以类似度作为权重,加权各已评价项目标分数,获得待猜测项目标猜测值。
例如:要对项目 A 和项目 B 进行类似性策画,要先找出同时对 A 和 B 打过分的组合,对这些组合进行类似度策画,常用的算法同基于应用者(User-based)的协同过滤。
在用户应用评价一个商品感爱好后,会主动搜寻改商品类似度最大的前N项条目。
长处:以项目为根蒂根基的协同过滤不消推敲应用者间的差别,所以精度斗劲差。然则却不须要应用者的汗青材料,或是进行应用者辨认。对于项目来讲,它们之间的类似性要稳定很多,是以可以离线完成工作量最大的类似性策画步调,从而降落了线上策画量,进步推荐效力,尤其是在应用者多于项目标景象下尤为明显。
毛病:但其仍有很多题目须要解决,最典范的有稀少题目(Sparsity)和冷启动题目(Cold-start),开端时结果较差。此外还有新应用者题目和算法结实性等题目。
以应用者为根蒂根基(User-based)的协同过滤和以项目为根蒂根基(Item-based)的协同过滤统称为以记忆为根蒂根基(Memory based)的协同过滤技巧,他们共有的毛病是材料稀少,难以处理惩罚大数据量下的即时成果,是以成长出以模型为根蒂根基的协同过滤技巧。
以模型为根蒂根基的协同过滤(Model-based Collaborative Filtering)是先用汗青材料获得一个模型,再用此模型进行猜测。以模型为根蒂根基的协同过滤广泛应用的技巧包含Latent Semantic Indexing、Bayesian Networks…等,按照对一个样本的解析获得模型。
类似度策画算法可以用于策画用户或者项目类似度。
以项目类似度策画(Item Similarity Computation)为列,通性在于都是从评分矩阵中,为两个项目i,j遴选出共同的评分用户,然对这个配实用户的评分向量,进行策画类似度si,j,
由参考1,参考2如下图:行代表用户,列代表项目
(重视到是从i,j向量中抽出共有的评论,构成的一对向量,进行类似度策画),
皮尔森相干系数也是一种基于相干系数的类似度策画办法,一般为了使策画成果正确,须要找出共同评分的用户。
记用户集U为既评论了 i 又评论了 j 的用户集,那么对应的皮尔森相干系数策画公式为:
(此中Ru,i 为用户u 对项目 i 的评分,对应带横杠的为这个用户集U对项目i的评分评分)
两个项目 i ,j 视作为两个m维用户空间向量,类似度策画经由过程策画两个向量的余弦夹角,那么,对于m*n的评分矩阵,i ,j 的类似度sim( i , j ) 策画公式:
(此中 " · "记做两个向量的内积)
余弦类似度策画并没有推敲到不合的用户的评分标准差别性,也就是说有的用户评分更宽容广泛打分较高,有的用户评分更严格,广泛打分较低。改正余弦类似度正式为了降服这一毛病,经由过程求出每位用户的均匀打分,调剂评分向量为评分误差向量,再进行求解余弦类似度。
(此中带横杠的为第u个用户的均匀评分)
上述三个类似度公式是基于项目类似度场景下的,而实际上,基于用户类似度与基于项目类似度策画的一个根蒂根基的差别是,基于用户类似度是基于评分矩阵中的行向量类似度求解,基于项目类似度策画式基于评分矩阵中列向量类似度求解,然后三个公式分别都可以实用,如下图:
(此中,为0的默示未评分)
终极的策画公式办法均雷同。具体可具体参考《Toward the next generation of recommender systems: A survey of the state-of-the-art and possible extensions》2.2节
基于评分矩阵类似度策画所面对的一个机能题目,数据稀少下,精度很差,因为类似度策画是基于寻找拥有配实用户评分的项目或者共同项目评分的用户,在数据稀少下,两个向量中空值过多,导致策画共同评分维度过低,甚至就没有共同评分。
对于数据稀少性这种景象下,一个测验测验的路子是进行对评分矩阵进行填充。
填充规矩有很多,一种通用的办法是,填充均分,具体如下两种:
(基于用户均分填充) (基于项目均分填充)
起首参考Slope one的wiki百科的一段话(此章节遵守Slope one的wiki百科从头收拾):
当可以对一些项目评分的时辰,比如人们可以对一些器材给出1到5星的评价的时辰,协同过滤意图基于一个个别畴昔对某些项目标评分和(重大的)由其他用户的评价构成的数据库,来猜测该用户对未评价项目标评分。
In this context, item-based 协同过滤体系[按照其它项目标评分来猜测某项目标分值,一般办法为 线性回归 (f(x) = ax + b). 于是,当有1000个项目时,须要列多达1,000,000个线性回归方程, 以及多达2,000,000个回归量。除非我们只选择某些用户共同评价过的项目对,不然协同过滤会碰到过适 题目。
别的一种更好的办法是应用更简单一些的式子,比如 f(x) = x + b:实验证实当应用一半的回归量的时辰,该式子(称为Slope One)的发挥解析有时优于[2] 线性回归方程。该简化办法也不须要那么多存储空间和延迟。
基于奥卡姆剃刀原则:“切勿浪费较多器材,去做‘用较少的器材,同样可以做好的工作’。”
基于项目类似度协同过滤的一种简化的思惟Slope One算法也就反应出了加倍实用之处。
附带一句,关于推荐体系等算法,急迅开辟实现,可以测验测验看下《集体聪明编程》(Programming Collective Intelligence),Python实现。
为了大大削减过适的产生,提拔算法简化实现, Slope One 系列易实现的Item-based协同过滤算法被提了出来。本质上,该办法应用更简单情势的回归表达式(f(x) = x + b) 和单一的参数,而不是一个项目评分和另一个项目评分间的线性回归 (f(x) = ax + b)。 该参数只不过就是两个项目评分间的均匀差值。甚至在某些实例傍边,它比线性回归的办法更正确[2],并且该算法只须要一半(甚至更少)的存储量。
如下图评分矩阵:
基于UserA对Item1与Item2的评分,以及UserB对Item1的打分,Slope One算法思惟对于UserB对于Item2的猜测评分为 2 +(1.5-1)=2.5.
从这里可以看出,Slope One的思惟是,每次只着眼两点,因为两点断定一条直线嘛,并且对于这两点Item 1与Item2,User A都经过,User B经过此中1点,Slope One思惟假设User B与User A这条直线发挥解析同一斜率:
如下图评分矩阵
要猜测Lucy对项目1的评分:
那么Lucy对于项目1的评分猜测可以基于项目1与项目2,以及项目1与项目3的两个均差值,3项线来猜测,项线几道对应均差值的权重上。也就有
rate(lucy,项目1)=((0.5+2)*2+(3+5)*1)/(2+1)=4.33
想要实现 Slope One,只须要策画并存储“n”对评分间的均匀差值和评价数量即可。
设有“n”个项目,“m”个用户,“N”个评分。策画每对评分之间的差值须要n(n-1)/2 单位的存储空间,最多须要 m*n*n步.
假设用户已经评价了最多 y 个项目, 那么策画不跨越n*n+m*y*y个项目间策画差值是可能的。
若是一个用户已经评价过“x”个项目,猜测单一的项目评分须要“x“步,而对其所有未评分项目做出评分猜测须要最多 (n-x)x 步. 当一个用户已经评价过“x”个项目时,当该用户新增一个评价时,更新数据库须要 x步。
可以经由过程分别数据(参照分别和稀少存储(没有共同评价项目标用户可以被忽视)来降落存储请求。
开源的Slope one的法度包
Python:
http://www.serpentine.com/blog/2006/12/12/collaborative-filtering-made-easy/
Java:
http://taste.sourceforge.net/
http://www.daniel-lemire.com/fr/documents/publications/SlopeOne.java
http://www.nongnu.org/cofi/
PHP:
http://sourceforge.net/projects/vogoo
http://www.drupal.org/project/cre
http://www.daniel-lemire.com/fr/documents/publications/webpaper.txt Slope one算法作者写的,简单了然。
在加倍广泛的场景中,人们并不老是能给出评分,当用户只供给二元数据(购买与否)的时辰,就无法应用Slope One 和其它基于评分的算法。然则却有一个更简单更简单的办法:Amazon的 item-to-item 专利算法
item-to-item算法是二元 item-based协同过滤应用的例子之一,该算法顶用二元向量默示用户-项目购买关系的矩阵,并策画二元向量间的cosine相干系数。
如以下应用处景:
于是,浏览项目1的顾客会被推荐买项目3,而浏览项目2的顾客会被推荐买项目3,浏览了项目3的会被推荐买1(并由1推荐2)。该模型只应用了每对项目间的一个参数(cosine相干系数)来产生推荐。是以,若是有n个项目,则须要策画和存储 n(n-1)/2次cosine相干系数。
推荐体系,协同过滤范畴,在科学研究上的一些评价指标首要有MAE,AUC,MAP,P@N,P·R·F曲线。而实际应用中还要推敲到体系伸缩性,算法错杂度,等等,那些就不说了,P·R·F指标参考我之前的一篇文章:《信息检索根蒂根基评价指标-P·R·F》
以下指标具体界定参考论文《Mining mood-specific movie similarity with matrix factorization for context-aware recommendation》及《New Approaches to Mood-based Hybrid Collaborative Filtering》
经由过程策画猜测的用户评分与实际的用户评分之间误差来怀抱。首要连络交叉验证来实现,公式如下:
(此中,g(authentic)为真实评分,g(prediction)为猜测评分,Gtest,为全部待猜测用户评分集)
MAP是信息检索中解决P·R·F指标的不足,而提出的,其规范的定义是,设P(R)为体系在召回率为R时的正确率。
单个主题的均匀正确率是每篇相干文档检索出后的正确率的均匀值。主凑集的均匀正确率(MAP)是每个主题的均匀正确率的均匀值。 MAP 是反应体系在全部相干文档上机能的单值指标。体系检索出来的相干文档越靠前(rank 越高),MAP就可能越高。
一个简单的比方就是(参考):
设有两个主题,主题1有4个相干网页,主题2有5个相干网页。某体系对于主题1检索出4个相干网页,其rank分别为1, 2, 4, 7;对于主题2检索出3个相干网页,其rank分别为1,3,5。
对于主题1,均匀正确率为(1/1+2/2+3/4+4/7)/4=0.83。
对于主题 2,均匀正确率为(1/1+2/3+3/5+0+0)/5=0.45。
则MAP= (0.83+0.45)/2=0.64。
应用与协同过滤中的衡量时,也便是测量体系返回推荐项目对应真实用户爱好偏好的排名的均匀正确率。公式如下:
此中:U为测试用户集,|U|默示用户集的数量,| Ri |默示用户 ui 相干的项目(如电影)数据, ri,j 默示体系为用户ui 推荐的第 j 个相干项目对于用户 ui 实际的偏好排名。
测量对于给定用户ui,前n推荐项目中相干项所占比率。如下公式
对于用户u,推荐机能AUC 衡量指标策画公式如下:
此中h(x)是一个指标函数,即若参数值x>0或者逻辑真,着函数值为1,不然为0,Pair(u)是一组用户u待策画的配对集值:
此中Tr(u)是练习集顶用户u已经有的项目集,Ts(u)为测试集顶用户实际预期应当被推荐的项目,实际上,这里面的 n 也就是测试集不该该被推荐的项目。AUC取值[0,1],最好的就是1了。
其实以上可以看出,AUC是相对其他正确率测度最不直接的一个,来由是AUC涉及到所有配对,包含相干的项目以及不相干的项目(那些即不呈如今练习集,也不呈如今测试集中),尽管如此,因为凡是数据集中不相干的项目比相干项目多得多,注解了AUC可以对于项目排序的变更没有那么敏感。
一些参考: