您的位置:首页 > 编程语言

推荐引擎算法学习导论

2012-01-12 19:08 393 查看

  推荐引擎算法学习导论:协同过滤、聚类、分类

作者:July。

出处:结构之法算法之道


引言

    昨日看到几个关键词:语义分析,协同过滤,智能推荐,想着想着便兴奋了。于是昨天下午开始到今天凌晨3点,便研究了一下推荐引擎,做了初步了解。日后,自会慢慢深入仔细研究(日后的工作亦与此相关)。当然,此文也会慢慢补充完善。
    本文作为对推荐引擎的初步介绍的一篇导论性的文章,将略去大部分的具体细节,侧重用最简单的语言简要介绍推荐引擎的工作原理以及其相关算法思想,且为了着重浅显易懂有些援引自本人1月7日在微博上发表的文字(特地整理下,方便日后随时翻阅),言简意赅,保证本文的短小,尽量少引用太多专业术语。不过,事与愿违的是,文章后续补充完善,越写越长了。
    同时,本文所有相关的算法都会在日后的文章一一陆续具体阐述。本文但求微言导论,日后但求具体而论。若有任何问题,欢迎随时不吝赐教或批评指正。谢谢。

1、推荐引擎原理

    推荐引擎尽最大努力的收集尽可能多的用户信息及行为,所谓广撒网,勤捕鱼,然后“特别的爱给特别的你”,最后基于相似性的基础之上持续“给力”,原理如下图所示(引自本文的参考资料之一:探索推荐引擎内部的秘密):



2、推荐引擎的分类

     推荐引擎根据不同依据如下分类:
根据其是不是为不同的用户推荐不同的数据,分为基于大众行为(网站管理员自行推荐,或者基于系统所有用户的反馈统计计算出的当下比较流行的物品)、及个性化推荐引擎(帮你找志同道合,趣味相投的朋友,然后在此基础上实行推荐);
根据其数据源,分为基于人口统计学的(用户年龄或性别相同判定为相似用户)、基于内容的(物品具有相同关键词和Tag,没有考虑人为因素),以及基于协同过滤的推荐(发现物品,内容或用户的相关性推荐,分为三个子类,下文阐述);
根据其建立方式,分为基于物品和用户本身的(用户-物品二维矩阵描述用户喜好,聚类算法)、基于关联规则的(The Apriori algorithm算法是一种最有影响的挖掘布尔关联规则频繁项集的算法)、以及基于模型的推荐(机器学习,所谓机器学习,即让计算机像人脑一样持续学习,是人工智能领域内的一个子领域)。
     关于上述第二个分类(2、根据其数据源)中的基于协同过滤的推荐:随着
Web2.0 的发展,Web 站点更加提倡用户参与和用户贡献,因此基于协同过滤的推荐机制因运而生。它的原理很简单,就是根据用户对物品或者信息的偏好,发现物品或者内容本身的相关性,或者是发现用户的相关性,然后再基于这些关联性进行推荐。
    而基于协同过滤的推荐,又分三个子类

基于用户的推荐(通过共同口味与偏好找相似邻居用户,K-邻居算法,你朋友喜欢,你也可能喜欢),
基于项目的推荐(发现物品之间的相似度,推荐类似的物品,你喜欢物品A,C与A相似,可能也喜欢C),
基于模型的推荐(基于样本的用户喜好信息构造一个推荐模型,然后根据实时的用户喜好信息预测推荐)。

    我们看到,此协同过滤算法最大限度的利用用户之间,或物品之间的相似相关性,而后基于这些信息的基础上实行推荐。下文还会具体介绍此协同过滤。

多种推荐方式结合
    在现行的 Web 站点上的推荐往往都不是单纯只采用了某一种推荐的机制和策略,他们往往是将多个方法混合在一起,从而达到更好的推荐效果。
    举个例子如Amazon中除此基于用户的推荐之外,还会用到基于内容的推荐(物品具有相同关键词和Tag):如新产品的推荐;基于项目的协同过滤推荐(喜欢A,C与A类似,可能也喜欢C):如捆绑销售and别人购买/浏览的商品。

    总之,多种推荐方式结合,加权(用线性公式(linear formula)将几种不同的推荐按照一定权重组合起来,具体权重的值需要在测试数据集上反复实验,从而达到最好的推荐效果。)、切换、分区、分层等混合。



