个性化音乐推荐

来源:互联网 发布:怎样联系到网络推手 编辑:程序博客网 时间:2024/05/01 04:27
音乐,人类的灵魂,只有懂得音乐的人才懂得生活。 
每个人都离不开音乐这个东西,你可能不喜欢唱歌,但一定不会不喜欢听歌,尤其是那些美妙的音乐。
如今,有非常非常多的音乐流派和音乐人,不同音乐流派的音乐风格自然很不相同,而同一种音乐流派中不同的音乐人因为对音乐的理解不同也会有不同的音乐风格。
那么,如何准确地找到你所喜欢的音乐,准确地挖掘你可能会喜欢的音乐呢?
答曰:推荐系统。
在这里,可能会用到下面的几种思路:
<ul><li><span style="font-family:Arial;"><span style="font-size:14px;line-height:22px; white-space:pre-wrap;">协同过滤。</span></span></li></ul><p><span style="font-family:Arial;"><span style="font-size:14px;line-height:22px; white-space:pre-wrap;">如果我们只是提供音乐服务,而不是像社交网络那样提供交友服务的话,用item-based cf是个明智的方法。</span></span></p><p><span style="font-family:Arial;"><span style="font-size:14px;line-height:22px; white-space:pre-wrap;">对于听歌,用1-5分来评价感觉不如用“喜欢”或者“不喜欢”这种方式的用户体验好。尽管喜欢或者不喜欢有点非黑即白的意思,但对于用户来说操作将会非常的简单。当然这是一种显式地反馈方式,往往我们得不到太多的这方面的反馈。那么要做好推荐,必须好好地挖掘用户的隐式反馈,比如,用户收听了这首歌的百分之多少之后点击了下一首,用户是否将歌曲进行分享等等。</span></span></p><p><span style="font-family:Arial;"><span style="font-size:14px;line-height:22px; white-space:pre-wrap;">通过将分析用户行为得到的信息转换为对评分矩阵的一种填充,当然这种填充是在一定的confidence level上进行的。</span></span></p><p><span style="font-family:Arial;"><span style="font-size:14px;line-height:22px; white-space:pre-wrap;">将用户的行为转换成具体的分数是一个比较主观的事情,需要用用户的显式反馈不断地修正转换成分数时的参数值。而且对于不同的人来说,他们的参数可能是不同的,比如,有的人喜欢在听了一首的前10%来表达他不喜欢这首歌,而有的人可能听了50%才会表达出这种意思。</span></span></p><p><span style="font-family:Arial;"><span style="font-size:14px;line-height:22px; white-space:pre-wrap;">所以要做到真正的个性化,必须注意每个人而不是所有人的使用习惯。</span></span></p><ul><li><span style="font-family:Arial;"><span style="font-size:14px;line-height:22px; white-space:pre-wrap;">基于音乐的属性(或者说是tag)</span></span></li></ul><p><span style="font-family:Arial;"><span style="font-size:14px;line-height:22px; white-space:pre-wrap;">音乐的属性,或者是音乐带的tag信息,比如:歌手,风格,专辑,格式,时长。现在很多的个性化音乐服务提供商总是喜欢将这些tag信息称作是音乐的DNA。我个人觉得这种叫法有些不妥,因为这些tag信息只是一些概括,并没有真正的深入到音乐本身的属性中,所以最多只能称作音乐细胞。(当然我也理解,这么叫听起来远不如音乐DNA那么有技术含量)</span></span></p><p><span style="font-family:Arial;"><span style="font-size:14px;line-height:22px; white-space:pre-wrap;">利用音乐的tag信息,我们在提供服务前,就可以聚类,然后再在各聚类中进行音乐的相似度计算,以达到“一劳永逸“的效果。这时候,音乐其实就变成了一个向量,由这些tag以及它们所占的权重组成的一个音乐向量,然后可以用各种方法计算它们的相似度。当然有新的音乐入库的时候,我们只需要先找到它属于的那个聚类中,然后再计算相似度。</span></span></p><p><span style="font-family:Arial;"><span style="font-size:14px;line-height:22px; white-space:pre-wrap;">这里,需要注意的一件事是各种tag的权重问题,我觉得权重的排序是:风格、歌手、专辑、时长、格式。因为大家喜欢一首歌,是因为这首歌的风格让你感觉舒服,当然也有很多的追星一族他们会喜欢一类人,比如周某某的歌,不管是能听清的还是听不清楚的他们都会喜欢。对于这类问题,只有慢慢地分析用户的收听习惯来个性化地决定权值。</span></span></p><ul><li><span style="font-family:Arial;"><span style="font-size:14px;line-height:22px; white-space:pre-wrap;">基于音乐的DNA</span></span></li></ul><p><span style="font-family:Arial;"><span style="font-size:14px;line-height:22px; white-space:pre-wrap;">上面说到的tag我认为是一种比较浅层次的音乐属性,而到底什么是音乐的DNA呢?</span></span></p><p><span style="font-family:Arial;"><span style="font-size:14px;line-height:22px; white-space:pre-wrap;">大家听到的歌曲本质上是一种机械波,具有所有波的属性,包括频率,振幅,周期。</span></span></p><p><span style="font-family:Arial;"><span style="font-size:14px;line-height:22px; white-space:pre-wrap;">一种比较极端的方法,就是将库里的所有歌曲都转换成波的形式,然后对波进行相似度分析。</span></span></p><p><span style="font-family:Arial;"><span style="font-size:14px;line-height:22px; white-space:pre-wrap;">当然这种方法听起来会很荒谬,但是可以考虑分析波的主成分。</span></span></p><p><span style="font-family:Arial;"><span style="font-size:14px;line-height:22px; white-space:pre-wrap;">也可以先利用tag信息将音乐聚类分组,然后并行地用波形分析的方法对音乐进行相似度计算,这样可以省掉确定各个tag之间的权重的麻烦。</span></span></p><p><span style="font-family:Arial;"><span style="font-size:14px;line-height:22px; white-space:pre-wrap;">(这种思路,比较YY,哈哈,大家看着玩就可以哈)</span></span></p><ul><li><span style="font-family:Arial;"><span style="font-size:14px;line-height:22px; white-space:pre-wrap;">混合推荐</span></span></li></ul><p><span style="font-family:Arial;"><span style="font-size:14px;line-height:22px; white-space:pre-wrap;">混合推荐的话,需要利用音乐的tag信息、用户的行为分析以及用户的评分矩阵来完成。</span></span></p><p><span style="font-family:Arial;"><span style="font-size:14px;line-height:22px; white-space:pre-wrap;">用现在比较流行的matrix factor models将各种用户相关的信息包含到模型,然后迭代求解。</span></span></p><ul><li><span style="font-family:Arial;"><span style="font-size:14px;line-height:22px; white-space:pre-wrap;">利用天气进行推荐</span></span></li></ul><p><span style="font-family:Arial;"><span style="font-size:14px;line-height:22px; white-space:pre-wrap;">大家都有这么一种感觉,晴朗的天气我们更倾向于听一些欢快的歌曲,而阴雨的天气我们会比较倾向于听一些悲伤的歌曲。当然,也有的用户会在阴雨天收听一些欢快的歌曲来让自己happy起来。</span></span></p><p><span style="font-family:Arial;"><span style="font-size:14px;line-height:22px; white-space:pre-wrap;">anyway,考虑天气因素是一种简单的方法来提高系统的智能程度的方法(这个简单是相对于分析用户的心情)。</span></span></p><p><span style="font-family:Arial;"><span style="font-size:14px;line-height:22px; white-space:pre-wrap;">那么如何知道哪些歌曲属于欢快的歌曲还是比较悲伤的?</span></span></p><p><span style="font-family:Arial;"><span style="font-size:14px;line-height:22px; white-space:pre-wrap;">做个分类器,先对一些你听过的歌曲人工分为欢快和悲伤,然后学习这两类歌曲的特征,然后对未分类的歌曲进行分析来决定他们到底属于哪个类别。当然这是一种二分的情况,实际的歌曲不可能不是欢快就是悲伤,有许多的分类。</span></span></p><p><span style="font-family:Arial;"><span style="font-size:14px;line-height:22px; white-space:pre-wrap;">那么如何分析歌曲是欢快还是别的感觉呢?</span></span></p><p><span style="font-family:Arial;"><span style="font-size:14px;line-height:22px; white-space:pre-wrap;">(a)一种基于分类的方法</span></span></p><p><span style="font-family:Arial;"><span style="font-size:14px;line-height:22px; white-space:pre-wrap;">可以考虑用音乐的DNA来分析,当然这个工作量也是非常大的。但完全可以离线做好一劳永逸。</span></span></p><p><span style="font-family:Arial;"><span style="font-size:14px;line-height:22px; white-space:pre-wrap;">其实,有一种比较好的方法,就是让用户自己来对每首歌曲进行分类。</span></span></p><p><span style="font-family:Arial;"><span style="font-size:14px;line-height:22px; white-space:pre-wrap;">具体的方法是在用户收听每个歌曲的时候让用户为这首歌添加一个表情。(我们会提供几个表情,不同的表情代表不同的分类,当然这个难度比让用户表达喜欢不喜欢更加困难)</span></span></p><p><span style="font-family:Arial;"><span style="font-size:14px;line-height:22px; white-space:pre-wrap;">拿到用户为每首歌添加的表情,我们可以以两种方式来用这个数据。</span></span></p><ul><li><span style="font-family:Arial;"><span style="font-size:14px;line-height:22px; white-space:pre-wrap;">将所有表情数据集中到一起,提供一种大众化的分类推荐。</span></span></li></ul><ul><li><span style="font-family:Arial;"><span style="font-size:14px;line-height:22px; white-space:pre-wrap;">针对每个用户的表情数据,提供一种个性化的分类推荐。因为毕竟不同的用户对同一首歌曲的理解都不相同。</span></span></li></ul><p><span style="font-family:Arial;"><span style="font-size:14px;line-height:22px; white-space:pre-wrap;">这样,我们就可以实现,当下雨天的时候,我们会将推荐给用户的列表中的比较悲伤的歌曲提前到列表的topN的位置。</span></span></p><p><span style="font-family:Arial;"><span style="font-size:14px;line-height:22px; white-space:pre-wrap;">(b)一种基于统计的方法</span></span></p><p><span style="font-family:Arial;"><span style="font-size:14px;line-height:22px; white-space:pre-wrap;">我们在为用户提供音乐的服务,会记录一些静态的信息,比如音乐的tag,收听了多久,点击了哪些按钮等等。其实,我们可以也记录下用户在收听这些歌曲当时的天气信息。这样我们可能会得到下面的数据:</span></span></p><p><span style="font-family:Arial;font-size:14px;line-height:22px; white-space:pre-wrap;">身边   </span><span style="font-family:Arial;"><span style="font-size:14px;line-height:22px; white-space:pre-wrap;">2011.12.10 14:00-14:05     晴天</span></span></p><p><span style="font-family:Arial;"><span style="font-size:14px;line-height:22px; white-space:pre-wrap;">情非得已   </span></span><span style="font-family:Arial;font-size:14px;line-height:22px; white-space:pre-wrap;">2011.12.10 14:05-14:10     晴天</span></p><p><span style="font-family:Arial;font-size:14px;line-height:22px; white-space:pre-wrap;">。。。 。。。  。。。。 。。。</span></p><p><span style="font-family:Arial;"><span style="font-size:14px;line-height:22px; white-space:pre-wrap;">机器学习中有一个最最经典的例子就是天气和去不去游泳的关系案例。</span></span></p><p><span style="font-family:Arial;"><span style="font-size:14px;line-height:22px; white-space:pre-wrap;">同样的思路,我们可以统计用户在听歌时的天气来做一些统计和学习,来预测用户在给定的天气条件下,他更可能喜欢的歌曲是什么,相当于对协同过滤或者混合推荐算法中给出的推荐列表的一种个性化智能化过滤。</span></span></p>
0 0