音乐App的功能越来越强大,不仅可以自己选歌听,还可以根据你听歌的口味偏好, 给你推荐可能会喜爱的音乐,有时候,推荐的还非常适合你的口味。
1. 算法解析
用两句话总结:
- 找到跟你口味相似的用户,把他们爱听的歌曲推荐给你
- 找出跟你喜爱的歌曲特征相似的歌曲,把这些歌曲推荐给你
2. 基于相似用户做推荐
把跟你听类似歌曲的人,看做口味相似的用户。用“1”表示“喜爱”,用“0”笼统地表示“不发表意见”。从图中看出,你and小明共同喜爱的歌曲最多,有5首。可以说,小明跟你的口味非常相似。
遍历所有的用户,对比每个用户跟你共同喜爱的歌曲数,并且设置一个阈值,某用户共同喜爱歌曲数超过这个值,把这个用户看作跟你口味相似,把这个用户喜爱但你还没听过的歌曲,推荐给你。
如何知道用户喜爱哪首歌曲呢?可以通过用户的行为,来定义这个喜爱程度。给每个行为定义一个得分,得分越高表示喜爱程度越高。
刚刚那个例子,把每个人对每首歌曲的喜爱程度表示出来。图中,某个人对某首歌曲是否喜爱,我们不再用“1”或“0”表示,而是对应一个分值。
欧几里得距离(Euclidean distance)是用来计算两个向量之间的距离的。
K维空间中的某个位置,我们可以写作(X1,X2,X3,……Xk)。这种表示方法就是向量(vector)。
把每个用户对所有歌曲的喜爱程度,都用一个向量表示。计算出两个向量之间的欧几里得距离,作为两个用户的口味相似程度的度量。
3. 基于相似歌曲做推荐
如果用户是一个新用户,还没有收集到足够多的行为数据,该如何推荐呢?
基于相似歌曲的推荐方法,就是说,如果某首歌曲跟你喜爱的歌曲相似,我们就把它推荐给你。
对歌曲定义一些特征项,比如伤感、愉快、摇滚、民谣,柔和、高亢等等。每个歌曲的每个特征打一个分数,这样每个歌曲就对应一个特征向量。基于这个特征向量,计算歌曲之间的欧几里得距离。欧几里得距离越小,表示两个歌曲的相似程度越大。
上面方案,需要一个前提,找到足够多,并且能够全面代表歌曲特点的特征项,除此之外,还要人工给每首歌标注每个特征项的得分。对于收录了海量歌曲的音乐App来说,这是一个非常大的工程。此外,人工标注有很大的主观性。
换一种思路。对于两首歌,如果喜欢听的人群都是差不多的,那侧面就可以反映出,这两首歌比较相似。如图所示,每个用户对歌曲有不同的喜爱程度,我们依旧通过上一个解决方案中定义得分的标准,来定义喜爱程度。
这个图跟基于相似用户推荐中的图几乎一样。只不过这里把歌曲和用户主次颠倒了一下。
- 基于相似用户的推荐方法中,针对每个用户,我们将对各个歌曲的喜爱程度作为向量。
- 基于相似歌曲的推荐思路中,针对每个歌曲,我们将每个用户的打分作为向量。
有了每个歌曲的向量表示,通过计算向量之间的欧几里得距离,来表示歌曲之间的相似度。欧几里得距离越小,两个歌曲越相似。
然后,在用户已经听过的歌曲中,找出他喜爱程度较高的歌曲。然后,找出跟这些歌曲相似度很高的其他歌曲,推荐给他。
4. 总结
上面问题是推荐系统(Recommendation System)里最典型的一类问题。这部分内容,可见算法的强大之处,利用简单的向量空间的欧几里得距离,就能解决如此复杂的问题。
上面只说了基本的理论,实践中遇到的问题还有很多,比如冷启动问题,产品初期积累的数据不多,不足以做推荐等等。这些更加深奥的,在实践中慢慢探索吧。