专栏首页庄闪闪的R语言手册基于关联规则的每日音乐分享

基于关联规则的每日音乐分享

不知道大家用音乐播放器的时候会不会有听“每日推荐”这个歌单的习惯,当你戴着耳机突然切换到一首从未听过但是非常对味的歌,这种感觉是不是超惊喜呀!

这个看起来很复杂的功能,其实由一个简单易懂的算法就可以实现哟,它就是我们今天的C位——基于关联规则的Apriori算法

1 关联规则 简介

关联规则(association rule),顾名思义就是找到事物之间的关联性,可用来寻找大量变量之间有趣的联系。关联规则学习是无监督的,不需要训练算法,也不需要提前标记数据。基于数据集,就可以简单地运行程序。一个典型的规则可以表述为如下形式:

{轻音乐,古典}

{\rightarrow}

{民谣}

这个规则表达的意思就是:如果爱听轻音乐和古典乐,那么很有可能会爱听民谣。大括号内的事物组合表示它们构成一个集合,被称为项集。关联规则是根据项集的子集研究得到的。

2 Apriori算法 简介

Apriori算法采用一个简单的先验准则来减少关联规则的搜索空间:一个频繁项集的所有子集一定是频繁的,一个不频繁的项集的所有父集一定是不频繁的。基于这条规则,可以有效限制搜索规则的次数。例如,如果集合{轻音乐,古典}是频繁的,当且仅当{轻音乐}和{古典}同时频繁地发生。因此,如果轻音乐或者古典中只要有一个是非频繁的,那么任意一个含有这两项的集合都可以从搜索中删除。

3 度量统计量

支持度(

support

):项集在数据中出现的频率,定义公式为:

support(X)=\frac{count(X)}{N}\

置信度(

confidence

):该规则的预测能力或者准确度的度量,定义公式为:

confidence(X{\rightarrow}Y)=\frac{support(X,Y)}{support(X)}\

提升度(

lift

):度量一类事物相对于它的一般选择率,此时被选择的可能性有多大,定义公式为:

lift(X{\rightarrow}Y)=\frac{confidence(X,Y)}{support(Y)}

通过对这些统计量设置阈值并结合Apriori原则,能够大幅度地限制报告的规则数。

4 用Apriori原则创建规则

step 1

:识别所有满足最小支持度阈值的项集。

step 2

:根据满足最小置信度阈值的项集来创建规则。

5 R语言实战

5.1 收集数据

通过对31位同学的调查,获取了他们"我喜爱“歌单里的部分歌手信息,数据集比较小,仅用于算法练习。若需要进行专业的数据分析,可利用工具爬取大量数据。原始的singer.csv文件部分数据如下所示:

5.2 数据准备

事务性数据是无法直接被利用的,为解决此问题采用了一个称为稀疏矩阵的数据结构,稀疏矩阵的每一行表示一个项集,每一列表示项集中的一个事物。

#安装和加载arules程序包
install.packages("arules")
library(arules)
singer<-read.transactions("singer.csv",sep = ",")

如果想查看singer数据集的一些基本信息,可以使用summary()函数,从运行结果中可以看出包含3个或4个事物的项集个数居多,出现频率最高的是“五月天”和“周杰伦”。

> summary(singer)
transactions as itemMatrix in sparse format with
 35 rows (elements/itemsets/transactions) and
 31 columns (items) and a density of 0.1225806 

most frequent items:
   五月天    周杰伦    王力宏 blackpink    林俊杰   (Other) 
       15        15         8         7         7        81 

element (itemset/transaction) length distribution:
sizes
 2  3  4  5  6 
 2 12 14  5  2 

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    2.0     3.0     4.0     3.8     4.0     6.0 

使用inspect()函数可以查看稀疏矩阵的内容:

> inspect(singer[1:6])
    items                                    
