虽然可能没有对机器学习等方面进行很深入的研究,但是大多数的算法我都多多少少的有些接触。在本书的第二章里面,直接讲解的是一个实例:推荐。这个是我在很多面试过程中都问到过的问题,比如说问通常认为推荐是怎么做的。以前我也是对亚马逊的推荐系统有所了解,而且也经过了一些的观察。总结起来比如说“协同过滤”,这个有点像是社会化推荐,然后是基于物体本体的推荐等等。但是都没有很深入的了解过,只是很笼统的知道有这么个东西。
即将以一个根据群体偏好来为人们提供推荐的系统来开始集体智慧之旅。这个应用都是很广的,比如图书、商品、热门网站的推荐等,需要用一个方法寻找到和你有相同品味的人,并且根据他们来对你进行推荐。在淘宝上面,通常都会对一些新人有一些类似于调查问卷的东西,并且通过积分来进行鼓励填写。为什么会有这些呢?一个很大的原因就是设计一个调查问卷,并且根据这个调查问卷的结果,就能够知道你的购买习惯、消费习惯等等。这就是数据的收集过程,根据这些数据,系统会给你推荐一些商品。常常抱怨系统推荐不准确,也许就是因为你在填写这个问卷的时候的不认真造成的。还有一些是你不注意就被收集了,比如你买了东西之后的打分、评论等等。这种显式的调查当然很好,但是还有很大的一部分都是隐式的被收集的。比如你浏览的网页,你购买的历史等等。
协作过滤
想象一下,你在购买一个未知商品的时候,认为最有效的是什么?询问你的朋友,让他们告诉你这个商品的信息。但是我们在询问的时候,知道朋友的品位都是不同的,所以更需要的是询问一些和你有相同品位的人。协作过滤技术,通俗来讲,就是从一大群人中进行搜索,找出与你品位相同的以小群人,然后对这些人进行考察,并最终得出一个列表。
搜集偏好
这个类似于机器学习中一个很重要的部分,就是特征抽取。表达偏好的方式很多,最常用的一种就是打分。那么你想了解一个人的偏好,一个很好的办法就是给他一些电影,让他看,然后让他对电影进行打分。自己也对这些电影进行打分,然后根据你们对这些电影的打分情况,来进行距离的计算。
寻找相近用户
搜集数据之后,需要一种方法来确定人们在品位方面的相似度。这里需要计算的是人的相似度,通常需要将每个人的定位在一个表示空间中定位出来。这里空间有两个方式,一个以这些电影来作为空间,这个很好理解,每个电影假设代表的就是人在一个方面的偏好,那么这样就形成了一个偏好空间,人可以看成是其中的一点。那么在计算的两个人的相似度的时候,很直观的想法就是计算这两个人在这个空间中的欧几里德距离。另外一个方法是相对不容易理解的,叫做皮尔逊相关度评价。这个方法的表示空间是人,那么每个电影在这个空间中就定位到一个点。为了便于理解,考虑只有两个电影的情况,那么这个空间就是一个平面的,每个人在这个平面上就是一点。试想一下,如果你们两个品位相同,那么你们对于一个影片的评价通常会同时增长或者同事下降,那么对所有的影片来说,他们应该是在一条直线上面,所以也叫做“最佳直线拟合”。一种理想的情况就是,如果你们两个对影片的品位完全相同,那么这个直线将是一个对角线。这个方法的一个优点是,他修正了一些“夸大分值”的情况。比如说,有的人虽然品位和你相同,但是他通常不是那么的严格,也就是他通常会对影片给与一个更高的分数。如果是采用欧几里得方法,那么你们两个会变得不同。但是用皮尔逊方法就能够避免,只要你们能够拟合一条直线。
推荐物品
找到了这些和你有相同品位的人之后的一个工作就是推荐物品了。一个简单的想法就是通过他们喜欢的东西来对你进行推荐,但是这样显得比较的随意。在排序中,还是需要一种权值计算方法。上一步中我们知道了每个人和你的相似度,那么这个相似度乘以他对于某个影片的评价,就可以看作他对这个影片推荐的贡献度。那么这样的话,和你最相近的人会贡献更大的分数,这是合理的。但是这样还有一个问题是,一个影片的推荐得分和评论的人数有关,所以还需要除以有这些推荐了的人的相似度之和。这样就得到了对于每个影片的根据和你有相同品位的人的推荐分数。
匹配商品
另外一个问题是:想知道和本商品相似的商品。通常这个能够解决在网站初期“零数据”的尴尬,这样通常只能推荐一些相似的商品给你。上面我们知道了怎样计算两个人的相似度,通过他们对某些影片的评价。那么将影片和人的位置对调,也就是为了计算商品的相似度,我们需要知道对于每件商品,有那些人对其进行了打分,以及相应的分值。这样就能够根据前面的方法来进行相似度计算了。
这样,对于推荐的一个基本的框架就形成了。可以借助于del.icio.us的数据来做实验,你会得到惊喜的。