KDF000 2010-12-11
上次大概地介绍了一下现在常用的推荐算法,下面来介绍两种比较优化的算法。
Apriori算法
关联规则挖掘发现大量数据中项集之间有趣的关联或相关联系。它在数据挖掘中是一个重要的课题,最近几年已被业界所广泛研究。
经典的频集算法:Agrawal等于1994年提出了一个挖掘顾客交易数据库中项集间的关联规则的重要方法,其核心是基于两阶段频集思想的递推算法。该关联规则在分类上属于单维、单层、布尔关联规则。所有支持度大于最小支持度的项集称为频繁项集,简称频集。
算法的基本思想:首先找出所有的频集,这些项集出现的频繁性至少和预定义的最小支持度一样。然后由频集产生强关联规则,这些规则必须满足最小支持度和最小可信度。挖掘关联规则的总体性能由第一步决定,第二步相对容易实现。
Apriori核心算法
为了生成所有频集,使用了递推的方法。其核心思想简要描述如下:
L1 = {large 1-itemsets}; for (k=2; Lk-1¹F; k++) do begin Ck=apriori-gen(Lk-1); //新的候选集 for all transactions tÎD do begin Ct=subset(Ck,t); //事务t中包含的候选集 for all candidates cÎ Ct do c.count++; end Lk={cÎ Ck |c.count³minsup} end Answer=∪kLk;
首先产生频繁1-项集L1,然后是频繁2-项集L2,直到有某个r值使得Lr为空,这时算法停止。这里在第k次循环中,过程先产生候选k-项集的集合Ck,Ck中的每一个项集是对两个只有一个项不同的属于Lk-1的频集做一个(k-2)-连接来产生的。Ck中的项集是用来产生频集的候选集,最后的频集Lk必须是Ck的一个子集。Ck中的每个元素需在交易数据库中进行验证来决定其是否加入Lk,这里的验证过程是算法性能的一个关键点。
协同过滤(CollaborativeFiltering)算法
协同过滤的出现为进一步提高信息服务质量提供了一个新的思路。协同过滤,又称社会过滤(SocialFiltering),其基本思想十分直观:在日常生活中,人们往往会根据亲朋好友的推荐来做出一些选择(购物、阅读、音乐..)。协同过滤系统就是将这一思想运用到网络信息服务(信息推荐)中,基于其他用户对某一信息的评价来向某一用户进行推荐。通常,系统选取与指定用户有相似兴趣的用户作为参考对象。而如何定义用户相似性以及如何选取参考用户群正是协同过滤算法研究的重点。
与传统文本过滤相比,协同过滤有下列优点:
1.能够过滤难以进行机器自动内容分析(Content_based)的信息。像艺术品、音乐。
2.共享其他人的经验,避免了内容分析的不完全和不精确,并且能够基于一些复杂的,
难以表述的概念(如信息质量、品味)进行过滤。
3.可以有效的使用其他相似用户的反馈信息,减少用户的反馈量,加快个性化学习的
4.具有推荐新信息的能力(serendipitousrecommendations)。
正因为此,在Goldberg等人在其设计的邮件过滤系统中初步应用了协同过滤的思想(这可以说是最早的协同过滤系统)之后,各种研究协同过滤的实验系统纷纷出现。像GroupLens:过滤网上新闻的系统;Ringo:推荐音乐的系统;VideoRecommender和MovieLens:推荐电影的系统;Jester:推荐笑话的系统。越来越多的在线商家,包括Amazon.com、CDNow.com和Levis.com,都使用了协同过滤技术向顾客推荐产品。由微软研究院开发的协同过滤工具已被集成在微软的CommerceServer1产品中,并被许多站点使用了。
协同过滤的基本出发点是:
1.用户是可以按兴趣分类的;
2.用户对不同的信息评价包含了用户的兴趣信息;
3.用户对一未知信息的评价将和其相似(兴趣)用户的评价相似。
这三条构成了协同过滤系统的基础。
协同过滤的实现一般分为两步:首先,获得用户信息(用户对某些信息条目的评价或者打分);其次,分析用户之间相似度,预测特定用户对某一信息的喜好。上面提到的解决协同过滤不足的两条途径正是对应着这两步。
对于协同过滤一个直观的描述是:将用户和信息条目构成一个矩阵:用户—信息条目的
兴趣矩阵。
谍中谍007星球大战泰坦尼克张三244?李四?224王五3??4赵六32?4
矩阵中已有的值是用户对相应信息条目的评价,未知值正是需要系统给出的预测。协同过滤的过程就是根据已知值来预测未知值(一个填空过程)。协同过滤系统所应用的算法就是这一填空过程所遵循的规则,规则与实际规律越符合,预测的未知值就越准,信息过滤的效果就会越好。需要注意的是,实际中,这样的矩阵是一个极为稀疏的矩阵。因为每一个用户一般只会对所有信息条目中很少一部分有评价。这一点在设计算法,分析算法优劣上都很重要。