[1] {方大同,林俊杰,王力宏,五月天,周杰伦}     
[2] {蔡健雅,陈粒,孙燕姿,五月天}              
[3] {blackpink,exo,刘瑞琦,温岚,五月天,周杰伦}
[4] {blackpink,BTS,EXO,ITZY,mino,twice}      
[5] {陈奕迅,林俊杰,田馥甄,五月天}            
[6] {林宥嘉,刘瑞琦,王力宏,五月天,周杰伦}   

要想计算每个歌手的支持度(默认按字母顺序排序):

> itemFrequency(singer)
       Beyond     blackpink           BTS           exo           EXO 
   0.02857143    0.20000000    0.11428571    0.02857143    0.08571429 
         ITZY Justin bieber          mino         twice        八三幺 
   0.05714286    0.02857143    0.02857143    0.05714286    0.08571429 
       蔡健雅          曹格          陈粒        陈奕迅        方大同 
   0.08571429    0.05714286    0.05714286    0.17142857    0.08571429 
       李宇春        林俊杰        林宥嘉        刘瑞琦        刘若英 
   0.11428571    0.20000000    0.08571429    0.11428571    0.14285714 
       刘思鉴        孙燕姿          陶喆        田馥甄        王力宏 
   0.14285714    0.20000000    0.08571429    0.05714286    0.22857143 
         温岚        五月天          伍佰          张杰        张艺兴 
   0.14285714    0.42857143    0.11428571    0.05714286    0.08571429 
       周杰伦 
   0.42857143 

5.3 数据可视化

  • 显示singer数据集中支持度至少为10%的歌手。
itemFrequencyPlot(singer,support=0.1)
  • 根据频率绘制词云图:
Freq<-itemFrequency(singer)
Fre<-as.data.frame(Freq)
Fre$word<-row.names(Fre)
Fre$freq<-Freq
Fre<-Fre[,-1]
wordcloud2(Fre,size=0.4)
  • 通过添加topN参数,限制歌手的具体数量,下图显示了支持度前五的歌手:
itemFrequencyPlot(singer,topN=5)
  • 除了可视化歌手信息,还可以可视化整个稀疏矩阵,矩阵中填充有黑色单元表示在这行中,该列被选择了。例如,第一行有5个黑色单元,表示这个项集中有5个事物。
image(singer)

5.4 寻找规则集

R语言为我们提供了功能强大的apriori()函数,不需要复杂的代码就可实现探寻功能。虽然运行apriori()函数很简单,但是需要我们去寻找合适的支持度和置信度参数,参数设置过高可能会发现没有规则或者找到无用的规则。阈值设置过低可能会导致规则的数量过多,使得算法运行时间变长。

#使用apriori的默认参数值:support=0.1,confidence=0.8
>apriori(singer)
set of 2 rules 

使用默认参数值只找到两条规则,显然是不够的,需要修改参数值。

>singerrules<-apriori(singer,parameter = list(support=0.06,confidence=0.4,minlen=2))
> singerrules
set of 15 rules 
> inspect(singerrules[1:5])
    lhs            rhs         support    confidence coverage  lift count
[1] {刘瑞琦}    => {周杰伦}    0.08571429 0.7500000  0.1142857 1.75 3    
[2] {BTS}       => {blackpink} 0.08571429 0.7500000  0.1142857 3.75 3    
[3] {blackpink} => {BTS}       0.08571429 0.4285714  0.2000000 3.75 3    
[4] {温岚}      => {周杰伦}    0.08571429 0.6000000  0.1428571 1.40 3    
[5] {孙燕姿}    => {五月天}    0.08571429 0.4285714  0.2000000 1.00 3 

5.5 深入分析模型

> summary(singerrules)
set of 15 rules

rule length distribution (lhs + rhs):sizes
 2  3 
12  3 

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    2.0     2.0     2.0     2.2     2.0     3.0 