3、协调过滤推荐

    协同过滤是利用集体智慧的一个典型方法。要理解什么是协同过滤 (Collaborative Filtering, 简称 CF),首先想一个简单的问题,如果你现在想看个电影,但你不知道具体看哪部,你会怎么做?大部分的人会问问周围的朋友,看看最近有什么好看的电影推荐,而我们一般更倾向于从口味比较类似的朋友那里得到推荐。这就是协同过滤的核心思想。
3.1、协同过滤推荐步骤
    做协同过滤推荐,一般要做好以下几个步骤:
1)若要做协同过滤,那么收集用户偏好则成了关键。可以通过用户的行为诸如评分(如不同的用户对不同的作品有不同的评分,而评分接近则意味着喜好口味相近,便可判定为相似用户),投票,转发,保存,书签,标记,评论,点击流,页面停留时间,是否购买等获得。如下面第2点所述:所有这些信息都可以数字化,如一个二维矩阵表示出来。
2)收集了用户行为数据之后,我们接下来便要对数据进行减噪与归一化操作(得到一个用户偏好的二维矩阵,一维是用户列表,另一维是物品列表,值是用户对物品的偏好,一般是 [0,1] 或者 [-1, 1] 的浮点数值)。下面再简单介绍下减噪和归一化操作:
所谓减噪:用户行为数据是用户在使用应用过程中产生的,它可能存在大量的噪音和用户的误操作,我们可以通过经典的数据挖掘算法过滤掉行为数据中的噪音,这样可以是我们的分析更加精确。
所谓归一化:将各个行为的数据统一在一个相同的取值范围中,从而使得加权求和得到的总体喜好更加精确。最简单的归一化处理,便是将各类数据除以此类中的最大值,以保证归一化后的数据取值在 [0,1] 范围中。至于所谓的加权,很好理解,因为每个人占的权值不同,类似于一场唱歌比赛中对某几个选手进行投票决定其是否晋级,观众的投票抵1分,专家评委的投票抵5分,最后得分最多的选手直接晋级。
3)找到相似的用户和物品,通过什么途径找到呢?便是计算相似用户或相似物品的相似度。
4)相似度的计算有多种方法,不过都是基于向量Vector的,其实也就是计算两个向量的距离,距离越近相似度越大。在推荐中,用户-物品偏好的二维矩阵下,我们将一个用户对所有物品的偏好作为一个向量来计算用户之间的相似度,或者将所有用户对某个物品的偏好作为一个向量来计算物品之间的相似度。

        相似度计算算法可以用于计算用户或者项目相似度。以项目相似度计算(Item Similarity Computation)为列,通性在于都是从评分矩阵中,为两个项目i,j挑选出共同的评分用户,然对这个共同用户的评分向量,进行计算相似度si,j,如下图所示,行代表项目,列代表用户(注意到是从i,j向量中抽出共有的评论,组成的一对向量,进行相似度计算):



    所以说,很简单,找物品间的相似度,用户不变,找某个用户对各个物品的评分;找用户间的相似度,物品不变,找所有用户对某个物品的评分。

5)而计算出来的这两个相似度则将作为基于用户、项目的两项协同过滤的推荐。常见的计算相似度的方法有:欧几里德距离,皮尔逊相关系数(如两个用户对多个电影的评分,采取皮尔逊相关系数等相关计算方法,可以抉择出他们的口味和偏好是否一致),Cosine相似度,Tanimoto系数。下面,简单介绍其中的欧几里得距离与皮尔逊相关系数:

    欧几里德距离(Euclidean Distance)是最初用于计算欧几里德空间中两个点的距离,假设 x,y 是 n 维空间的两个点,它们之间的欧几里德距离是:



    可以看出,当 n=2 时,欧几里德距离就是平面上两个点的距离。当用欧几里德距离表示相似度,一般采用以下公式进行转换:距离越小,相似度越大(同时,避免除数为0):



