http://git-wip-us.apache.org/repos/asf/mahout/blob/5112e9ec/docs/latest/tutorials/cco-lastfm/index.html
----------------------------------------------------------------------
diff --git a/docs/latest/tutorials/cco-lastfm/index.html
b/docs/latest/tutorials/cco-lastfm/index.html
index cff5903..c9af465 100644
--- a/docs/latest/tutorials/cco-lastfm/index.html
+++ b/docs/latest/tutorials/cco-lastfm/index.html
@@ -1,350 +1,244 @@
-
-
<!DOCTYPE html>
-<html lang="en">
+<html lang=" en ">
+
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>CCOs with Last.fm</title>
-
- <meta name="author" content="Apache Mahout">
-
- <!-- Enable responsive viewport -->
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
-
- <!-- Bootstrap styles -->
- <link href="/assets/themes/mahout3/css/bootstrap.min.css" rel="stylesheet">
- <!-- Optional theme -->
- <link href="/assets/themes/mahout3/css/bootstrap-theme.min.css"
rel="stylesheet">
- <!-- Sticky Footer -->
- <link href="/assets/themes/mahout3/css/bs-sticky-footer.css"
rel="stylesheet">
-
- <!-- Custom styles -->
- <link href="/assets/themes/mahout3/css/style.css" rel="stylesheet"
type="text/css" media="all">
-
- <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media
queries -->
- <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
- <!--[if lt IE 9]>
- <script
src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
- <script
src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script>
- <![endif]-->
-
- <!-- Fav and touch icons -->
- <!-- Update these with your own images
- <link rel="shortcut icon" href="images/favicon.ico">
- <link rel="apple-touch-icon" href="images/apple-touch-icon.png">
- <link rel="apple-touch-icon" sizes="72x72"
href="images/apple-touch-icon-72x72.png">
- <link rel="apple-touch-icon" sizes="114x114"
href="images/apple-touch-icon-114x114.png">
- -->
-
- <!-- atom & rss feed -->
- <link href="/atom.xml" type="application/atom+xml" rel="alternate"
title="Sitewide ATOM Feed">
- <link href="/rss.xml" type="application/rss+xml" rel="alternate"
title="Sitewide RSS Feed">
- <script type="text/x-mathjax-config">
- MathJax.Hub.Config({
- tex2jax: {
- skipTags: ['script', 'noscript', 'style', 'textarea', 'pre']
- }
- });
- MathJax.Hub.Queue(function() {
- var all = MathJax.Hub.getAllJax(), i;
- for(i = 0; i < all.length; i += 1) {
- all[i].SourceElement().parentNode.className += ' has-jax';
- }
- });
- </script>
- <script type="text/javascript">
- var mathjax = document.createElement('script');
- mathjax.type = 'text/javascript';
- mathjax.async = true;
-
- mathjax.src = ('https:' == document.location.protocol) ?
-
'https://c328740.ssl.cf1.rackcdn.com/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'
:
-
'http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML';
-
- var s = document.getElementsByTagName('script')[0];
- s.parentNode.insertBefore(mathjax, s);
- </script>
-</head>
-
-<nav class="navbar navbar-default navbar-fixed-top">
- <div class="container-fluid">
- <!-- Brand and toggle get grouped for better mobile display -->
- <div class="navbar-header">
- <button type="button" class="navbar-toggle collapsed"
data-toggle="collapse" data-target="#bs-example-navbar-collapse-1"
aria-expanded="false">
- <span class="sr-only">Toggle navigation</span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- </button>
- <a class="navbar-brand" href="/">
- <img src="/assets/img/Mahout-logo-82x100.png" height="30" alt="I'm
mahout">
- </a>
- </div>
-
+ <title>
+ CCOs with Last.fm
+ </title>
+ <meta name="description" content="Distributed Linear Algebra">
-<!-- Collect the nav links, forms, and other content for toggling -->
-<div class="collapse navbar-collapse" id="main-navbar">
- <ul class="nav navbar-nav">
-
- <!-- Quick Start -->
- <li id="quickstart">
- <a href="/index.html" >Mahout Overview</a>
- </li>
-
- <li id="dropdown">
- <a href="#" class="dropdown-toggle" data-toggle="dropdown"
role="button" aria-haspopup="true" aria-expanded="false">Key Concepts<span
class="caret"></span></a>
- <ul class="dropdown-menu">
- <li><a href="/index.html">Mahout Overview</a></li>
- <li><span><b> Scala DSL</b><span></li>
- <li><a href="/mahout-samsara/in-core-reference.html">In-core
Reference</a></li>
- <li><a
href="/mahout-samsara/out-of-core-reference.html">Out-of-core Reference</a></li>
- <li><a href="/mahout-samsara/faq.html">Samsara FAQ</a></li>
- <li role="separator" class="divider"></li>
- <li><span> <b>Bindings</b><span></li>
- <li><a href="/distributed/spark-bindings/">Spark
Bindings</a></li>
- <li><a href="/distributed/flink-bindings.html">Flink
Bindings</a></li>
- <li><a href="/distributed/flink-bindings.html">H20
Bindings</a></li>
- <!--<li role="separator" class="divider"></li>
- <li><span> <b>Native Solvers</b><span></li>
- <li><a href="/native-solvers/viennacl.html">ViennaCL</a></li>
- <li><a
href="/native-solvers/viennacl-omp.html">ViennaCL-OMP</a></li>
- <li><a href="/native-solvers/cuda.html">CUDA</a></li>-->
- </ul>
- </li>
-
- <li id="dropdown">
- <a href="#" class="dropdown-toggle" data-toggle="dropdown"
role="button" aria-haspopup="true" aria-expanded="false">Tutorials<span
class="caret"></span></a>
- <ul class="dropdown-menu">
- <li><span> <b>Reccomenders</b><span></li>
- <li><a href="/tutorials/cco-lastfm">CCO Example with Last.FM
Data</a></li>
- <li><a href="/tutorials/intro-cooccurrence-spark">Introduction
to Cooccurrence in Spark</a></li>
- <li role="separator" class="divider"></li>
- <li><span> <b>Mahout Samsara</b><span></li>
- <li><a href="/tutorials/samsara/play-with-shell.html">Playing
with Samsara in Spark Shell</a></li>
- <li><a
href="/tutorials/samsara/playing-with-samsara-flink-batch.html">Playing with
Samsara in Flink Batch</a></li>
- <li><a
href="/tutorials/samsara/classify-a-doc-from-the-shell.html">Text
Classification (Shell)</a></li>
- <li><a href="/tutorials/samsara/spark-naive-bayes.html">Spark
Naive Bayes</a></li>
- <li role="separator" class="divider"></li>
- <li><span> <b>Misc</b><span></li>
- <li><a href="/tutorials/misc/mahout-in-zeppelin">Mahout in
Apache Zeppelin</a></li>
- <li><a href="/tutorials/misc/contributing-algos">How To
Contribute a New Algorithm</a></li>
- <li><a href="/tutorials/misc/how-to-build-an-app.html">How To
Build An App</a></li>
- <li role="separator" class="divider"></li>
- <li><span> <b>Deprecated</b><span></li>
- <li><a href="/tutorials/map-reduce">MapReduce</a></li>
- </ul>
- </li>
-
-
- <!-- Algorithms (Samsara / MR) -->
- <li id="dropdown">
- <a href="#" class="dropdown-toggle" data-toggle="dropdown"
role="button" aria-haspopup="true" aria-expanded="false">Algorithms<span
class="caret"></span></a>
- <ul class="dropdown-menu">
- <li><a href="/algorithms/linear-algebra">Distributed Linear
Algebra</a></li>
- <li><a href="/algorithms/preprocessors">Preprocessors</a></li>
- <li><a href="/algorithms/regression">Regression</a></li>
- <li><a href="/algorithms/reccomenders">Reccomenders</a></li>
- <li role="separator" class="divider"></li>
- <li><a href="/algorithms/map-reduce">MapReduce
<i>(deprecated)</i></a></li>
- </ul>
- <!--<li><a
href="/algorithms/reccomenders/recommender-overview.html">Reccomender
Overview</a></li> Do we still need? seems like short version of next post-->
- <!--
- <li><a
href="/algorithms/reccomenders/intro-cooccurrence-spark.html">Intro to
Coocurrence With Spark</a></li>
- <li role="separator" class="divider"></li>
- <li><span> <a
href="/algorithms/map-reduce"><b>MapReduce</b> (deprecated)</a><span></li>
+ <link rel="stylesheet" href="/assets/css/main.css">
+ <!-- Font Awesome -->
+ <link
href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css"
rel="stylesheet"
integrity="sha384-wvfXpqpZZVQGK6TAh5PVlGOfQNHSoD2xbE+QkPxCAFlNEevoEH3Sl0sibVcOQVnN"
crossorigin="anonymous">
- -->
- </li>
+ <!-- Google Fonts -->
+ <link href="https://fonts.googleapis.com/css?family=Maven+Pro:400,500"
rel="stylesheet">
+ <link href="https://fonts.googleapis.com/css?family=Muli:400,400i,700,700i"
rel="stylesheet">
- <!-- Scala Docs -->
- <li id="dropdown">
- <a href="#" class="dropdown-toggle" data-toggle="dropdown"
role="button" aria-haspopup="true" aria-expanded="false">API Docs<span
class="caret"></span></a>
- <ul class="dropdown-menu">
- <li><a href="/0.13.0/api/index.html">0.13.0</a></li>
- </ul>
- </li>
-
-
- </ul>
- <form class="navbar-form navbar-left">
- <div class="form-group">
- <input type="text" class="form-control" placeholder="Search">
- </div>
- <button type="submit" class="btn btn-default">Submit</button>
- </form>
- <ul class="nav navbar-nav navbar-right">
- <li><a href="http://github.com/apache/mahout">Github</a></li>
-
- <!-- Apache -->
- <li class="dropdown">
- <a href="#" class="dropdown-toggle" data-toggle="dropdown"
role="button" aria-haspopup="true" aria-expanded="false">Apache <span
class="caret"></span></a>
- <ul class="dropdown-menu">
- <li><a
href="http://www.apache.org/foundation/how-it-works.html">Apache Software
Foundation</a></li>
- <li><a href="http://www.apache.org/licenses/">Apache
License</a></li>
- <li><a
href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li>
- <li><a
href="http://www.apache.org/foundation/thanks.html">Thanks</a></li>
- </ul>
- </li>
+ <link rel="canonical"
href="http://mahout.apache.org//docs/latest/tutorials/cco-lastfm/">
+ <link rel="alternate" type="application/rss+xml" title="Apache Mahout"
href="/%20/feed.xml">
- </ul>
-</div><!-- /.navbar-collapse -->
- </div><!-- /.container-fluid -->
-</nav>
+</head>
+
<body>
-<div id="wrap">
- <body class="">
+ <nav class="navbar navbar-expand-lg navbar-light bg-light navbar-mahout">
+
+ <div class="container">
+
+ <a class="navbar-brand" href="/">
+ <img src="/assets/mahout-logo-blue.svg" alt="">
+ </a>
+
+ <button class="navbar-toggler" type="button" data-toggle="collapse"
data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
+ <span class="navbar-toggler-icon"></span>
+ </button>
+
+ <div class="collapse navbar-collapse" id="navbarSupportedContent">
+
+ <div class="navbar-nav ml-auto">
+
+ <!-- Quick Start -->
+ <li class="nav-item">
+ <a class="nav-link" href="//docs/latest/" >Mahout
Overview</a>
+ </li>
+
+ <li class="nav-item dropdown">
+ <a class="nav-link dropdown-toggle" href=""
id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true"
aria-expanded="false">Key Concepts</a>
+ <div class="dropdown-menu"
aria-labelledby="navbarDropdownMenuLink">
+ <a class="dropdown-item"
href="/docs/latest/index.html">Mahout Overview</a>
+ <div class="dropdown-divider"></div>
+ <h6 class="dropdown-header">Scala DSL</h6>
+ <a class="dropdown-item"
href="/docs/latest/mahout-samsara/in-core-reference.html">In-core Reference</a>
+ <a class="dropdown-item"
href="/docs/latest/mahout-samsara/out-of-core-reference.html">Out-of-core
Reference</a>
+ <a class="dropdown-item"
href="/docs/latest/mahout-samsara/faq.html">Samsara FAQ</a>
+ <div class="dropdown-divider"></div>
+ <h6 class="dropdown-header">Distributed Engine
Bindings</h6>
+ <a class="dropdown-item"
href="/docs/latest/distributed/spark-bindings/">Spark Bindings</a>
+ <a class="dropdown-item"
href="/docs/latest/distributed/flink-bindings.html">Flink Bindings</a>
+ <a class="dropdown-item"
href="/docs/latest/distributed/flink-bindings.html">H20 Bindings</a>
+ <!--<div class="dropdown-divider"></div>
+ <h6 class="dropdown-header">Native Solvers</h6>
+ <a class="dropdown-item"
href="/docs/latest/native-solvers/viennacl.html">ViennaCL</a></li>
+ <a class="dropdown-item"
href="/docs/latest/native-solvers/viennacl-omp.html">ViennaCL-OMP</a></li>
+ <a class="dropdown-item"
href="/docs/latest/native-solvers/cuda.html">CUDA</a></li>-->
+ </div>
+ </li>
+
+ <li class="nav-item dropdown">
+ <a class="nav-link dropdown-toggle" href=""
id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true"
aria-expanded="false">Tutorial</a>
+ <div class="dropdown-menu"
aria-labelledby="navbarDropdownMenuLink">
+ <div class="dropdown-divider"></div>
+ <h6 class="dropdown-header">Reccomenders</h6>
+ <a class="dropdown-item"
href="/docs/latest/tutorials/cco-lastfm">CCO Example with Last.FM Data</a>
+ <a class="dropdown-item"
href="/docs/latest/tutorials/intro-cooccurrence-spark">Introduction to
Cooccurrence in Spark</a>
+ <div class="dropdown-divider"></div>
+ <h6 class="dropdown-header">Mahout Samsara</h6>
+ <a class="dropdown-item"
href="/docs/latest/tutorials/samsara/play-with-shell.html">Playing with Samsara
in Spark Shell</a>
+ <a class="dropdown-item"
href="/docs/latest/tutorials/samsara/playing-with-samsara-flink-batch.html">Playing
with Samsara in Flink Batch</a>
+ <a class="dropdown-item"
href="/docs/latest/tutorials/samsara/classify-a-doc-from-the-shell.html">Text
Classification (Shell)</a>
+ <a class="dropdown-item"
href="/docs/latest/tutorials/samsara/spark-naive-bayes.html">Spark Naive
Bayes</a>
+ <div class="dropdown-divider"></div>
+ <h6 class="dropdown-header">Misc</h6>
+ <a class="dropdown-item"
href="/docs/latest/tutorials/misc/mahout-in-zeppelin">Mahout in Apache
Zeppelin</a>
+ <a class="dropdown-item"
href="/docs/latest/tutorials/misc/contributing-algos">How To Contribute a New
Algorithm</a>
+ <a class="dropdown-item"
href="/docs/latest/tutorials/misc/how-to-build-an-app.html">How To Build An
App</a>
+ <div class="dropdown-divider"></div>
+ <h6 class="dropdown-header">Deprecated</h6>
+ <a class="dropdown-item"
href="/docs/latest/tutorials/map-reduce">MapReduce</a>
+ </div>
+ </li>
+
+
+ <!-- Algorithms (Samsara / MR) -->
+ <li class="nav-item dropdown">
+ <a class="nav-link dropdown-toggle" href=""
id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true"
aria-expanded="false">Algorithms</a>
+ <div class="dropdown-menu"
aria-labelledby="navbarDropdownMenuLink">
+ <a class="dropdown-item"
href="/docs/latest/algorithms/linear-algebra">Distributed Linear Algebra</a>
+ <a class="dropdown-item"
href="/docs/latest/algorithms/preprocessors">Preprocessors</a>
+ <a class="dropdown-item"
href="/docs/latest/algorithms/regression">Regression</a>
+ <a class="dropdown-item"
href="/docs/latest/algorithms/reccomenders">Reccomenders</a>
+ <div class="dropdown-divider"></div>
+ <h6 class="dropdown-header">Deprecated</h6>
+ <a class="dropdown-item"
href="/docs/latest/algorithms/map-reduce">MapReduce <i>(deprecated)</i></a>
+ </div>
+ <!--<a class="dropdown-item"
href="/docs/latest/algorithms/reccomenders/recommender-overview.html">Reccomender
Overview</a></li> Do we still need? seems like short version of next post-->
+ <!--
+ <a class="dropdown-item"
href="/docs/latest/algorithms/reccomenders/intro-cooccurrence-spark.html">Intro
to Coocurrence With Spark</a></li>
+ <li role="separator" class="divider"></li>
+ <li><span> <a
href="/docs/latest/algorithms/map-reduce"><b>MapReduce</b>
(deprecated)</a><span></li>
+
+
+ -->
+ </li>
+
+ <!-- Scala /docs -->
+ <li class="nav-item dropdown">
+ <a class="nav-link dropdown-toggle" href=""
id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true"
aria-expanded="false">API /docs</a>
+ <div class="dropdown-menu"
aria-labelledby="navbarDropdownMenuLink">
+ <a class="dropdown-item"
href="/docs/latest/0.13.0/api/index.html">0.13.0</a>
+ </div>
+ </li>
+
+ <!-- Apache -->
+ <li class="nav-item dropdown">
+ <a class="nav-link dropdown-toggle" href=""
id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true"
aria-expanded="false">Apache</a>
+ <div class="dropdown-menu"
aria-labelledby="navbarDropdownMenuLink">
+ <a class="dropdown-item"
href="http://www.apache.org/foundation/how-it-works.html">Apache Software
Foundation</a>
+ <a class="dropdown-item"
href="http://www.apache.org/licenses/">Apache License</a>
+ <a class="dropdown-item"
href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a>
+ <a class="dropdown-item"
href="http://www.apache.org/foundation/thanks.html">Thanks</a>
+ </div>
+ </li>
- <div class="container">
-
+ </ul>
+
+ <!--<form class="navbar-form navbar-left">-->
+ <!--<div class="form-group">-->
+ <!--<input type="text" class="form-control"
placeholder="Search">-->
+ <!--</div>-->
+ <!--<button type="submit" class="btn
btn-default">Submit</button>-->
+ <!--</form>-->
+ <!--<ul class="nav navbar-nav navbar-right">-->
+ <!--<a class="dropdown-item"
href="http://github.com/apache/mahout">Github</a></li>-->
-<div class="row">
- <div class="col-xs-3">
- <div id="TutorialMenu">
- <span><b>Tutorials</b></span>
- <div class="list-group panel">
- <a href="#linalg" class="list-group-item list-group-item-success"
data-toggle="collapse" data-parent="#TutorialMenu"><b>Linear Algebra</b><i
class="fa fa-caret-down"></i></a>
- <div class="collapse" id="linalg">
- <ul class="nav sidebar-nav">
- <li><a href="/tutorials/eigenfaces">Eigenfaces Demo (Shell
or Zeppelin)</a></li>
- </ul>
- </div>
- <a href="#reccomenders" class="list-group-item
list-group-item-success" data-toggle="collapse"
data-parent="#TutorialMenu"><b>Reccomenders</b><i class="fa
fa-caret-down"></i></a>
- <div class="collapse" id="reccomenders">
- <ul class="nav sidebar-nav">
- <li><a href="/tutorials/cco-lastfm">CCO Example with
Last.FM Data</a></li>
- <li><a
href="/tutorials/intro-cooccurrence-spark">Introduction to Cooccurrence in
Spark</a></li>
- </ul>
- </div>
- <a href="#other" class="list-group-item list-group-item-success"
data-toggle="collapse" data-parent="#TutorialMenu"><b>Other</b><i class="fa
fa-caret-down"></i></a>
- <div class="collapse" id="other">
- <ul class="nav sidebar-nav">
- <li><a href="/tutorials/misc/mahout-in-zeppelin">Mahout in
Apache Zeppelin</a></li>
- <li><a href="/tutorials/misc/contributing-algos">How To
Contribute a New Algorithm</a></li>
- <li><a href="/tutorials/misc/how-to-build-an-app.html">How To
Build An App</a></li>
- </ul>
- </div>
- </div>
- <span><b>Map Reduce Tutorials</b> (deprecated)</span>
- <div class="list-group panel">
- <a href="#classification" class="list-group-item
list-group-item-success" data-toggle="collapse"
data-parent="#MrTutorialMenu"><b>Classification</b><i class="fa
fa-caret-down"></i></a>
- <div class="collapse" id="classification">
- <ul class="nav sidebar-nav">
- <li> <a
href="/tutorials/map-reduce/classification/bankmarketing-example.html">Bank
Marketing Example</a></li>
- <li> <a
href="/tutorials/map-reduce/classification/breiman-example.html">Breiman
Example</a></li>
- <li> <a
href="/tutorials/map-reduce/classification/twenty-newsgroups.html">Twenty
Newsgroups Example</a></li>
- <li> <a
href="/tutorials/map-reduce/classification/wikipedia-classifier-example.html">Wikipedia
Classifier Example</a></li>
- <li> <a
href="/tutorials/map-reduce/classification/parallel-frequent-pattern-mining.html">Parallel
Frequent Pattern Mining</a></li>
- </ul>
- </div>
- <a href="#clustering" class="list-group-item list-group-item-success"
data-toggle="collapse" data-parent="#MrTutorialMenu"><b>Clustering</b><i
class="fa fa-caret-down"></i></a>
- <div class="collapse" id="clustering">
- <ul class="nav sidebar-nav">
- <li> <a
href="/tutorials/map-reduce/clustering/20newsgroups.html">Twenty Newsgroups
Example</a></li>
- <li> <a
href="/tutorials/map-reduce/clustering/canopy-commandline.html">Canopy
Clustering from the Commandline</a></li>
- <li> <a
href="/tutorials/map-reduce/clustering/clustering-of-synthetic-control-data.html">Clustering
of Synthetic Control Data</a></li>
- <li> <a
href="/tutorials/map-reduce/clustering/clustering-seinfeld-episodes.html">Clustering
of Seinfeld Episodes</a></li>
- <li> <a
href="/tutorials/map-reduce/clustering/clusteringyourdata.html">Clustering Your
Data</a></li>
- <li> <a
href="/tutorials/map-reduce/clustering/fuzzy-k-means-commandline.html">Fuzzy
K-Means from the Commandline</a></li>
- <li> <a
href="/tutorials/map-reduce/clustering/k-means-commandline.html">K-Means from
the Commandline</a></li>
- <li> <a
href="/tutorials/map-reduce/clustering/lda-commandline.html">LDA from the
Commandline</a></li>
- <li> <a
href="/tutorials/map-reduce/clustering/viewing-results.html">Viewing
Results</a></li>
- <li> <a
href="/tutorials/map-reduce/clustering/visualizing-sample-clusters.html">Visualizing
Sample Clusters</a></li>
- </ul>
- </div>
- <a href="#misc" class="list-group-item list-group-item-success"
data-toggle="collapse" data-parent="#MrTutorialMenu"><b>Miscelaneous</b><i
class="fa fa-caret-down"></i></a>
- <div class="collapse" id="misc">
- <ul class="nav sidebar-nav">
- <li> <a
href="/tutorials/map-reduce/misc/mr---map-reduce.html">MR Map-Reduce</a></li>
- <li> <a
href="/tutorials/map-reduce/misc/parallel-frequent-pattern-mining.html">Parallel
Frequent Pattern Mining</a></li>
- <li> <a
href="/tutorials/map-reduce/misc/using-mahout-with-python-via-jpype.html">Using
Mahout (Map Reduce) with Python via Jpype</a></li>
- </ul>
- </div>
- </div>
-</div>
+ <!--</ul>-->
+ </div><!-- /.navbar-collapse -->
</div>
+</nav>
- <div class="col-xs-8">
- <div class="page-header">
- <h1>CCOs with Last.fm </h1>
- </div>
- <p>Most reccomender examples utilize the MovieLense dataset, but that
relies only on ratings (which makes the recommender being demonstrated look
less trivial). Right next to the MovieLense dataset is the LastFM data set.
The LastFM dataset has ratings by user, friends of the user, bands listened to
by user, and tags by user. This is the kind of exciting data set weâd like
to work with!</p>
+ <div class="container mt-5 pb-4">
+
+ <div class="row">
+
+ <div class="col-lg-8">
+ <p>Most reccomender examples utilize the MovieLense dataset, but that
relies only on ratings (which makes the recommender being demonstrated look
less trivial). Right next to the MovieLense dataset is the LastFM data set.
The LastFM dataset has ratings by user, friends of the user, bands listened to
by user, and tags by user. This is the kind of exciting data set weâd like
to work with!</p>
<p>Start by downloading the LastFM dataset from
http://files.grouplens.org/datasets/hetrec2011/hetrec2011-lastfm-2k.zip</p>
<p>Iâm going to assume youâve unzipped them to /path/to/lastfm/*
-Weâre going to use a new trick for creating our IndexedDataSets, the
<code>apply</code> function. <code>apply</code> takes an <code>RDD[(String,
String)]</code> that is an RDD of tuples where both elements are strings. We
load RDDs, and use Spark to manipulate the RDDs into this form. The files from
LastFM are tab seperated- but it should be noted, that this could easily be
done from log files, but would just take a touch more Spark-Fu.</p>
+Weâre going to use a new trick for creating our IndexedDataSets, the <code
class="highlighter-rouge">apply</code> function. <code
class="highlighter-rouge">apply</code> takes an <code
class="highlighter-rouge">RDD[(String, String)]</code> that is an RDD of tuples
where both elements are strings. We load RDDs, and use Spark to manipulate the
RDDs into this form. The files from LastFM are tab seperated- but it should be
noted, that this could easily be done from log files, but would just take a
touch more Spark-Fu.</p>
<p>The second important thing to note is that the first element in each tuple
is going to be the rows in the resulting matrix, the second element will be the
column, and at that position there will be a one. The BiDictionary will
automatically be created from the strings.
For those following along at home- <a href="cco-lastfm.scala">the full Scala
worksheet</a> might be easier than copying and pasting
from this page.</p>
-<pre><code>import
org.apache.mahout.sparkbindings.indexeddataset.IndexedDatasetSpark
-
-val userTagsRDD = sc.textFile("/path/to/lastfm/user_taggedartists.dat")
-.map(line => line.split("\t"))
-.map(a => (a(0), a(2)))
-.filter(_._1 != "userID")
-val userTagsIDS = IndexedDatasetSpark.apply(userTagsRDD)(sc)
-
-val userArtistsRDD = sc.textFile("/path/to/lastfm/user_artists.dat")
-.map(line => line.split("\t"))
-.map(a => (a(0), a(1)))
-.filter(_._1 != "userID")
-val userArtistsIDS = IndexedDatasetSpark.apply(userArtistsRDD)(sc)
-
-val userFriendsRDD = sc.textFile("/path/to/lastfm/user_friends.dat")
-.map(line => line.split("\t"))
-.map(a => (a(0), a(1)))
-.filter(_._1 != "userID")
-val userFriendsIDS = IndexedDatasetSpark.apply(userFriendsRDD)(sc)
+<div class="language-scala highlighter-rouge"><pre
class="highlight"><code><span class="k">import</span> <span
class="nn">org.apache.mahout.sparkbindings.indexeddataset.IndexedDatasetSpark</span>
+
+<span class="k">val</span> <span class="n">userTagsRDD</span> <span
class="k">=</span> <span class="n">sc</span><span class="o">.</span><span
class="n">textFile</span><span class="o">(</span><span
class="s">"/path/to/lastfm/user_taggedartists.dat"</span><span
class="o">)</span>
+<span class="o">.</span><span class="n">map</span><span
class="o">(</span><span class="n">line</span> <span class="k">=></span>
<span class="n">line</span><span class="o">.</span><span
class="n">split</span><span class="o">(</span><span class="s">"\t"</span><span
class="o">))</span>
+<span class="o">.</span><span class="n">map</span><span
class="o">(</span><span class="n">a</span> <span class="k">=></span> <span
class="o">(</span><span class="n">a</span><span class="o">(</span><span
class="mi">0</span><span class="o">),</span> <span class="n">a</span><span
class="o">(</span><span class="mi">2</span><span class="o">)))</span>
+<span class="o">.</span><span class="n">filter</span><span
class="o">(</span><span class="k">_</span><span class="o">.</span><span
class="n">_1</span> <span class="o">!=</span> <span
class="s">"userID"</span><span class="o">)</span>
+<span class="k">val</span> <span class="n">userTagsIDS</span> <span
class="k">=</span> <span class="nc">IndexedDatasetSpark</span><span
class="o">.</span><span class="n">apply</span><span class="o">(</span><span
class="n">userTagsRDD</span><span class="o">)(</span><span
class="n">sc</span><span class="o">)</span>
+
+<span class="k">val</span> <span class="n">userArtistsRDD</span> <span
class="k">=</span> <span class="n">sc</span><span class="o">.</span><span
class="n">textFile</span><span class="o">(</span><span
class="s">"/path/to/lastfm/user_artists.dat"</span><span class="o">)</span>
+
<span class="o">.</span><span class="n">map</span><span
class="o">(</span><span class="n">line</span> <span class="k">=></span>
<span class="n">line</span><span class="o">.</span><span
class="n">split</span><span class="o">(</span><span class="s">"\t"</span><span
class="o">))</span>
+
<span class="o">.</span><span class="n">map</span><span
class="o">(</span><span class="n">a</span> <span class="k">=></span> <span
class="o">(</span><span class="n">a</span><span class="o">(</span><span
class="mi">0</span><span class="o">),</span> <span class="n">a</span><span
class="o">(</span><span class="mi">1</span><span class="o">)))</span>
+
<span class="o">.</span><span class="n">filter</span><span
class="o">(</span><span class="k">_</span><span class="o">.</span><span
class="n">_1</span> <span class="o">!=</span> <span
class="s">"userID"</span><span class="o">)</span>
+
+<span class="k">val</span> <span class="n">userArtistsIDS</span> <span
class="k">=</span> <span class="nc">IndexedDatasetSpark</span><span
class="o">.</span><span class="n">apply</span><span class="o">(</span><span
class="n">userArtistsRDD</span><span class="o">)(</span><span
class="n">sc</span><span class="o">)</span>
+
+<span class="k">val</span> <span class="n">userFriendsRDD</span> <span
class="k">=</span> <span class="n">sc</span><span class="o">.</span><span
class="n">textFile</span><span class="o">(</span><span
class="s">"/path/to/lastfm/user_friends.dat"</span><span class="o">)</span>
+ <span class="o">.</span><span
class="n">map</span><span class="o">(</span><span class="n">line</span> <span
class="k">=></span> <span class="n">line</span><span class="o">.</span><span
class="n">split</span><span class="o">(</span><span class="s">"\t"</span><span
class="o">))</span>
+ <span class="o">.</span><span
class="n">map</span><span class="o">(</span><span class="n">a</span> <span
class="k">=></span> <span class="o">(</span><span class="n">a</span><span
class="o">(</span><span class="mi">0</span><span class="o">),</span> <span
class="n">a</span><span class="o">(</span><span class="mi">1</span><span
class="o">)))</span>
+ <span class="o">.</span><span
class="n">filter</span><span class="o">(</span><span class="k">_</span><span
class="o">.</span><span class="n">_1</span> <span class="o">!=</span> <span
class="s">"userID"</span><span class="o">)</span>
+
+<span class="k">val</span> <span class="n">userFriendsIDS</span> <span
class="k">=</span> <span class="nc">IndexedDatasetSpark</span><span
class="o">.</span><span class="n">apply</span><span class="o">(</span><span
class="n">userFriendsRDD</span><span class="o">)(</span><span
class="n">sc</span><span class="o">)</span>
</code></pre>
+</div>
<p>How much easier was that?! In each RDD creations we:</p>
<p>Load our data using sc.textFile</p>
-<pre><code>sc.textFile("/path/to/lastfm/user_taggedartists.dat")
+<div class="highlighter-rouge"><pre
class="highlight"><code>sc.textFile("/path/to/lastfm/user_taggedartists.dat")
</code></pre>
+</div>
<p>Split the data into an array based on tabs (\t)</p>
-<pre><code>.map(line => line.split("\t"))
+<div class="highlighter-rouge"><pre class="highlight"><code>.map(line =>
line.split("\t"))
</code></pre>
+</div>
<p>Pull the userID column into the first position of the tuple, and the other
attribute we want into the second position.</p>
-<pre><code>.map(a => (a(0), a(1)))
+<div class="highlighter-rouge"><pre class="highlight"><code>.map(a =>
(a(0), a(1)))
</code></pre>
+</div>
<p>Remove the header (the only line that will have âuserIDâ in that
position)</p>
-<pre><code>.filter(_._1 != "userID")
+<div class="highlighter-rouge"><pre class="highlight"><code>.filter(_._1 !=
"userID")
</code></pre>
+</div>
-<p>Then we easily create an IndexedDataSet using the <code>apply</code>
method.
+<p>Then we easily create an IndexedDataSet using the <code
class="highlighter-rouge">apply</code> method.
val userTagsIDS = IndexedDatasetSpark.apply(userTagsRDD)(sc)
-Note the <code>(sc)</code> at the end. You may or may not need that.
<code>sc</code> is the SparkContext and should be passed as an implicit
parameter, however the REPL environment (e.g. Mahout Shell or notebooks) has a
hard time with the implicits, so I had to pass it explicitly.</p>
+Note the <code class="highlighter-rouge">(sc)</code> at the end. You may or
may not need that. <code class="highlighter-rouge">sc</code> is the
SparkContext and should be passed as an implicit parameter, however the REPL
environment (e.g. Mahout Shell or notebooks) has a hard time with the
implicits, so I had to pass it explicitly.</p>
<p>Now we compute our co-occurrence matrices:</p>
-<pre><code class="language-scala">import
org.apache.mahout.math.cf.SimilarityAnalysis
+<div class="language-scala highlighter-rouge"><pre
class="highlight"><code><span class="k">import</span> <span
class="nn">org.apache.mahout.math.cf.SimilarityAnalysis</span>
-val artistReccosLlrDrmListByArtist = SimilarityAnalysis.cooccurrencesIDSs(
-Array(userArtistsIDS, userTagsIDS, userFriendsIDS),
-maxInterestingItemsPerThing = 20,
-maxNumInteractions = 500,
-randomSeed = 1234)
+<span class="k">val</span> <span
class="n">artistReccosLlrDrmListByArtist</span> <span class="k">=</span> <span
class="nc">SimilarityAnalysis</span><span class="o">.</span><span
class="n">cooccurrencesIDSs</span><span class="o">(</span>
+ <span class="nc">Array</span><span
class="o">(</span><span class="n">userArtistsIDS</span><span class="o">,</span>
<span class="n">userTagsIDS</span><span class="o">,</span> <span
class="n">userFriendsIDS</span><span class="o">),</span>
+ <span
class="n">maxInterestingItemsPerThing</span> <span class="k">=</span> <span
class="mi">20</span><span class="o">,</span>
+ <span
class="n">maxNumInteractions</span> <span class="k">=</span> <span
class="mi">500</span><span class="o">,</span>
+ <span
class="n">randomSeed</span> <span class="k">=</span> <span
class="mi">1234</span><span class="o">)</span>
</code></pre>
+</div>
<p>Letâs see an example of how this would work-</p>
@@ -352,52 +246,54 @@ randomSeed = 1234)
<p>First I load, and create incore maps from the mapping files:</p>
-<pre><code class="language-scala">val artistMap =
sc.textFile("/path/to/lastfm/artists.dat")
- .map(line => line.split("\t"))
- .map(a => (a(1), a(0)))
- .filter(_._1 != "name")
- .collect
- .toMap
+<div class="language-scala highlighter-rouge"><pre
class="highlight"><code><span class="k">val</span> <span
class="n">artistMap</span> <span class="k">=</span> <span
class="n">sc</span><span class="o">.</span><span class="n">textFile</span><span
class="o">(</span><span class="s">"/path/to/lastfm/artists.dat"</span><span
class="o">)</span>
+ <span class="o">.</span><span class="n">map</span><span
class="o">(</span><span class="n">line</span> <span class="k">=></span>
<span class="n">line</span><span class="o">.</span><span
class="n">split</span><span class="o">(</span><span class="s">"\t"</span><span
class="o">))</span>
+ <span class="o">.</span><span class="n">map</span><span
class="o">(</span><span class="n">a</span> <span class="k">=></span> <span
class="o">(</span><span class="n">a</span><span class="o">(</span><span
class="mi">1</span><span class="o">),</span> <span class="n">a</span><span
class="o">(</span><span class="mi">0</span><span class="o">)))</span>
+ <span class="o">.</span><span class="n">filter</span><span
class="o">(</span><span class="k">_</span><span class="o">.</span><span
class="n">_1</span> <span class="o">!=</span> <span
class="s">"name"</span><span class="o">)</span>
+ <span class="o">.</span><span class="n">collect</span>
+ <span class="o">.</span><span class="n">toMap</span>
-val tagsMap = sc.textFile("/path/tolastfm/tags.dat")
- .map(line => line.split("\t"))
- .map(a => (a(1), a(0)))
- .filter(_._1 != "tagValue")
- .collect
- .toMap
+<span class="k">val</span> <span class="n">tagsMap</span> <span
class="k">=</span> <span class="n">sc</span><span class="o">.</span><span
class="n">textFile</span><span class="o">(</span><span
class="s">"/path/tolastfm/tags.dat"</span><span class="o">)</span>
+ <span class="o">.</span><span class="n">map</span><span
class="o">(</span><span class="n">line</span> <span class="k">=></span>
<span class="n">line</span><span class="o">.</span><span
class="n">split</span><span class="o">(</span><span class="s">"\t"</span><span
class="o">))</span>
+ <span class="o">.</span><span class="n">map</span><span
class="o">(</span><span class="n">a</span> <span class="k">=></span> <span
class="o">(</span><span class="n">a</span><span class="o">(</span><span
class="mi">1</span><span class="o">),</span> <span class="n">a</span><span
class="o">(</span><span class="mi">0</span><span class="o">)))</span>
+ <span class="o">.</span><span class="n">filter</span><span
class="o">(</span><span class="k">_</span><span class="o">.</span><span
class="n">_1</span> <span class="o">!=</span> <span
class="s">"tagValue"</span><span class="o">)</span>
+ <span class="o">.</span><span class="n">collect</span>
+ <span class="o">.</span><span class="n">toMap</span>
</code></pre>
+</div>
-<p>This will create some <code>Map</code>s that I can use to type readable
names for the artist and tags to create my âhistoryâ.</p>
-
-<pre><code class="language-scala">val kilroyUserArtists = svec(
(userArtistsIDS.columnIDs.get(artistMap("Beck")).get, 1) ::
- (userArtistsIDS.columnIDs.get(artistMap("David Bowie")).get, 1) ::
- (userArtistsIDS.columnIDs.get(artistMap("Gary Numan")).get, 1) ::
- (userArtistsIDS.columnIDs.get(artistMap("Less Than Jake")).get, 1) ::
- (userArtistsIDS.columnIDs.get(artistMap("Lou Reed")).get, 1) ::
- (userArtistsIDS.columnIDs.get(artistMap("Parliament")).get, 1) ::
- (userArtistsIDS.columnIDs.get(artistMap("Radiohead")).get, 1) ::
- (userArtistsIDS.columnIDs.get(artistMap("Seu Jorge")).get, 1) ::
- (userArtistsIDS.columnIDs.get(artistMap("The Skatalites")).get, 1) ::
- (userArtistsIDS.columnIDs.get(artistMap("Reverend Horton Heat")).get, 1) ::
- (userArtistsIDS.columnIDs.get(artistMap("Talking Heads")).get, 1) ::
- (userArtistsIDS.columnIDs.get(artistMap("Tom Waits")).get, 1) ::
- (userArtistsIDS.columnIDs.get(artistMap("Waylon Jennings")).get, 1) ::
- (userArtistsIDS.columnIDs.get(artistMap("Wu-Tang Clan")).get, 1) :: Nil,
- cardinality = userArtistsIDS.columnIDs.size
-)
-
-
-
-val kilroyUserTags = svec(
- (userTagsIDS.columnIDs.get(tagsMap("classical")).get, 1) ::
- (userTagsIDS.columnIDs.get(tagsMap("skacore")).get, 1) ::
- (userTagsIDS.columnIDs.get(tagsMap("why on earth is this just a bonus
track")).get, 1) ::
- (userTagsIDS.columnIDs.get(tagsMap("punk rock")).get, 1) :: Nil,
- cardinality = userTagsIDS.columnIDs.size)
+<p>This will create some <code class="highlighter-rouge">Map</code>s that I
can use to type readable names for the artist and tags to create my
âhistoryâ.</p>
+
+<div class="language-scala highlighter-rouge"><pre
class="highlight"><code><span class="k">val</span> <span
class="n">kilroyUserArtists</span> <span class="k">=</span> <span
class="n">svec</span><span class="o">(</span> <span class="o">(</span><span
class="n">userArtistsIDS</span><span class="o">.</span><span
class="n">columnIDs</span><span class="o">.</span><span
class="n">get</span><span class="o">(</span><span
class="n">artistMap</span><span class="o">(</span><span
class="s">"Beck"</span><span class="o">)).</span><span
class="n">get</span><span class="o">,</span> <span class="mi">1</span><span
class="o">)</span> <span class="o">::</span>
+ <span class="o">(</span><span class="n">userArtistsIDS</span><span
class="o">.</span><span class="n">columnIDs</span><span class="o">.</span><span
class="n">get</span><span class="o">(</span><span
class="n">artistMap</span><span class="o">(</span><span class="s">"David
Bowie"</span><span class="o">)).</span><span class="n">get</span><span
class="o">,</span> <span class="mi">1</span><span class="o">)</span> <span
class="o">::</span>
+ <span class="o">(</span><span class="n">userArtistsIDS</span><span
class="o">.</span><span class="n">columnIDs</span><span class="o">.</span><span
class="n">get</span><span class="o">(</span><span
class="n">artistMap</span><span class="o">(</span><span class="s">"Gary
Numan"</span><span class="o">)).</span><span class="n">get</span><span
class="o">,</span> <span class="mi">1</span><span class="o">)</span> <span
class="o">::</span>
+ <span class="o">(</span><span class="n">userArtistsIDS</span><span
class="o">.</span><span class="n">columnIDs</span><span class="o">.</span><span
class="n">get</span><span class="o">(</span><span
class="n">artistMap</span><span class="o">(</span><span class="s">"Less Than
Jake"</span><span class="o">)).</span><span class="n">get</span><span
class="o">,</span> <span class="mi">1</span><span class="o">)</span> <span
class="o">::</span>
+ <span class="o">(</span><span class="n">userArtistsIDS</span><span
class="o">.</span><span class="n">columnIDs</span><span class="o">.</span><span
class="n">get</span><span class="o">(</span><span
class="n">artistMap</span><span class="o">(</span><span class="s">"Lou
Reed"</span><span class="o">)).</span><span class="n">get</span><span
class="o">,</span> <span class="mi">1</span><span class="o">)</span> <span
class="o">::</span>
+ <span class="o">(</span><span class="n">userArtistsIDS</span><span
class="o">.</span><span class="n">columnIDs</span><span class="o">.</span><span
class="n">get</span><span class="o">(</span><span
class="n">artistMap</span><span class="o">(</span><span
class="s">"Parliament"</span><span class="o">)).</span><span
class="n">get</span><span class="o">,</span> <span class="mi">1</span><span
class="o">)</span> <span class="o">::</span>
+ <span class="o">(</span><span class="n">userArtistsIDS</span><span
class="o">.</span><span class="n">columnIDs</span><span class="o">.</span><span
class="n">get</span><span class="o">(</span><span
class="n">artistMap</span><span class="o">(</span><span
class="s">"Radiohead"</span><span class="o">)).</span><span
class="n">get</span><span class="o">,</span> <span class="mi">1</span><span
class="o">)</span> <span class="o">::</span>
+ <span class="o">(</span><span class="n">userArtistsIDS</span><span
class="o">.</span><span class="n">columnIDs</span><span class="o">.</span><span
class="n">get</span><span class="o">(</span><span
class="n">artistMap</span><span class="o">(</span><span class="s">"Seu
Jorge"</span><span class="o">)).</span><span class="n">get</span><span
class="o">,</span> <span class="mi">1</span><span class="o">)</span> <span
class="o">::</span>
+ <span class="o">(</span><span class="n">userArtistsIDS</span><span
class="o">.</span><span class="n">columnIDs</span><span class="o">.</span><span
class="n">get</span><span class="o">(</span><span
class="n">artistMap</span><span class="o">(</span><span class="s">"The
Skatalites"</span><span class="o">)).</span><span class="n">get</span><span
class="o">,</span> <span class="mi">1</span><span class="o">)</span> <span
class="o">::</span>
+ <span class="o">(</span><span class="n">userArtistsIDS</span><span
class="o">.</span><span class="n">columnIDs</span><span class="o">.</span><span
class="n">get</span><span class="o">(</span><span
class="n">artistMap</span><span class="o">(</span><span class="s">"Reverend
Horton Heat"</span><span class="o">)).</span><span class="n">get</span><span
class="o">,</span> <span class="mi">1</span><span class="o">)</span> <span
class="o">::</span>
+ <span class="o">(</span><span class="n">userArtistsIDS</span><span
class="o">.</span><span class="n">columnIDs</span><span class="o">.</span><span
class="n">get</span><span class="o">(</span><span
class="n">artistMap</span><span class="o">(</span><span class="s">"Talking
Heads"</span><span class="o">)).</span><span class="n">get</span><span
class="o">,</span> <span class="mi">1</span><span class="o">)</span> <span
class="o">::</span>
+ <span class="o">(</span><span class="n">userArtistsIDS</span><span
class="o">.</span><span class="n">columnIDs</span><span class="o">.</span><span
class="n">get</span><span class="o">(</span><span
class="n">artistMap</span><span class="o">(</span><span class="s">"Tom
Waits"</span><span class="o">)).</span><span class="n">get</span><span
class="o">,</span> <span class="mi">1</span><span class="o">)</span> <span
class="o">::</span>
+ <span class="o">(</span><span class="n">userArtistsIDS</span><span
class="o">.</span><span class="n">columnIDs</span><span class="o">.</span><span
class="n">get</span><span class="o">(</span><span
class="n">artistMap</span><span class="o">(</span><span class="s">"Waylon
Jennings"</span><span class="o">)).</span><span class="n">get</span><span
class="o">,</span> <span class="mi">1</span><span class="o">)</span> <span
class="o">::</span>
+ <span class="o">(</span><span class="n">userArtistsIDS</span><span
class="o">.</span><span class="n">columnIDs</span><span class="o">.</span><span
class="n">get</span><span class="o">(</span><span
class="n">artistMap</span><span class="o">(</span><span class="s">"Wu-Tang
Clan"</span><span class="o">)).</span><span class="n">get</span><span
class="o">,</span> <span class="mi">1</span><span class="o">)</span> <span
class="o">::</span> <span class="nc">Nil</span><span class="o">,</span>
+ <span class="n">cardinality</span> <span class="k">=</span> <span
class="n">userArtistsIDS</span><span class="o">.</span><span
class="n">columnIDs</span><span class="o">.</span><span class="n">size</span>
+<span class="o">)</span>
+
+
+
+<span class="k">val</span> <span class="n">kilroyUserTags</span> <span
class="k">=</span> <span class="n">svec</span><span class="o">(</span>
+ <span class="o">(</span><span class="n">userTagsIDS</span><span
class="o">.</span><span class="n">columnIDs</span><span class="o">.</span><span
class="n">get</span><span class="o">(</span><span class="n">tagsMap</span><span
class="o">(</span><span class="s">"classical"</span><span
class="o">)).</span><span class="n">get</span><span class="o">,</span> <span
class="mi">1</span><span class="o">)</span> <span class="o">::</span>
+ <span class="o">(</span><span class="n">userTagsIDS</span><span
class="o">.</span><span class="n">columnIDs</span><span class="o">.</span><span
class="n">get</span><span class="o">(</span><span class="n">tagsMap</span><span
class="o">(</span><span class="s">"skacore"</span><span
class="o">)).</span><span class="n">get</span><span class="o">,</span> <span
class="mi">1</span><span class="o">)</span> <span class="o">::</span>
+ <span class="o">(</span><span class="n">userTagsIDS</span><span
class="o">.</span><span class="n">columnIDs</span><span class="o">.</span><span
class="n">get</span><span class="o">(</span><span class="n">tagsMap</span><span
class="o">(</span><span class="s">"why on earth is this just a bonus
track"</span><span class="o">)).</span><span class="n">get</span><span
class="o">,</span> <span class="mi">1</span><span class="o">)</span> <span
class="o">::</span>
+ <span class="o">(</span><span class="n">userTagsIDS</span><span
class="o">.</span><span class="n">columnIDs</span><span class="o">.</span><span
class="n">get</span><span class="o">(</span><span class="n">tagsMap</span><span
class="o">(</span><span class="s">"punk rock"</span><span
class="o">)).</span><span class="n">get</span><span class="o">,</span> <span
class="mi">1</span><span class="o">)</span> <span class="o">::</span> <span
class="nc">Nil</span><span class="o">,</span>
+ <span class="n">cardinality</span> <span class="k">=</span> <span
class="n">userTagsIDS</span><span class="o">.</span><span
class="n">columnIDs</span><span class="o">.</span><span
class="n">size</span><span class="o">)</span>
</code></pre>
+</div>
-<p>So what we have then is me typing in a name to <code>artistMap</code> where
the keys are human readable names of my favorite bands, which returns the value
which is the LastFM ID, which in turn is the key in the BiDictionary map, and
returns the matrix position. Iâm making a sparse vector where I want the
index at the value I just fetched (which in an awry way refers to the artist I
specified) to have the value 1.</p>
+<p>So what we have then is me typing in a name to <code
class="highlighter-rouge">artistMap</code> where the keys are human readable
names of my favorite bands, which returns the value which is the LastFM ID,
which in turn is the key in the BiDictionary map, and returns the matrix
position. Iâm making a sparse vector where I want the index at the value I
just fetched (which in an awry way refers to the artist I specified) to have
the value 1.</p>
<p>Same idea for the tags.</p>
@@ -405,48 +301,42 @@ val kilroyUserTags = svec(
<p>val kilroysRecs = (artistReccosLlrDrmListByArtist(0).matrix %<em>%
kilroyUserArtists + artistReccosLlrDrmListByArtist(1).matrix %</em>%
kilroyUserTags).collect
Finally letâs sort that vector out and get some user ids and strengths.</p>
-<pre><code class="language-scala">import
org.apache.mahout.math.scalabindings.MahoutCollections._
-import collection._
-import JavaConversions._
+<div class="language-scala highlighter-rouge"><pre
class="highlight"><code><span class="k">import</span> <span
class="nn">org.apache.mahout.math.scalabindings.MahoutCollections._</span>
+<span class="k">import</span> <span class="nn">collection._</span>
+<span class="k">import</span> <span class="nn">JavaConversions._</span>
-// Which Users I should Be Friends with.
-println(kilroysRecs(::, 0).toMap.toList.sortWith(_._2 > _._2).take(5))
+<span class="c1">// Which Users I should Be Friends with.
+</span><span class="n">println</span><span class="o">(</span><span
class="n">kilroysRecs</span><span class="o">(::,</span> <span
class="mi">0</span><span class="o">).</span><span class="n">toMap</span><span
class="o">.</span><span class="n">toList</span><span class="o">.</span><span
class="n">sortWith</span><span class="o">(</span><span class="k">_</span><span
class="o">.</span><span class="n">_2</span> <span class="o">></span> <span
class="k">_</span><span class="o">.</span><span class="n">_2</span><span
class="o">).</span><span class="n">take</span><span class="o">(</span><span
class="mi">5</span><span class="o">))</span>
</code></pre>
+</div>
-<p><code>kilroysRecs</code> is actually a one column matrix, so we take that,
and the convert it into something we can sort. We then take the top 5
suggestions. Keep in mind, this will return the Mahout user ID, which you
would also have to reverse map back to the lastFM userID. The lastFM userID is
just another Integer, and not particularly exciting so I left that out.</p>
+<p><code class="highlighter-rouge">kilroysRecs</code> is actually a one column
matrix, so we take that, and the convert it into something we can sort. We then
take the top 5 suggestions. Keep in mind, this will return the Mahout user ID,
which you would also have to reverse map back to the lastFM userID. The lastFM
userID is just another Integer, and not particularly exciting so I left that
out.</p>
<p>If you wanted to recommend artists like a normal recommendation engine- you
would change the first position in all of the input matrices to be
âartistIDâ. This is left as an exercise to the user.</p>
<p><a href="cco-lastfm.scala">Full Scala Worksheet</a></p>
</div>
-</div>
-
- </div>
-</div>
-
-<div id="footer">
- <div class="container">
- <p>© 2017 Apache Mahout
- with help from <a href="http://jekyllbootstrap.com" target="_blank"
title="The Definitive Jekyll Blogging Framework">Jekyll Bootstrap</a>
- and <a href="http://getbootstrap.com" target="_blank">Bootstrap</a>
- </p>
</div>
-</div>
-
-
+</div>
+ <footer class="footer bg-light">
+ <div class="container text-center small">
+ Copyright © 2014-2017 The Apache Software Foundation, Licensed
under the Apache License, Version 2.0.
+ </div>
+</footer>
+ <script src="/assets/vendor/jquery/jquery-slim.min.js"></script>
+ <script src="/assets/vendor/popper/popper.min.js"></script>
+ <script src="/assets/vendor/bootstrap/js/bootstrap.min.js"></script>
+ <script src="/assets/header.js"></script>
+ <script
src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML"
type="text/javascript"></script>
-<!-- Latest compiled and minified JavaScript, requires jQuery 1.x (2.x not
supported in IE8) -->
-<!-- Placed at the end of the document so the pages load faster -->
-<script
src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
-<script src="/assets/themes/mahout3/js/bootstrap.min.js"></script>
</body>
-</html>
+</html>