summary of quality measures:
    support          confidence        coverage           lift      
 Min.   :0.08571   Min.   :0.4286   Min.   :0.1143   Min.   :1.000  
 1st Qu.:0.08571   1st Qu.:0.4833   1st Qu.:0.1571   1st Qu.:1.167  
 Median :0.11429   Median :0.5714   Median :0.2000   Median :1.556  
 Mean   :0.13143   Mean   :0.6156   Mean   :0.2286   Mean   :1.903  
 3rd Qu.:0.15714   3rd Qu.:0.7083   3rd Qu.:0.2286   3rd Qu.:2.333  
 Max.   :0.22857   Max.   :1.0000   Max.   :0.4286   Max.   :3.750  

mining info:
   data ntransactions support confidence
 singer            35    0.06        0.4

在我们找到的规则集中,有12个规则包含2位歌手,3个规则包含3位歌手。

> inspect(singerrules[1:3])
    lhs            rhs         support    confidence coverage  lift count
[1] {刘瑞琦}    => {周杰伦}    0.08571429 0.7500000  0.1142857 1.75 3    
[2] {BTS}       => {blackpink} 0.08571429 0.7500000  0.1142857 3.75 3    
[3] {blackpink} => {BTS}       0.08571429 0.4285714  0.2000000 3.75 3   

第一条规则简单意思就是“如果一个用户喜欢听刘瑞琦的歌,那么她还会听周杰伦的歌。”其支持度大约为0.0857,置信度为0.75,我们可以确定该条规则涵盖了大约8.57%的用户,而且涉及“刘瑞琦”收听的正确率为75%。这条规则也是存在一定合理逻辑的,刘瑞琦就是因为翻唱周杰伦的歌出名,听完翻唱觉得歌不错再去听原唱也是很有可能的。

常受关注的是高支持度、高置信度的规则,但如果大多数或者所有规则都非常接近最小阈值,那我们还需要关注规则的提升度,

lift(A{\rightarrow}B)>1

,这意味着这两类歌手同时出现在用户喜爱歌单里比只出现一位歌手更常见。因此,一个大的提升度值是一个重要的指标,它表明一个规则是很重要的,反映了事物之间的真实联系。

> inspect(sort(singerrules,by="lift")[1:4])
    lhs                rhs         support    confidence coverage 
[1] {BTS}           => {blackpink} 0.08571429 0.7500000  0.1142857
[2] {blackpink}     => {BTS}       0.08571429 0.4285714  0.2000000
[3] {五月天,周杰伦} => {王力宏}    0.11428571 0.5714286  0.2000000
[4] {王力宏}        => {周杰伦}    0.22857143 1.0000000  0.2285714
    lift     count
[1] 3.750000 3    
[2] 3.750000 3    
[3] 2.500000 4    
[4] 2.333333 8  

当你需要找到包含“周杰伦”的所有规则时,可以利用subset()函数:

> sub<-subset(singerrules,items %in% "周杰伦")
> inspect(sub)
    lhs                rhs      support    confidence coverage  lift    
[1] {刘瑞琦}        => {周杰伦} 0.08571429 0.7500000  0.1142857 1.750000
[2] {温岚}          => {周杰伦} 0.08571429 0.6000000  0.1428571 1.400000
[3] {王力宏}        => {周杰伦} 0.22857143 1.0000000  0.2285714 2.333333
[4] {周杰伦}        => {王力宏} 0.22857143 0.5333333  0.4285714 2.333333
[5] {周杰伦}        => {五月天} 0.20000000 0.4666667  0.4285714 1.088889
[6] {五月天}        => {周杰伦} 0.20000000 0.4666667  0.4285714 1.088889
[7] {王力宏,周杰伦} => {五月天} 0.11428571 0.5000000  0.2285714 1.166667
[8] {王力宏,五月天} => {周杰伦} 0.11428571 1.0000000  0.1142857 2.333333
[9] {五月天,周杰伦} => {王力宏} 0.11428571 0.5714286  0.2000000 2.500000