余弦相似度Cosine-based Similarity
两个项目 i ,j 视作为两个m维用户空间向量,相似度计算通过计算两个向量的余弦夹角,那么,对于m*n的评分矩阵,i ,j 的相似度sim( i , j )
计算公式:



(其中
" · "记做两个向量的内积)

皮尔逊相关系数一般用于计算两个定距变量间联系的紧密程度,为了使计算结果精确,需要找出共同评分的用户。记用户集U为既评论了
i 又评论了 j 的用户集,那么对应的皮尔森相关系数计算公式为:



   
其中Ru,i 为用户u
对项目 i 的评分,对应带横杠的为这个用户集U对项目i的评分评分。

6)相似邻居计算。邻居分为两类:1、固定数量的邻居K-neighborhoods(或Fix-size neighborhoods),不论邻居的“远近”,只取最近的 K 个,作为其邻居,如下图A部分所示;2、基于相似度门槛的邻居,落在以当前点为中心,距离为 K 的区域中的所有点都作为当前点的邻居,如下图B部分所示。



    再介绍一下K最近邻(k-Nearest Neighbor,KNN)分类算法:这是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。

7)经过4)计算出来的基于用户的CF(基于用户推荐之用:通过共同口味与偏好找相似邻居用户,K-邻居算法,你朋友喜欢,你也可能喜欢),基于物品的CF(基于项目推荐之用:发现物品之间的相似度,推荐类似的物品,你喜欢物品A,C与A相似,那么你可能也喜欢C)。

    一般来说,社交网站内如facebook宜用User CF(用户多嘛),而购书网站内如Amazon宜用Item CF(你此前看过与此类似的书比某某也看过此书更令你信服,因为你识书不识人)。 

3.2、基于项目相似度与基于用户相似度的差异

    上述3.1节中三个相似度公式是基于项目相似度场景下的,而实际上,基于用户相似度与基于项目相似度计算的一个基本的区别是,基于用户相似度是基于评分矩阵中的行向量相似度求解,基于项目相似度计算式基于评分矩阵中列向量相似度求解,然后三个公式分别都可以适用,如下图:



(其中,为0的表示未评分)

基于项目相似度计算式计算如Item3,Item4两列向量相似度;

基于用户相似度计算式计算如User3,User4量行向量相似度。
3.3、相似度计算不足与改进

    基于评分矩阵相似度计算所面临的一个性能问题,数据稀疏下,精度很差,因为相似度计算是基于寻找拥有共同用户评分的项目或者共同项目评分的用户,在数据稀疏下,两个向量中空值过多,导致计算共同评分维度过低,甚至就没有共同评分。

    对于数据稀疏性这种情况下,一个尝试的途径是进行对评分矩阵进行填充。填充规则有很多,一种通用的方法是,填充均分,具体如下两种:

基于用户均分:填充对应用户的平均打分

基于项目均分:基于对应项目的平均打分


 
         


          (基于用户均分填充)                                       (基于项目均分填充)

 4、Slope One算法

    为了大大减少过适的发生,提升算法简化实现, Slope One 系列易实现的Item-based协同过滤算法被提了出来。本质上,该方法运用更简单形式的回归表达式(f(x) = x + b) 和单一的自由参数,而不是一个项目评分和另一个项目评分间的线性回归 (f(x) = ax + b)。 该自由参数只不过就是两个项目评分间的平均差值。甚至在某些实例当中,它比线性回归的方法更准确 ,而且该算法只需要一半(甚至更少)的存储量。
基本原理

    如下图评分矩阵:



    基于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的评分:



