本篇文章的开头笔者提出一个疑问,何为数据科学,数据科学是做什么的?大家带着这个疑问去读接下来的这篇音乐推荐的公众号。

  从经验上讲,推荐引擎属于大规模机器学习,在日常购物中大家或许深有体会,比如:你在淘宝上浏览了一些商品,或者购买了一些商品,那么淘宝就会根据你的偏好给你推荐一些其他类似的商品。然而,相比较其他机器学习算法,推荐引擎的输出更加的直观,有时候的推荐效果让人吃惊。作为机器学习开篇文章,本篇文章会系统的介绍基于Audioscrobbler数据集的音乐推荐。

数据集介绍

  Audioscrobbler数据集是一个公开发布的数据集,读者可以在(http://www-etud.iro.umontreal.ca/~bergstj/audioscrobbler_data.html)网站获取。数据集主要有三部分组成,user_artist_data.txt文件是主要的数据集文件记录了约2420条用户id、艺术家id以及用户收听艺术家歌曲的次数数据,包含141000个用户和160万个艺术家;artist_data.txt文件记录了艺术家id和对应的名字;artist_alias.txt记录了艺术家id和对应的别称id。

推荐算法介绍

  由于所选取的数据集只记录了用户和歌曲之间的交互情况,除了艺术家名字之外没有其他信息。因此要找的学习算法不需要用户和艺术家的属性信息,这类算法通常被称为协同过滤。如果根据两个用户的年龄相同来判断他们可能具有相似的偏好,这不叫协同过滤。相反,根据两个用户播放过许多相同歌曲来判断他们可能都喜欢某首歌,这是协调过滤。

  本篇所用的算法在数学上称为迭代最小二乘,把用户播放数据当成矩阵A,矩阵低i行第j列上的元素的值,代表用户i播放艺术家j的音乐。矩阵A是稀疏的,绝大多数元素是0,算法将A分解成两个小矩阵X和Y,既A=XYT,X代表用户特征矩阵,Y代表特征艺术家矩阵。两个矩阵的乘积当做用户-艺术家关系矩阵的估计。可以通过下边一组图直观的反映:

  现在假如有5个听众,音乐有5首,那么A是一个5*5的矩阵,假如评分如下:

图2.1 用户订阅矩阵

  假如d是三个属性,那么X的矩阵如下:

图2.2 用户-特征矩阵

  Y的矩阵如下:

图2.3 特征-电影矩阵

  实际的求解过程中通常先随机的固定矩阵Y,则,为提高计算效率,通常采用并行计算X的每一行,既。得到X之后,再反求出Y,不断的交替迭代,最终使得XYT与A的平方误差小于指定阈值,停止迭代,得到最终的X(代表用户特征矩阵)和Y矩阵(代表特征艺术家矩阵)。在根据最终X和Y矩阵结果,向用户进行推荐。

ALS的Spark实现

  Spark MLlib的ALS算法实现有点缺陷,要求用户和产品的ID必须是数值型,并且是32位非负整数。在计算之前应该首先检验一下数据量。

1)数据预处理

  过滤无效的用户艺术家ID和名字行,将格式不正确的数据行剔除掉。

def buildArtistByID(rawArtistData: Dataset[String]): DataFrame = {

  rawArtistData.flatMap { line =>

    val (id, name) = line.span(_ != '\t')

    if (name.isEmpty) {

      None

    } else {

      try {

        Some((id.toInt, name.trim))

      } catch {

        case _: NumberFormatException => None

      }

    }

  }.toDF("id", "name")

}

  过滤艺术家id和对应的别名id,将格式拼写错误的行剔除掉。

def buildArtistAlias(rawArtistAlias: Dataset[String]): Map[Int,Int] = {

  rawArtistAlias.flatMap { line =>

    val Array(artist, alias) = line.split('\t')

    if (artist.isEmpty) {

      None

    } else {

      Some((artist.toInt, alias.toInt))

    }

  }.collect().toMap

}

  将数据转换成Rating对象,Rating对象是ALS算法对“用户-产品-值”的抽象。

