写点什么

歌曲推荐系统实践:Pandas、SciPy 和 D3.js

  • 2015-05-07
  • 本文字数:1997 字

    阅读完需:约 7 分钟

时至今日,虽然海量数据、大数据、数据挖掘、个性化等名词术语已耳熟能详,仿佛谁人两两遇到都可以轻易写个挖掘系统出来,但情况真的是这样么? Flipboard 数据产品部门的工程师 Ben Frederickson 在与友人的讨论中就发现,写个推荐系统并没有那么轻而易举,为此他专门写了一篇博文来记录自己实现的整个过程,利用的工具是数据挖掘领域很热门的 Pandas SciPy 函数库,最后使用 D3.js 进行交互和可视化,相关的代码都放在了 GitHub 上。

具体来讲,一个推荐系统包括数据的获取和存储,相似度的计算以及最终结果的可视化,下面分别阐述。

数据获取

Ben 的推荐系统是针对 Last.fm 用户的,所用数据集是通过 Last.fm 的 API 获取的大约 36 万用户对歌手的喜爱程度。程度以用户对该歌手的播放次数为指标,数据集大小在 1 千 7 百万左右。想要在程序中使用这个数据集,ben 通过 Python 数据挖掘工具 Pandas 的 read_table 将 csv 格式的数据导入成为表格。

复制代码
data = pandas.read_table("usersha1-artmbid-artname-plays.tsv",
usecols=[0, 2, 3],
names=['user', 'artist', 'plays'])

将数据加载为表格以后,剩下的任务就是计算相似度了,ben 给出了三种相似度的计算方法,分别是简单的相似度计算,余弦相似度和来自信息学的相似度计算,并给出了各类方法最后的可视化比较。

简单相似度

简单相似度计算,顾名思义,是最简单的相似度计算方法,用来计算两个歌手的相似程度。这种计算方法,忽略歌手被用户播放的次数,只是简单计算两个歌手重叠的用户数目。

复制代码
def overlap(a, b):
return len(a.intersection(b))

这种计算方法的问题在于,那些流行的歌手的存在,会极大影响相似度的准确性。例如几乎每个用户都听过 Radiohead、Coldplay 和披头士,这使得简单相似度方法给出的答案里面,越是流行的歌手越相似。

为了解决这个问题,ben 引入了新的相似度定义, Jaccard 相似度,利用数据挖掘中常用的正则化(Normalize)手段,将简单相似度正则化,消除用户数目对歌手相似度的影响,具体计算方法如下:

复制代码
def jaccard(a, b):
intersection = float(len(a.intersection(b)))
return intersection / (len(a) + len(b) - intersection)

类似的正则化方法还有很多,比如 Dice 正则和 Ochiai 正则等,从一定程度上改善了相似度计算的准确性,但也带来了一点问题,即集合大小相近的歌手会更加相似,ben 觉得这样也并不合理,因此进一步提出了使用余弦相似度。

余弦相似度

上文中提到的简单相似度抛弃了用户对歌手播放次数这一重要信息,实际上它代表了用户对该歌手的喜爱程度,细想一下是非常有道理的,一个披头士的重度听众怎么能够跟听过寥寥几曲的听众一样呢?那么,利用上播放次数这一信息最直接的办法,就是余弦相似度方法,计算公式如下:

复制代码
def cosine(a, b):
return dot(a, b.T)[0, 0] / (norm2(a) * norm2(b))

通过上面公式,我们就可以将播放次数引入到相似度的计算中。公式中的 a 和 b 分别代表歌手的听众向量,通过下面的代码构造生成:

复制代码
# map each username to a unique numeric value
userids = defaultdict(lambda: len(userids))
data['userid'] = data['user'].map(userids.__getitem__)
# map each artist to a sparse vector of their users
artists = dict((artist, csr_matrix(
(group['plays'], (zeros(len(group)), group['userid'])),
shape=[1, len(userids)]))
for artist, group in data.groupby('artist'))

来自信息学的相似度

除了单纯利用播放次数以外,ben 还介绍了来自信息学的,确切来讲是来自搜索引擎中常用的自然语言处理技术,来计算歌手之间的相似度,即词频 - 逆文档频率(TF-IDF)作为向量的相似度计算方法。

这种相似度的发明,来自搜索引擎对检索结果排序的需求,即计算检索关键词与检索返回的文档之间的相似程度。具体来讲,如果某个词语在一个描述语句中出现的频率很高(TF 很高),而在其他描述语句中很少出现(IDF 很高),则认为该词语具有很好的区分文档的能力,其 TF-IDF 值就比较高,那么对应到歌曲推荐这个任务来讲,ben 将用户(听众)看作一个个的单词,来进一步考虑特定用户对相似度准确性的影响,可谓是三种方法中比较准确的一个了,ben 还在原文中用 D3.js 给出了几种相似度的效果对比分析。