项目1与项目2间的均差值(5-3)+(3-4)/2 =0.5,(John线与Mark线)
项目1与项目3间的均差值(5-2)/1 =3(John线)

    那么Lucy对于项目1的评分预测可以基于项目1与项目2,以及项目1与项目3的两个均差值,3项线来预测,项线几道对应均差值的权重上。也就有rate(lucy,项目1)=((0.5+2)*2+(3+5)*1)/(2+1)=4.33想要实现 Slope One,只需要计算并存储“n”对评分间的平均差值和评价数目即可。

5、Amazon的item-to-item专利算法

在更加普遍的场景中,人们并不总是能给出评分,当用户只提供二元数据(购买与否)的时候,就无法应用Slope One 和其它基于评分的算法。但是却有一个更简单更简单的方法:Amazon的 item-to-item 专利算法

item-to-item算法是二元 item-based协同过滤应用的例子之一,该算法中用二元向量表示用户-项目购买关系的矩阵,并计算二元向量间的cosine相关系数。

如以下应用场景:



在本例当中,项目1和项目2间的cosine相关系数为:


项目1和项目3间的cosine相关系数为:


而项目2和项目3的cosine相关系数为:


    于是,浏览项目1的顾客会被推荐买项目3,而浏览项目2的顾客会被推荐买项目3,浏览了项目3的会被推荐买1(并由1推荐2)。该模型只使用了每对项目间的一个参数(cosine相关系数)来产生推荐。因此,如果有n个项目,则需要计算和存储 n(n-1)/2次cosine相关系数。

6、聚类算法

    聚类聚类,通俗的讲,即所谓“物以类聚,人以群分”。聚类 (Clustering) 是一个数据挖掘的经典问题,它的目的是将数据分为多个簇 (Cluster),在同一个簇中的对象之间有较高的相似度,而不同簇的对象差别较大。

6.1、K 均值聚类算法

    K-均值(K-Means)聚类算法与处理混合正态分布的最大期望算法很相似,因为他们都试图找到数据中自然聚类的中心。此算法假设对象属性来自于空间向量,目标是使各个群组内部的均方误差总和最小。

  K均值聚类算法首先会随机确定K个中心位置(位于空间中代表聚类中心的点),然后将各个数据项分配给最临近的中心点。待分配完成之后,聚类中心就会移到分配给该聚类的所有节点的平均位置处,然后整个分配过程重新开始。这一过程会一直重复下去,直到分配过程不再产生变化为止。下图是包含两个聚类的K-均值聚类过程:



    以下代码所示即是此K-均值聚类算法的python实现:

//K-均值聚类算法    
import random    
    
def kcluster(rows,distance=pearson,k=4):    
  # 确定每个点的最小值和最大值    
  ranges=[(min([row[i] for row in rows]),max([row[i] for row in rows]))     
  for i in range(len(rows[0]))]    
    
  # 随机创建k个中心点    
  clusters=[[random.random()*(ranges[i][1]-ranges[i][0])+ranges[i][0]     
  for i in range(len(rows[0]))] for j in range(k)]    
      
  lastmatches=None    
  for t in range(100):    
    print 'Iteration %d' % t    
    bestmatches=[[] for i in range(k)]    
        
    # 在每一行中寻找距离最近的中心点    
    for j in range(len(rows)):    
      row=rows[j]    
      bestmatch=0    
      for i in range(k):    
        d=distance(clusters[i],row)    
        if d<distance(clusters[bestmatch],row): bestmatch=i    
      bestmatches[bestmatch].append(j)    
    
    # 如果结果与上一次相同,则整个过程结束    
    if bestmatches==lastmatches: break    
    lastmatches=bestmatches    
        
    # 把中心点移到其所有成员的平均位置    
    for i in range(k):    
      avgs=[0.0]*len(rows[0])    
      if len(bestmatches[i])>0:    
        for rowid in bestmatches[i]:    
          for m in range(len(rows[rowid])):    
            avgs[m]+=rows[rowid][m]    
        for j in range(len(avgs)):    
          avgs[j]/=len(bestmatches[i])    
        clusters[i]=avgs    
      
  # 返回k组序列,其中每个序列代表一个聚类        
  return bestmatches    

    k-Means是一种机器学习领域中的一种监督学习。下面,简要介绍下监督学习与无监督学习:
