很多人喜爱听歌,现在直接通过音乐App在线就可以听歌。而且,各种音乐App的功能越来越强大,不仅可以自己选歌听,还可以根据你听歌的口味偏好,给你推荐可能喜爱的音乐。有时候推荐的音乐还非常适合你的口味,甚至会惊艳到你!如此智能的一个功能,你知道它是怎么实现的吗?


算法解析

实际上,要解决这个问题,并不需要特别高深的理论。解决思路的核心思想非常简单、直白,用两句话就能总结出来

找到跟你口味偏好相似的用户,把他们爱听的歌曲推荐给你;
找出跟你喜爱歌曲特征相似的歌曲,把这些歌曲推荐给你。

1、基于相似用户做推荐

如何找到跟你口味偏好相似的用户呢?或者说如何定义口味偏好相似呢?实际上,思路也很简单,我们把跟你听类似歌曲的人,看做口味相似的用户。如下图,我用 “1”表示“喜爱”,用“0”笼统地表示“不发表意见”。从图中可以看出,你跟小明共同喜爱的歌曲最多,有5首。于是,我们就可以说,小明跟你的口味非常相似。

我们只需要遍历所有的用户,对比每个用户跟你共同喜爱歌曲个数,并且设置一个阈值,如果你和某个用户共同喜爱的歌曲个数超过这个阈值,我们就把这个用户看作跟你口味相似的用户,把这个用户喜爱但你还没听过的歌曲,推荐给你。

不过,刚刚的这个解决方案中有一个问题,我们如何知道用户喜爱哪首歌曲呢?也就是说,如何定义用户对某歌曲的喜爱程度呢?

实际上,我们可以通过用户行为,来定义这个喜爱程度。我们给每个行为定义一个得分,得分越高表示喜爱程度越高。

还是刚刚那个例子,我们如果把每个人对每首歌曲的喜爱程度表示出来,就是下面这个样子。图中,某个人对某首歌曲是否喜爱,我们不再用“1”或者“0”来表示,而是对应一个具体的分值。

有了这样一个用户对歌曲的喜爱程度的对应表之后,如何来判断两个用户是否口味相似呢?

显然,我们不能再像之前那样,采用简单的计数来统计两个用户之间的相似度。这里相似度的试题,我们可以使用欧几里得距离(Euclidean distance)。欧几里得距离是用来计算两个向量之间的距离的。这个概念中有两个关键词,向量和距离,我来给解释一下。

一维空间是一条线,我们用1,2,3…这样单个的数,来表示一维空间中某个位置;二维空间是一个面,我们用(1,3)(2,4)(-1,2)…这样两个数,来表示二维空间中某个位置;三维空间是一个立体空间,我们用(1,3,5)(6,2,-1)(4,3,2)…这样的三个数,来表示三维空间中某个位置。那更高维中的某个位置该如何表示呢?

K维空间中的某个位置,我们可以写作(X1, X2,X3,…, Xk)。这种表示方法就是向量(vector)。二维、三维空间中,两个位置之间有距离的概念,类比到高纬空间,同样也有距离概念,这就是我们说的两个向量之间的距离。

那如何计算两个向量之间的距离呢?我们还是可以类比二维、三维空间中距离的计算方法。欧几里得距离计算公式如下:

我们把每个用户对所有歌曲的喜爱程度,都用一个向量表示。我们计算出两个向量之间的欧几里得距离,作为两个用户的口味相似程度。从图中的计算可以看出,小明与你的欧几里得距离最小,也就是说,你俩在高维空间中靠得最近,所以我们就断定,小明跟你的口味最相似。


2、基于相似歌曲做推荐

如果一个新用户,我们还没有收集到足够多的行为数据,这个时候如何推荐呢?可以基于相似歌曲做推荐,也就是说,如果某首歌曲跟你喜爱的歌曲相似,我们就把它推荐给你

如何判断两首歌曲是否相似呢?对于人来说,这个事情可能会比较简单,但对于计算机来说,判断两首歌曲是否相似,那就需要通过量化的数据来表示了。我们应该通过什么数据来量化两个歌曲之间的相似程度呢?

最容易想到的是,我们对歌曲定义一些特征项,比如是伤感的还是愉快的,是摇滚还是民谣,是柔和还是高亢的等等。类似基于相似用户的推荐方法,我们给每个歌曲的每个特征项打一个分数,这样每个歌曲都对应一个特征项向量。我们可以基于特征项向量,来计算两个歌曲之间的欧几里得距离。欧几里得距离越小,表示两个歌曲的相似程度越大。

但是,要实现这个方案,需要有一个前提,那就是我们能够找到足够多,并且能够全面代表歌曲特点的特征项,除此之外,我们还要人工给每首歌标注每个特征项的得分。对于收录了海量歌曲的音乐App来说,这显然是一个非常大的工程。此外,人工标注有很大的主观性,也会影响到推荐的准确性

既然基于歌曲特征项计算相似度不可行,那我们就换一种思路。对于两首歌,如果喜欢听的人群都是差不多的,那侧面就可以反映出,这两首歌比较相似。如图所示,每个用户对歌曲有不同的喜爱程度,我们依旧通过上一个解决方案中定义得分的标准,来主义喜爱程度

你有没有发现,这个图跟基于相似用户推荐中的图几乎一样。只不过这里把歌曲和用户的评奖颠倒了一下。基于相似用户的推荐方法中,针对每个用户,我们将对各个歌曲的喜爱程度作向量。基于相似歌曲的推荐思路中,针对每个歌曲,我们将每个用户的打分作为向量。