5.6 保存数据

#将关联规则保存到文件
write(singerrules,file = "singerrules.csv",sep=",",quote=T,row.names=F)

生成的表格如下所示:

#将关联规则保存到数据框
> singerframe<-as(singerrules,"data.frame")
> singerframe
                         rules    support confidence  coverage     lift
1         {刘瑞琦} => {周杰伦} 0.08571429  0.7500000 0.1142857 1.750000
2         {BTS} => {blackpink} 0.08571429  0.7500000 0.1142857 3.750000
3         {blackpink} => {BTS} 0.08571429  0.4285714 0.2000000 3.750000
4           {温岚} => {周杰伦} 0.08571429  0.6000000 0.1428571 1.400000
5         {孙燕姿} => {五月天} 0.08571429  0.4285714 0.2000000 1.000000
6         {陈奕迅} => {五月天} 0.11428571  0.6666667 0.1714286 1.555556
7         {林俊杰} => {五月天} 0.11428571  0.5714286 0.2000000 1.333333
8         {王力宏} => {周杰伦} 0.22857143  1.0000000 0.2285714 2.333333
9         {周杰伦} => {王力宏} 0.22857143  0.5333333 0.4285714 2.333333
10        {王力宏} => {五月天} 0.11428571  0.5000000 0.2285714 1.166667
11        {周杰伦} => {五月天} 0.20000000  0.4666667 0.4285714 1.088889
12        {五月天} => {周杰伦} 0.20000000  0.4666667 0.4285714 1.088889
13 {王力宏,周杰伦} => {五月天} 0.11428571  0.5000000 0.2285714 1.166667
14 {王力宏,五月天} => {周杰伦} 0.11428571  1.0000000 0.1142857 2.333333
15 {五月天,周杰伦} => {王力宏} 0.11428571  0.5714286 0.2000000 2.500000

总结

看完文章是不是发现Apriori算法很好理解呢,通过设置兴趣度的最小阈值就可以去搜寻事物之间的关联模式,一个典型的应用实例就是“购物篮分析”,赶紧动动小手去实践一下吧~需要数据可在公众号后台回复命令关联规则数据即可。