监管学习的任务是学习带标签的训练数据的功能,以便预测任何有效输入的值。监管学习的常见例子包括将电子邮件消息分类为垃圾邮件,根据类别标记网页,以及识别手写输入。创建监管学习程序需要使用许多算法,最常见的包括神经网络、Support Vector Machines (SVMs) 和 Naive Bayes 分类程序。
无监管学习的任务是发挥数据的意义,而不管数据的正确与否。它最常应用于将类似的输入集成到逻辑分组中。它还可以用于减少数据集中的维度数据,以便只专注于最有用的属性,或者用于探明趋势。无监管学习的常见方法包括 k-Means、分层集群和自组织地图。
6.2、Canopy 聚类算法 

    Canopy 聚类算法的基本原则是:首先应用成本低的近似的距离计算方法高效的将数据分为多个组,这里称为一个 Canopy,我们姑且将它翻译为“华盖”,Canopy 之间可以有重叠的部分;然后采用严格的距离计算方式准确的计算在同一 Canopy 中的点,将他们分配与最合适的簇中。Canopy 聚类算法经常用于 K 均值聚类算法的预处理,用来找合适的 k 值和簇中心。

6.3、模糊 K 均值聚类算法 

        模糊 K 均值聚类算法是 K 均值聚类的扩展,它的基本原理和 K 均值一样,只是它的聚类结果允许存在对象属于多个簇,也就是说:它属于我们前面介绍过的可重叠聚类算法。为了深入理解模糊
K 均值和 K 均值的区别,这里我们得花些时间了解一个概念:模糊参数(Fuzziness Factor)。

    与 K 均值聚类原理类似,模糊 K 均值也是在待聚类对象向量集合上循环,但是它并不是将向量分配给距离最近的簇,而是计算向量与各个簇的相关性(Association)。假设有一个向量 v,有 k 个簇,v 到 k 个簇中心的距离分别是 d1,d2⋯ dk,那么 V 到第一个簇的相关性 u1可以通过下面的算式计算:



    计算 v 到其他簇的相关性只需将 d1替换为对应的距离。从上面的算式,我们看出,当 m 近似 2 时,相关性近似 1;当 m 近似 1 时,相关性近似于到该簇的距离,所以 m 的取值在(1,2)区间内,当 m 越大,模糊程度越大,m 就是我们刚刚提到的模糊参数。

    其余聚类算法本文不再介绍。关于冷启动、数据稀疏、可扩展性、可移植性、可解释性、多样性、推荐信息的价值等问题则待后续阐述。

7、分类算法

    接下来,分类算法有很多,本文介绍决策树学习,与贝叶斯定理。

7.1、决策树学习

    咱们直接切入正题。所谓决策树,顾名思义,是一种树,一种依托于策略抉择而建立起来的树。

    机器学习中,决策树是一个预测模型;他代表的是对象属性与对象值之间的一种映射关系。树中每个节点表示某个对象,而每个分叉路径则代表的某个可能的属性值,而每个叶结点则对应从根节点到该叶节点所经历的路径所表示的对象的值。决策树仅有单一输出,若欲有复数输出,可以建立独立的决策树以处理不同输出。

    从数据产生决策树的机器学习技术叫做决策树学习, 通俗说就是决策树。

    来理论的太过抽象,下面举两个浅显易懂的例子:

    第一个例子:通俗来说,决策树分类的思想类似于找对象。现想象一个女孩的母亲要给这个女孩介绍男朋友,于是有了下面的对话:

      女儿:多大年纪了?

      母亲:26。

      女儿:长的帅不帅?

      母亲:挺帅的。

      女儿:收入高不?

      母亲:不算很高,中等情况。

      女儿:是公务员不?

      母亲:是,在税务局上班呢。

      女儿:那好,我去见见。

      这个女孩的决策过程就是典型的分类树决策。相当于通过年龄、长相、收入和是否公务员对将男人分为两个类别:见和不见。假设这个女孩对男人的要求是:30岁以下、长相中等以上并且是高收入者或中等以上收入的公务员,那么这个可以用下图表示女孩的决策逻辑:



    也就是说,决策树的简单策略就是,好比公司招聘面试过程中筛选一个人的简历,如果你的条件相当好比如说清华博士毕业,那么二话不说,直接叫过来面试,如果非重点大学毕业,但实际项目经验丰富,那么也要考虑叫过来面试一下,即所谓具体情况具体分析、决策。

    第二个例子来自Tom M.Mitchell著的机器学习一书:

    小王的目的是通过下周天气预报寻找什么时候人们会打高尔夫,他了解人们决定是否打球的原因最主要取决于天气情况。而天气状况有晴,云和雨;气温用华氏温度表示;相对湿度用百分比;还有有无风。如此,我们便可以构造一棵决策树,如下(根据天气这个分类决策这天是否合适打网球):



    上述决策树对应于以下表达式:(Outlook=Sunny ^Humidity<=70)V (Outlook = Overcast)V (Outlook=Rain ^ Wind=Weak)。