def buildCounts(

    rawUserArtistData: Dataset[String],

    bArtistAlias: Broadcast[Map[Int,Int]]): DataFrame = {

  rawUserArtistData.map { line =>

    val Array(userID, artistID, count) = line.split(' ').map(_.toInt)

    val finalArtistID = bArtistAlias.value.getOrElse(artistID, artistID)

    (userID, finalArtistID, count)

  }.toDF("user", "artist", "count")

}

2)模型构建

def model(

    rawUserArtistData: Dataset[String],

    rawArtistData: Dataset[String],

    rawArtistAlias: Dataset[String]): Unit = {

  val bArtistAlias = spark.sparkContext.broadcast(buildArtistAlias(rawArtistAlias))  //艺术家别名数据

  val trainData = buildCounts(rawUserArtistData, bArtistAlias).cache() //将数据转换成需要的格式

  val model = new ALS().

    setSeed(Random.nextLong()).

    setImplicitPrefs(true).

    setRank(10).

    setRegParam(0.01).

    setAlpha(1.0).

    setMaxIter(5).

    setUserCol("user").

    setItemCol("artist").

    setRatingCol("count").

    setPredictionCol("prediction").

    fit(trainData)

  trainData.unpersist()

  model.userFactors.select("features").show(truncate = false)

  val userID = 2093760

  val existingArtistIDs = trainData.

    filter($"user" === userID).

    select("artist").as[Int].collect()

  val artistByID = buildArtistByID(rawArtistData)

  artistByID.filter($"id" isin (existingArtistIDs:_*)).show()

  val topRecommendations = makeRecommendations(model, userID, 5)

  topRecommendations.show()

  val recommendedArtistIDs = topRecommendations.select("artist").as[Int].collect()

  artistByID.filter($"id" isin (recommendedArtistIDs:_*)).show()

  model.userFactors.unpersist()

  model.itemFactors.unpersist()

}

  本篇文章主要对ALS音乐推荐进行简单的介绍,下一篇会对模型的参数,以及模型的推荐效果进行评估,并且会对推荐结果进行优化。

备注:如果文中排版出现错乱,请点击https://mp.weixin.qq.com/s/aqF38rDQdT35YrLAyLm-nA

更多精彩内容,欢迎扫码关注以下微信公众号:大数据技术宅。大数据、AI从关注开始