本文分享自微信公众号 - 庄闪闪的R语言手册(Zss_R4ds),作者:赵西西

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-11-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 您有一份网易云音乐产品分析报告,请注意查收~

    本文从市场情况、产品概述、用户分析、核心模块、用户反馈五个维度,对网易云音乐(iOS v4.3.5)进行浅析。

    CDA数据分析师
  • MOne︱基于词包的无监督多主题得分

    又开源了一个某机构整理的今日头条数据,可见:今日头条中文新闻文本(多层)分类数据集

    素质
  • 智能推荐算法研究 | 算法基础(28)

    随着知识爆炸的新社会形态逐渐明晰,如何从纷繁复杂的知识中获取到自己最想要的那一个已经成为热门问题,比如商品个性化推荐系统是建立在海量数据挖掘基础上的一种高级商务...

    用户7623498
  • 网易云音乐再成功融资!2018年成数字音乐资本大年

    10月12日,网易云音乐宣布达成新一轮融资,投资方包括百度、泛大西洋投资集团(General Atlantic)、博裕资本等,其中百度为战略投资方。新一轮融资后...

    罗超频道
  • 全球首个落地的舞蹈动画合成系统,网易互娱AI Lab新技术入选SIGGRAPH 2021

    近日,网易互娱 AI Lab 在 SIGGRAPH 2021 官方精选预告片上展现了其首个符合实际生产环境应用要求的舞蹈动画合成系统 ChoreoMaster。...

    机器之心
  • 《云阅》一个仿网易云音乐UI,使用Gank.Io及豆瓣Api开发的开源项目

    一款基于网易云音乐UI,使用GankIo及豆瓣api开发的符合Google Material Desgin阅读类的开源项目。项目采取的是Retrofit + R...

    Jingbin
  • 仅有两名前端开发,联机小游戏一周内上线,如何做到?

    它在上线四小时内用户数激增60倍,获得新华社力荐,开发过程中仅投入2个前端开发+1个美术+1个策划,这款小游戏里,单机玩法、邀请好友对战、在线匹配对战、排行榜、...

    腾讯云开发TCB
  • 国家版权局段玉萍:传统版权规则仍适用于互联网

    本文根据国家版权局版权管理司副司长段玉萍在7月23日举办的“互联网+”时代的法治创新——第二届中国互联网法律政策论坛的发言整理。 ?   各位好!首先非常...

    腾讯研究院
  • 150页互联网+深度报告:解读九大行业“新红利”【图观大数据35】

    这场始于政府工作报告,由互联网和传统行业合力形成的巨大浪潮,正在以中国经济转型新驱动力的角色,席卷向整个生机勃勃的国家中每一处希望诞生之地。 但在所有的围观者...

    小莹莹
  • 张丰艳:十年沉浮,终迎曙光——对中国音乐产业的反思与展望

    张丰艳   中国传媒大学音乐与录音艺术学院副教授       中国是一个著作权法起步较晚的国家,音乐产业发展也相对滞后。不管是从建国以来到1978年仅“中...

    腾讯研究院
  • 【晓头条】腾讯、阿里乘车码大战广州 / 马化腾怼马云:腾讯与阿里「赋能」不同 / 微信重启春节红包招商

    同时,我们还为你整理了未来的一周内互联网领域即将举行的会议,希望可以帮你找到感兴趣的议题。

    知晓君
  • 区块链入局,51小长假听歌、打游戏的姿势将被颠覆!

    导读:51假期,去哪玩都避不开拥挤的人群,窝在家里痛快地玩游戏反而是个不错的选择。现在,你除了当一个普通玩家之外,还可以参与游戏的运营管理、共享游戏收益,边玩边...

    华章科技
  • 谁该为数字音乐买单?

    罗超为创业家i黑马网站撰稿,2013年5月7日发布于首页头条 你正在用什么听歌?使用Focal-JM Lab的乌托邦系列音响的超级发烧友可以绕过此问题。今天咱...

    罗超频道
  • 阿里星球给四爷办了场歌友会,告诉我们什么是音乐极客精神

    今天在知乎上看到一个问题,什么是音乐极客?音乐和科技有何内在关联?看到“音乐极客”这四个字,我想到了前不久的一场活动:四爷吴奇隆在上海举办的歌友会。这是四爷23...

    罗超频道
  • 中国泛娱乐生态发展报告

    前言   3月25日,UP2016腾讯互娱年度发布会(以下简称UP发布会)在北京国家会议中心举行。作为“泛娱乐”概念的倡导者、全球最具规模的互动娱乐服务提供商之...

    腾讯研究院
  • 在线音乐社区研究报告:跟你分享歌单的都是什么人?

    导读:音乐社区已成趋势,年轻人的心思谁来猜?极光JIGUANG发布《国内在线音乐社区研究报告》,从市场概况、行业分析、音乐社区代表及未来发展等多层面解读音乐社区...

    CDA数据分析师
  • 短视频的这场超级盛宴

    9月19日,人民日报宣布成立人民日报智慧研究院, 重磅推出了全新的短视频客户端“人民日报+”,人民日报在短视频上迈出的这一大步,让短视频的地位进一步巩固。 

    刘旷
  • Spotify推深度个性化推荐服务Discover Weekly

    用户1737318
  • 抖音快手化,快手应该焦虑么?

    在今日头条三军合围快手的战局之下,抖音超过火山,成为头条最重要的短视频产品。 “抖音在消灭快手的路上差不多把微博杀死了”,相信很多人都看到过这个标题,我当时...

    罗超频道

扫码关注云+社区

领取腾讯云代金券