基于欧几里德距离的推荐功能实现思路(向量空间)

  今天下午我和内助看了YouTube电影速看,一部2小时的电影用9分钟就能看完,影片播放完毕自动推荐特征相信的速看电影,真的很合我们的口味,如此智能的一个功能,究竟是如何实现的呢?
接下来,我就简单介绍两种思路的实现方法。

1. 基于相似用户做推荐

基于欧几里德距离的推荐功能实现思路(向量空间)

  我用“1”表示“喜爱”,用“0”笼统地表示“不发表意见”。从图中我们可以看出,你跟小明共同喜爱的电影最多,有 5 部。
  我们只需要遍历所有的用户,对比每个用户跟你共同喜爱的电影个数,并且设置一个阈值,如果你和某个用户共同喜爱的电影个数超过这个阈值,我们就把这个用户看作跟你口味相似的用户,把这个用户喜爱但你还没看过的电影,推荐给你。
  不过,刚刚的这个解决方案中有一个问题,我们如何知道用户喜爱哪部电影呢?也就是说如何定义用户对某部电影的喜爱程度呢?


喜爱程度(受欢迎程度)
  实际上,我们可以通过用户的行为,来定义这个喜爱程度。我们给每个行为定义一个得分,得分越高表示喜爱程度越高。
基于欧几里德距离的推荐功能实现思路(向量空间)

  还是刚刚那个例子,我们如果把每个人对每部电影的喜爱程度表示出来,就是下面这个样子。图中,某个人对某部电影是否喜爱,我们不再用“1”或者“0”来表示,而是对应一个具体的分值。
基于欧几里德距离的推荐功能实现思路(向量空间)
  显然,我们不能再像之前那样,采用简单的计数来统计两个用户之间相似度,这里的相似度度量,我们可以使用另外一个距离,那就是“欧几里得距离”。欧几里得距离是用来计算两个向量之间的距离的。
  现在解释一下概念中的两个关键词,向量和距离。
  一维、二维、三维应该都不难理解,那更高维中的某个位置该如何表示呢?
类比一维、二维、三维的表示方法,K 维空间中的某个位置,我们可以记作(k1,k2,k3,……,kn)。这种表示方法就是向量(vector)。我们知道,二维、三维空间中,两个位置之间有距离的概念,类比到高纬空间,同样也有距离的概念,这就是我们说的两个向量之间距离。
  那如何计算两个向量之间的距离呢?我们还是可以类比到二维、三维空间中距离的计算方法。通过类比,我们就可以得到两个向量之间距离的计算公式。这个计算公式就是欧几里得距离的计算公式:
基于欧几里德距离的推荐功能实现思路(向量空间)

基于欧几里德距离的推荐功能实现思路(向量空间)
  从图中的计算可以看出,小明与你的欧几里得距离距离最小,也就是说,你俩在高维空间中靠得最近,所以,我们就断定,小明跟你的口味最相似。

2. 基于相似电影做推荐

  如果某个电影跟你喜爱的电影相似,我们就把它推荐给你。
  如何判断两部电影是否相似呢?对于人来说,这个事情可能会比较简,但是对于计算机来说,判断两部电影是否相似,那就需要通过量化的数据来表示了。我们应该通过什么数据来量化两部电影之间的相似程度呢?
  最容易想到的是,我们对歌曲定义一些特征项,比如是伤感的还是愉快的,是军事还是科幻 ,是小说的还是感情的等等。类似基于相似用户的推荐方法,我们给每部电影的每个特征项打一个分数,这样每部电影就都对应一个特征项向量。我们可以基于这个特征项向量,来计算两部电影之间的欧几里得距离越小,表示两部电影的相似程度越大。
  但是,要实现这个方案,需要有一个前提,那就是我们能够找到足够多,并且能够全面代表歌曲特点的特征项,除此之外,我们还要人工给每部电影标注每个特征项的得分。对于收录了海量电影的 YouTuBe 来说,这显然是一个非常大的工程。此外,人工标注有很大的主观性,也会影响到推荐的准确性。
  既然基于电影特征项计算相似度不可行,那我们就换一种思路。对于两部电影,如果喜欢看的人群都是差不多的,那侧面就可以反映出,这两部电影比较相似。如图所示,每个用户对电影有不同的喜爱程度,我们依旧通过上一个解决方案中定义得分的标准,来定义喜爱程度。
基于欧几里德距离的推荐功能实现思路(向量空间)
  你有没有发现,这个图跟基于相似用户推荐中的图几乎一样。只不过这里把电影和用户主次颠倒了一下。基于相似用户的推荐方法中,针对每个用户,我们将对各部电影的喜爱程度作为向量。基于相似电影的推荐思路中,针对每部电影,我们将每个用户的打分作为向量。
  有了每部电影的向量表示,我们通过计算向量之间的欧几里得距离,来表示电影之间的相似度。欧几里得距离越小,表示两个歌曲越相似。然后,我们就在用户已经看过的电影中,找出他喜爱程度较高的电影。然后,我们找出跟这些电影相似度很高的其他电影,推荐给他。