ALS音乐推荐(上)的更多相关文章

  1. 3-Spark高级数据分析-第三章 音乐推荐和Audioscrobbler数据集

    偏好是无法度量的. 相比其他的机器学习算法,推荐引擎的输出更直观,更容易理解. 接下来三章主要讲述Spark中主要的机器学习算法.其中一章围绕推荐引擎展开,主要介绍音乐推荐.在随后的章节中我们先介绍S ...

  2. Spark 实践——音乐推荐和 Audioscrobbler 数据集

    本文基于<Spark 高级数据分析>第3章 用音乐推荐和Audioscrobbler数据 完整代码见 https://github.com/libaoquan95/aasPractice/ ...

  3. Recommending music on Spotify with deep learning 采用深度学习算法为Spotify做基于内容的音乐推荐

    本文参考http://blog.csdn.net/zdy0_2004/article/details/43896015译文以及原文file:///F:/%E6%9C%BA%E5%99%A8%E5%AD ...

  4. 音乐推荐与Audioscrobbler数据集

    1. Audioscrobbler数据集 数据下载地址: http://www.iro.umontreal.ca/~lisa/datasets/profiledata_06-May-2005.tar. ...

  5. Android-bindService本地服务-音乐播放-上

    播放音乐的行为写在服务里,Activity去调用Service里面到方法,进行音乐播放,当Activity结束后,音乐播放器停止播放 界面: MainActivity: package liudeli ...

  6. 6、DRN-----深度强化学习在新闻推荐上的应用

    1.摘要: 提出了一种新的深度强化学习框架的新闻推荐.由于新闻特征和用户喜好的动态特性,在线个性化新闻推荐是一个极具挑战性的问题. 虽然已经提出了一些在线推荐模型来解决新闻推荐的动态特性,但是这些方法 ...

  7. 这个菜鸟花几个小时写的 DEMO 被码云推荐上首页 ?

    写在最前     没有接触过 AntV 的诸位看客可通过这篇不成文的文章稍作了解.最近 病毒猖獗,遂抽空做了一个相关小 DEMO.数据可视化方面的使用的是 AntV F2,前端框架使用 Vue 快速成 ...

  8. 用TensorFlow教你手写字识别

    博主原文链接:用TensorFlow教你做手写字识别(准确率94.09%) 如需转载,请备注出处及链接,谢谢. 2012 年,Alex Krizhevsky, Geoff Hinton, and Il ...

  9. 历上最强的音乐播放器(jetA…

    原文地址:历上最强的音乐播放器(jetAudio-8.0.5.320-Plus-VX-完全汉化版)下载作者:盖世天星 历上最强的音乐播放器(jetAudio-8.0.5.320-Plus-VX-完全汉 ...

随机推荐

  1. poj-1207 THE 3n+1 problem

    Description Problems in Computer Science are often classified as belonging to a certain class of pro ...

  2. C++单例模式的经典实现(Singleton)

    C++单例经典实现 本文主要介绍C++使用中的单例的两种经典实现,基本可满足一般的使用,主要分为饿汉模式和懒汉模式两种 饿汉模式 class Singleton { public: static Si ...

  3. Dockerfile 指令 VOLUME 介绍

    在介绍VOLUME指令之前,我们来看下如下场景需求: 1)容器是基于镜像创建的,最后的容器文件系统包括镜像的只读层+可写层,容器中的进程操作的数据持久化都是保存在容器的可写层上.一旦容器删除后,这些数 ...

  4. Jmeter中正则表达式提取器使用详解

    在使用Jmeter过程中,会经常使用到正则表达式提取器提取器,虽然并不直接涉及到请求的测试,但是对于数据的传递起着很大的作用,本篇博文就是主要讲解关于正则表达式及其在Jmeter的Sampler中的调 ...

  5. 关于HTML使用ComDlg ActiveX 无法弹出相应对话框的问题1

    最近发现,开发的Web应用在客户的某些IE(8,9,11)中弹出不了Windows的字体对话框. 通过 F12 跟踪,错误代码是“-2146827850”,错误信息是“ 对象不支持ShowFont属性 ...

  6. 201621123062《java程序设计》第八周作业总结

    1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 思维导图: 2. 书面作业 2.1ArrayList代码分析 2.1.1 解释ArrayList的contains源代码 源 ...

  7. 源端控制的OpenFlow数据面

    OpenFlow 交换机一般采用 TCAM 存储和查找流表,从而带来了扩展性.成本和能耗的问题.TCAM 成本和能耗过高,存储容量有限,一般交换机中的 TCAM 仅能存储几千条流表项,对 OpenFl ...

  8. 清华集训2015 V

    #164. [清华集训2015]V http://uoj.ac/problem/164 统计 描述 提交 自定义测试 Picks博士观察完金星凌日后,设计了一个复杂的电阻器.为了简化题目,题目中的常数 ...

  9. Java代码风格和在idea中的一些设置

    源文件基本设置 1. 文件名 驼峰标识,.java结尾 2. 编码 统一为UTF-8 Transport...可以解决property文件不能正常显示为中文的问题 3. 特殊字符 尽量使用转义字符(\ ...

  10. Scala 集合入门

    1. 数组 1.1 定长数组 scala.Array 是定长的可变的索引型集合, JVM 中, Scala 的 Array 是以 Java 数组方式实现. String 对应 java.lang.St ...