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>&nbsp;&nbsp;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>&nbsp;&nbsp;<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>&nbsp;&nbsp;<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>&nbsp;&nbsp;<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>&nbsp;&nbsp;<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>&nbsp;&nbsp;<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>&nbsp;&nbsp;<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>&nbsp;&nbsp;<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>&nbsp;&nbsp;<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 =&gt; line.split("\t"))
-.map(a =&gt; (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 =&gt; line.split("\t"))
-.map(a =&gt; (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 =&gt; line.split("\t"))
-.map(a =&gt; (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">=&gt;</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">=&gt;</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">=&gt;</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">=&gt;</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">=&gt;</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">=&gt;</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 =&gt; line.split("\t"))
+<div class="highlighter-rouge"><pre class="highlight"><code>.map(line =&gt; 
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 =&gt; (a(0), a(1)))
+<div class="highlighter-rouge"><pre class="highlight"><code>.map(a =&gt; 
(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 =&gt; line.split("\t"))
-  .map(a =&gt; (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">=&gt;</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">=&gt;</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 =&gt; line.split("\t"))
-  .map(a =&gt; (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">=&gt;</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">=&gt;</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 &gt; _._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">&gt;</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>&copy; 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 &copy; 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>

Reply via email to