在Lesleyc上贴(见“请教序列聚类算法”)以前,我对协同过滤技术并没有太多的了解,他的问题引起了我的兴趣。正好工作中也碰到了一个类似的问题。于是读了些东西,也动手实践了一下。尽管我的数据量很小,不可以和Lesleyc的数据相比。
对于协同过滤,大家恐怕都不陌生。协同过滤,是网上商店普遍使用的技术。亚马逊,netflex等企业在协同技术的应用上做出了突出的成绩。亚马逊还为此申请了一个专利。国内的一些电子商务企业也采用了协同过滤技术,如当当网,China-Pub,还有年轻人比较熟悉的八音盒,豆瓣网。八音盒的创立者写了一篇介绍协同过滤的文章,有兴趣的朋友可以找来看看。
协同过滤在商务领域所要解决的问题,是建立一个“推荐”系统。一旦客户“走”进你的店面,你就能主动地把他可能需要的货呈送上来,加以推荐介绍,供其挑选。旧时店铺的伙计都有这个本事,只要熟客,比如A,进了门,伙计就能八九不离十,猜出A想买点什么,店里有什么新到货色可以向客人推荐。也就是说,伙计的心里装有这样一个推荐系统。这套系统靠两条关键信息运行:一是A的消费习惯,二是和A同属一类客户的购买情况。到了电子商务时代,涌来成千上万的虚拟客户,再靠面对面的接触不行了,这就需要一套新的方法 - 协同过滤。但协同过滤的基本原理仍然和街头小店的伙计掌握的那套系统没什么两样:依赖对客户的了解。
协同过滤技术要点:
数据:客户对电影的评分 (设M个客户,N部电影)
目标:预测客户U 是否喜欢电影M
有两种解决方案,基于用户和基于内容项。
基于用户。寻找k个和U“同好”的客户,把他们对M的评分(简单平均或加权平均)作为U对M的评分预测。同好,指从历史数据发现大家对各部电影的评分接近(客户I喜欢的电影U也喜欢、I不喜欢的U也不喜欢。I和U的评分相关性高)。
基于内容项。寻找k个和M相近的电影,把U对它们的评分(简单平均或加权平均)作为U对M的可能评分。相近,指根据历史数据发现的客户评分一致性(喜欢电影L的客户也喜欢M,不喜欢L的客户也不喜欢M。即电影L和M的客户相关系数高。说得更通俗一点,L的粉丝就是M的粉丝)
乍一看,上面两种技术的区别不容易分别。这里关键的一点是基于用户的解决方案注重和U同好的客户,而基于内容项的解决方案找的是和M相关的电影。后一种解决方案在实质上也是在观察客户评分的接近程度。但是这种观察只是就两部电影而言(M和其它所有电影中的每一部)。而基于用户的解决方案是要看客户在“所有”电影评分上的吻合程度。 例如,假设客户T仅仅是在一部电影上评分和U相近,而其它99部电影都截然不同,T对M的评分也要进入基于内容项的推荐。但我们知道,T和U绝对不能算是同好。
因为基于内容项的协同过滤不考虑客户是“谁”,不考虑客户间的系统差别,所以总的来说,基于内容项的推荐系统的精度较差。但是,这种技术有其独具的优点,一是计算速度比较快,尤其是在用户多于内容项的情况下。二是基于用户的解决方案需要用户的历史数据,并且要求在客户登陆时能够对其进行 “识别”。而如果我们前面提到的客户U恰好是一个新客户,没有任何历史数据,我们就无从发现他的“同好”。
以上两种方法统称为“基于记忆(Memory based)”的协同过滤技术。对用户,或内容项进行协同的指标有泊松相关系数,cosine similarity, 等。
瓶颈:数据稀疏(无交集)、扩展性不好(难以处理大数据量,影响实时结果)。
因此发展出“基于模型(model based)”的协同过滤技术。
(下一次谈基于模型的协同过滤技术。基于模型的技术同样可以分为基于用户和基于内容项两种解决方案。两者还可以进一步结合,新的方案各取所长)