基本的决策树学习算法

ID3算法

    从信息论知识中我们直到,期望信息越小,信息增益越大,从而纯度越高。ID3算法的核心思想就是以信息增益度量属性选择,选择分裂后信息增益最大的属性进行分裂。该算法采用自顶向下的贪婪搜索遍历可能的决策树空间。

     所以,ID3的思想便是:
自顶向下构造决策树;
从“哪一个属性将在树的根节点被测试”开始;
使用统计测试来确定每一个实例属性单独分类训练样例的能力。分类能力最好的属性作为树的根结点测试。
然后为根结点属性的每个可能值产生一个分支,并把训练样例排列到适当的分支(也就是说,样例的该属性值对应的分支之下)。
重复这个过程,用每个分支结点关联的训练样例来选取在该点被测试的最佳属性。

这形成了对合格决策树的贪婪搜索,也就是算法从不回溯重新考虑以前的选择。

    下图所示即是用于学习布尔函数的ID3算法概要:



哪个属性是最佳的分类属性

1、信息增益  

    上述的ID3算法的核心问题是选取在树的每个结点要测试的属性。我们希望选择的是最有利于分类实例的属性,信息增益(Information Gain)是用来衡量给定的属性区分训练样例的能力,而ID3算法在增长树的每一步使用信息增益从候选属性中选择属性。

    我们用熵度量样例的均一性,熵刻画了任意样例集的纯度,如果给定包含关于某个目标概念的正反样例的样例集S,那么S相对这个布尔型分类的熵为:



    上述公式中,p+代表正样例,比如去打羽毛球,而p-则代表反样例,不去打球。

    举例来说,假设S是一个关于布尔概念的有14个样例的集合,它包括9个正例和5个反例(我们采用记号[9+,5-]来概括这样的数据样例),那么S相对于这个布尔样例的熵为:

Entropy([9+,5-])=-(9/14)log2(9/14)-(5/14)log2(5/14)=0.940。

    同时,根据上述这个公式,我们可以得到:S的所有成员属于同一类,Entropy(S)=0; S的正反样例数量相等,Entropy(S)=1;S的正反样例数量不等,熵介于0,1之间,如下图所示:



    信息论中对熵的一种解释,熵确定了要编码集合S中任意成员的分类所需要的最少二进制位数。更一般地,如果目标属性具有c个不同的值,那么S相对于c个状态的分类的熵定义为:



2、信息增益度量期望的熵降低

    属性的信息增益,由于使用这个属性分割样例而导致的期望熵降低,Gain(S,A)是在知道属性A的值后可以节省的二进制位数,Gain(S,A)的计算公式如下:



    运用在本文开头举得第二个根据天气情况是否决定打羽毛球的例子上,得到的最佳分类属性如下图所示:



     在上图中,计算了两个不同属性:湿度(humidity)和风力(wind)的信息增益,最终humidity这种分类的信息增益0.151>wind增益的0.048。说白了,就是在星期六上午是否适合打网球的问题诀策中,采取humidity较wind作为分类属性更佳,决策树由此而来。