有了每个歌曲向量表示,我们通过计算向量之间的欧几里得距离,来表示歌曲之间的相似度。欧几里得距离越小,表示两个歌曲越相似。然后,我们就在用户已经听过的歌曲中,找出他喜爱程度较高的歌曲。然后,我们找出跟这些歌曲相似度很高的其他歌曲,推荐给他。

总结引申

实际上,这个问题的推荐系统(Recommendation System)里最典型的一类问题。之所以讲这部分内容,主要还是想给你展示,算法的强大之处,利用简单的向量空间的欧几里得距离,就能解决如此复杂的问题,不过,今天,我只讲了基本理论,实践中遇到的问题还有很多,比如冷启动问题,产品初期积累的数据不多,不足以做推荐等等。这些更加深奥的内容,可以在实践中慢慢探索

【向量空间】:如何实现一个简单的音乐推荐系统相关推荐

  1. 自制一个简单的音乐播放器

    这两天刚学完了contentprovider和service组件,就综合下所学的,自制了一个简单的音乐播放器. 代码如下: 主activity代码 public class MainActivity ...

  2. Android——一个简单的音乐APP(二)

    一个简单的音乐APP 效果视频 前言 音乐下载 音乐下载效果图 实习步骤&思想 添加到下载队列 单任务下载 多任务下载 音乐下载 获取音乐下载源 创建本地路径 创建目录 开始音乐下载 下载进度 ...

  3. 用Qt写一个简单的音乐播放器(三):增加界面(播放跳转与音量控制)

    一.前言 在用Qt写一个简单的音乐播放器(一):使用QMediaPlayer播放音乐中,我们已经知道如何去使用QMediaPlayer播放音乐. 在用Qt写一个简单的音乐播放器(二):增加界面(开始和 ...

  4. python电影推荐系统 github_GitHub - Holy-Shine/movie_recommend_system: 一个简单的电影推荐系统...

    更新日志 2018-6-17 更新推荐方法接口 一个简单的电影推荐系统. 目录 模型概览:模型结构 代码构成:整体文件结构 模型实现:模型实现细节 快速开始:简单使用教程 1. Glimpse 模型移 ...

  5. 用Qt写一个简单的音乐播放器(六):显示歌词(正则表达式)

    一.前言 在用Qt写一个简单的音乐播放器(一):使用QMediaPlayer播放音乐中,我们已经知道如何去使用QMediaPlayer播放音乐. 在用Qt写一个简单的音乐播放器(二):增加界面(开始和 ...

  6. 用Qt写一个简单的音乐播放器(一):使用QMediaPlayer播放音乐

    一.前言 QMediaplayer可以用于解析音频文件和视频文件,继承自QMediaObject,涉及到的对象为QMediaContent.QMediaObject可以提供关于媒体内容的接入,通过UR ...

  7. 用Qt写一个简单的音乐播放器(五):歌曲播放时间显示

    一.前言 在用Qt写一个简单的音乐播放器(一):使用QMediaPlayer播放音乐中,我们已经知道如何去使用QMediaPlayer播放音乐. 在用Qt写一个简单的音乐播放器(二):增加界面(开始和 ...

  8. Android开发做一个简单的音乐播放器

    Android开发如何做一个简单的音乐播放器,首先我们先要知道用到的知识点有哪些. 1.MediaPlayer:可以播放本地资源.sd卡内存资源以及网络uri资源,在这里我们播放sd卡上的音乐资源. ...

  9. 用Qt写一个简单的音乐播放器(七):界面美化(QSS样式表)

    一.前言 在用Qt写一个简单的音乐播放器(一):使用QMediaPlayer播放音乐中,我们已经知道如何去使用QMediaPlayer播放音乐. 在用Qt写一个简单的音乐播放器(二):增加界面(开始和 ...

最新文章

  1. Kubernetes入门——深入浅出讲Docker
  2. 线段树动态开点区间加区间求和
  3. java反射对象赋值_Java反射详解
  4. 现代软件工程系列 学生的精彩文章 (4) 为用户服务
  5. 服务器怎么修改密码_亚马逊账号登陆不上,修改密码后遭冻结怎么办?有没有什么申诉的办法?...
  6. mysql 5.7.17解压缩版本安装过程
  7. 三端稳压7805和7905稳压原理及典型电路
  8. war、jar、ear文件对比
  9. 计算机制作ppt教程,ppt怎么做?手机电脑超全PPT制作教程_教你做出完整的PPT
  10. Leetcode练习 快慢指针
  11. 字模提取工具-PCtoLCD2002使用说明
  12. Android封装支付宝支付
  13. openstack虚拟机配置vip
  14. 计算机专业教育论述,本科计算机专业教育的改革与发展.doc
  15. docker如何查看宿主机到容器端口映射
  16. 一般能ping通自己的IP ,但是ping 不通网关,也ping不通别的主机IP
  17. 北京星美影院等五家企业因拒收现金被央行警告处罚
  18. 终端(terminal)打印彩色文字
  19. 什么是黑帽SEO,哪些属于黑帽技术?
  20. deepin linux装机指南

热门文章

  1. 结巴分词完全禁用默认词库(仅使用自定义词库)
  2. java语言不允许使用访问内存_北语17春《Java语言程序设计》作业3
  3. behave 测试框架,了解一下
  4. behave java_Lambda Behave行为测试框架
  5. IntelliJ IDEA Live Temlates功能使用举例介绍
  6. (一)NET Core 项目中通过EF Core的Code First方式进行数据库的迁移
  7. Python爬虫实战,requests模块,Python实现抓取某站美女壁纸
  8. Pynq-Z2 开发指南与实例(Linux系统方式)
  9. java swing(GUI) MySQL实现的视频播放器系统源码+运行教程
  10. 中M22春C、Java入门练习-7.7