总结

在专业术语充斥耳畔的今天,能够有耐心真正自己去尝试一些想当然的东西、算法甚至系统,是非常难能可贵的精神,而收获也是非常丰富的。Ben 以 Python 中常用的 Pandas 和 SciPy 等工具,展现了从头实现一个推荐系统的方法,正是这种精神的实践典范。


感谢崔康对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群)。

2015-05-07 08:094473
用户头像

发布了 268 篇内容, 共 122.2 次阅读, 收获喜欢 24 次。

关注

评论

发布
暂无评论
发现更多内容

教你如何使用flask实现ajax数据入库

华为云开发者联盟

Python 数据库 flask 文件上传 ajax数据

2021 “科创中国”开源创新榜单公布,优麒麟荣登两榜!

优麒麟

Linux 开源 开源社区 优麒麟

前端架构三大巨头之一Angular | 深度讲解

云智慧AIOps社区

开源 前端 Web angular 数据源

融合通信常见问题2月刊 | 云信小课堂

网易云信

音视频 融合通信

【BBC learningenglish】with Tango

IT蜗壳-Tango

IT蜗壳教学 3月月更 Tango English

Serverless 底座的持续创新

亚马逊云科技 (Amazon Web Services)

Serverless 架构

阿里云智能编码插件,更Cosy的开发体验

阿里云云效

Java 阿里云 程序员 开发 研发

Serverless常见的应用设计模式

亚马逊云科技 (Amazon Web Services)

Serverless 架构

在线Excel文件解析转换成JSON格式

入门小站

工具

澜起科技加入,龙蜥社区再迎领先的芯片设计厂商

OpenAnolis小助手

Linux 开源 操作系统 生态 龙蜥社区

Web 键盘输入法应用开发指南 (2) —— 键盘事件

天择

JavaScript 键盘 输入法 3月月更

墨天轮国产数据库沙龙 | 许力:阿里云原生Lindorm TSDB数据库,驱动工业IT&OT超融合数字化系统升级

墨天轮

数据库 阿里云 tsdb

【技术分享】历经16年猪八戒网如何成功实现双活流量架构

八戒技术团队

架构

基于XuperChain的区块链项目从0到N

刘旭东

区块链 XuperChain

ironSource 新功能发布,开发者可在同一会话中实时调整广告策略

Geek_2d6073

白话大数据 | 从买菜这件小事来聊聊数据仓库

星环科技

创建公司内部文档的入门指南

小炮

工作效率 企业管理 企业管理软件

开讲了!龙蜥社区走进北大课堂

OpenAnolis小助手

开源 操作系统 龙蜥社区 北京大学 走进高校

Rainbond 5.6 版本发布,增加多种安装方式,优化拓扑图操作体验

北京好雨科技有限公司

【案例】基于星环科技数据云平台TDC为富国基金建设万能的数据湖

星环科技

数据库

直播带练 | 30 分钟用阿里云容器服务和容器网络文件系统搭建 WordPress 网站

阿里巴巴云原生

阿里云 云原生 课程 容器服务 直播回放

实践GoF的23种设计模式:SOLID原则(上)

华为云开发者联盟

设计模式 GoF SOLID SOLID原则 分布式应用系统

HertzBeat赫兹跳动v1.0.beta.4 发布, 易用友好的高性能监控告警系统

TanCloud探云

开源 APM 监控 监控系统 监控告警

【C语言】数据类型存储、原码,反码,补码

謓泽

C语言 补码 原码 反码 3月月更

与容器服务 ACK 发行版的深度对话第二弹:如何借助 hybridnet 构建混合云统一网络平面

阿里巴巴云原生

阿里云 云原生 ACK Distro

cdr2022序列号CorelDRAW2022绿色密钥

茶色酒

CorelDRAW 2022

Linux之crontab命令

入门小站

Linux

Nebula Graph 的 KV 存储分离原理和性能测评

NebulaGraph

图数据库 分布式图数据库

ToB月报丨二月融资总金额超152亿元;「东数西算」国家工程全面启动

ToB行业头条

网络安全kali渗透学习 web渗透入门 使用msf渗透攻击Win7主机并远程执行命令

学神来啦

网络安全 Web 渗透 kali kali Linux

招聘宣讲会|Rust 如何为量化行业加速赋能?

非凸科技

歌曲推荐系统实践:Pandas、SciPy和D3.js_语言 & 开发_张天雷_InfoQ精选文章