ID3算法决策树的形成

    OK,下图为ID3算法第一步后形成的部分决策树。这样综合起来看,就容易理解多了。1、overcast样例必为正,所以为叶子结点,总为yes;2、ID3无回溯,局部最优,而非全局最优,还有另一种树后修剪决策树。下图是ID3算法第一步后形成的部分决策树:



7.2、贝叶斯分类的基础:贝叶斯定理

   贝叶斯定理:已知某条件概率,如何得到两个事件交换后的概率,也就是在已知P(A|B)的情况下如何求得P(B|A)。这里先解释什么是条件概率:

      

表示事件B已经发生的前提下,事件A发生的概率,叫做事件B发生下事件A的条件概率。其基本求解公式为:



      贝叶斯定理之所以有用,是因为我们在生活中经常遇到这种情况:我们可以很容易直接得出P(A|B),P(B|A)则很难直接得出,但我们更关心P(B|A),贝叶斯定理就为我们打通从P(A|B)获得P(B|A)的道路。

      下面不加证明地直接给出贝叶斯定理:

      


8、推荐实例扩展

8.1、阅读推荐

    先来看一段文字(摘自36krhttp://www.36kr.com/p/75415.html):

”北京十分科技也非常看好阅读推荐类的应用,他们花了非常大的精力(一年60人团队),才在今天推出了iPhone 版“酷云阅读”(App
Store 下载地址)。

为什么要投入这么多人去做这个阅读应用?CEO 李鹏告诉我,这个团队超过一半的人都在做后台相关的东西,包括语义分析、机器学习等算法。他们的目的是将互联网“语义化”以后,把人的兴趣明确,最后把每个人感兴趣的内容推荐给相关的人。在iPhone 上,酷云的大致做法和Zite iPad 版类似,用户的行为也是有“喜欢”、“不喜欢”,以及点击相应的媒体来源或者相关的标签来告诉酷云你希望以后看到更多这些内容。

这个目的是大部分阅读推荐应用都有的,但是酷云的做法似乎更加变态。他们除了每天要抓取来自互联网的超过10万篇文章之外,还对全国200个的电视台播出的视频内容进行了索引,以便用户也可以通过文字搜索出视频、以及对视频内容进行一样的推荐。大致做法是先把这些节目都录制下来,然后把声音转文字,最后建立摘要和索引。“

    我对上面的那句:先把这些视频节目都录制下来,然后把声音转文字有点疑问。我们已经知道如果是音乐的话像豆瓣FM可能是如下的做法:
你喜欢一些歌曲,而我也喜欢一些歌曲,如果你我喜欢的歌曲中有很多是重复类似的,则系统会把你我定义为好友,即相似用户,基于用户的协同过滤推荐:朋友喜欢,你也可能喜欢 ;

还有一个就是针对歌曲的推荐,你喜欢一首歌曲A,而另一首歌曲B与歌曲A类似(如都是有关爱情、感伤一类的),所以系统猜测你也可能喜欢B,而把B推荐给你。这就是基于项目(物品)的协同过滤推荐。
    根据所听歌曲的重复类似判定为好友从而基于用户的协同过滤进行推荐,通过某些歌曲是差不多类似的来基于项目的协同过滤进行推荐,但问题出来了,重复的好说,同一首歌曲同一个歌手嘛,可那些相似音乐歌曲又如何定义判定呢?通过系统去分析歌曲的频谱?区别各个歌曲节奏的快慢,音频?此举虽然看起来有效,但实际实行起来不太现实。
    我觉得应该是为那些音乐打上标签tag(估计视频也是这么做的,便于日后查找索引。全视频的实录目前觉得还是不靠谱),如打上“爱情”“感伤”一类的tag,而后tag相同的则可判定为相似歌曲。但关键是怎么打?语音识别?

8.2、标签tag怎么打

    初期可以人肉,爬虫,买数据库,等流量上来了,可以考虑ugc。所谓ugc,用户产生内容。但是用户一般不太可能自己给音乐打标签,太繁琐了(如最近的新浪微博的每条微博内容下多了一个“加标签”的提示,但有多少用户愿去理它呢?),当然有的系统也会为你自动产生一些标签tag(当然,你也可以自行加上一些标签),如新浪博客:



 
  如何做到的呢?我的想法是,

应该是系统在背后扫描你的文章一遍,然后提取一些关键词作为tag,供你选择。取哪些关键词呢?当然是取高频词。扫描整篇文章,统计每个单词出现的频率。
然后取其前TOP K,如上面截图中的“算法”在那篇文章中出现了4次,“博客”出现了3次,所以系统为你自动匹配这些标签。
至于采取何种数据结构或方法来统计这些关键词的频率呢。一般的应用hash+堆(十一、从头到尾彻底解析Hash表算法),或trie树(从Trie树谈到后缀树)均可。但当trie树面对的是汉字中文的时候,就比较麻烦了。所以hash+堆是比较理想的选择。

    同样,针对视频的话,应该也是类似的:1、通过系统或机器读取视频内容,把视频转换为文字,然后提取其中频率出现高的关键词(如何提取关键词呢,这就涉及到一个关键问题了:分词。本blog日后阐述),把提取出来的这些关键词作为此视频的标签tag;2、然后针对这些tag建立索引摘要(什么样的索引?倒排索引。至于什么是倒排索引,参考编程艺术第二十四章:第二十三、四章:杨氏矩阵查找,倒排索引关键词Hash不重复编码实践),最终方便于日后用户或系统的查找(此节系与编程艺术内的朋友讨论整理总结而出)。
    具体细节后续阐述。

9、参考文献

本人1月7日的发表的微博(挂在本blog左侧边栏);

探索推荐引擎内部的秘密,作者:赵晨婷,马春娥;

集体智慧编程,TobySeganra著。
推荐系统之协同过滤概述
http://www.cnblogs.com/leoo2sk/
Mitchell, Tom M. Machine Learning.
McGraw-Hill, 1997. http://zh.wikipedia.org/wiki/%E5%86%B3%E7%AD%96%E6%A0%91。 http://www.36kr.com/p/75415.html

后记

    英雄召集令:如果哪位朋友以前搞过推荐或者检索的,或者机器学习,数据挖掘,海量数据处理,搜索与推荐引擎任一一个领域的的请一定联系我,可随时留言或评论,或微博私信,或Email:zhoulei0907@yahoo.cn。有过大型网站建设经验的,或者编程经验丰富老道的更欢迎随时联系我。和本blog相关的文件随时免费赠送技术知己。

    旧的一年已过去,新的一年已到来。编程艺术室内,Algorithms1~17群系列,程序员技术联盟的朋友与我祝本blog的所有读者朋友们(不论是老读者,还是新读者)元旦快乐,2012年新年快乐。同时,在上一篇文章中已说过:“近几日后,准备编程艺术室内38位兄弟的靓照和blog或空间地址公布在博客内,给读者一个联系他们的方式,顺便还能替他们征征友招招婚之类的(有的除外)”。下面贴一下编程艺术室内的部分朋友们的微博或主页(排名不分先后):

    BigPotato:http://weibo.com/bigpotatoc;ys:http://weibo.com/yanshazi;上善若水qin.yusen:http://www.renren.com/240148123/profile;梦想天窗:http://weibo.com/dirichlet09;时间飘过:http://weibo.com/weedge;well:http://t.qq.com/fairywell28;飞羽:http://weibo.com/jxtsung;...

    最后,本blog成为过去一年2011年csdn blog年排行榜第一位:http://blog.csdn.net/ranking.html,及csdn Fedd订阅排行榜TOP100前十:http://www.feedsky.com/feeds/topsub_csdn.html,如下图左右部分所示:





    感谢本blog的所有读者。文章只是初步成型,还看到了很多的问题、漏洞亟待完善。读者若发现本文或本blog中任何问题或错误,恳请随时不吝指正。万分感谢。完。July、2011.01.12。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息