You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mahout.apache.org by bu...@apache.org on 2014/04/13 21:20:27 UTC

svn commit: r906046 [4/4] - in /websites/staging/mahout/trunk/content: ./ users/basics/ users/classification/ users/dim-reduction/ users/misc/ users/stuff/

Added: websites/staging/mahout/trunk/content/users/misc/using-mahout-with-python-via-jpype.html
==============================================================================
--- websites/staging/mahout/trunk/content/users/misc/using-mahout-with-python-via-jpype.html (added)
+++ websites/staging/mahout/trunk/content/users/misc/using-mahout-with-python-via-jpype.html Sun Apr 13 19:20:27 2014
@@ -0,0 +1,454 @@
+<!DOCTYPE html>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+  <title>Apache Mahout: Scalable machine learning and data mining</title>
+  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+  <meta name="Distribution" content="Global">
+  <meta name="Robots" content="index,follow">
+  <meta name="keywords" content="apache, apache hadoop, apache lucene,
+        business data mining, cluster analysis,
+        collaborative filtering, data extraction, data filtering, data framework, data integration,
+        data matching, data mining, data mining algorithms, data mining analysis, data mining data,
+        data mining introduction, data mining software,
+        data mining techniques, data representation, data set, datamining,
+        feature extraction, fuzzy k means, genetic algorithm, hadoop,
+        hierarchical clustering, high dimensional, introduction to data mining, kmeans,
+        knowledge discovery, learning approach, learning approaches, learning methods,
+        learning techniques, lucene, machine learning, machine translation, mahout apache,
+        mahout taste, map reduce hadoop, mining data, mining methods, naive bayes,
+        natural language processing,
+        supervised, text mining, time series data, unsupervised, web data mining">
+  <link rel="shortcut icon" type="image/x-icon" href="http://mahout.apache.org/images/favicon.ico">
+  <script type="text/javascript" src="/js/prototype.js"></script>
+  <script type="text/javascript" src="/js/effects.js"></script>
+  <script type="text/javascript" src="/js/search.js"></script>
+  <script type="text/javascript" src="/js/slides.js"></script>
+
+  <link href="/css/bootstrap.min.css" rel="stylesheet" media="screen">
+  <link href="/css/bootstrap-responsive.css" rel="stylesheet">
+  <link rel="stylesheet" href="/css/global.css" type="text/css">
+	
+  <!-- mathJax stuff -- use `\(...\)` for inline style math in markdown -->
+	<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"
+	  src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
+	</script>	
+</head>
+
+<body id="home" data-twttr-rendered="true">
+  <div id="wrap">
+   <div id="header">
+    <div id="logo"><a href="/overview.html"></a></div>
+  <div id="search">
+    <form id="search-form" action="http://www.google.com/search" method="get" class="navbar-search pull-right">    
+      <input value="http://mahout.apache.org" name="sitesearch" type="hidden">
+      <input class="search-query" name="q" id="query" type="text">
+      <input id="submission" type="image" src="/images/mahout-lupe.png" alt="Search" />
+    </form>
+  </div>
+
+    <div class="navbar navbar-inverse" style="position:absolute;top:133px;padding-right:0px;padding-left:0px;">
+      <div class="navbar-inner" style="border: none; background: #999; border: none; border-radius: 0px;">
+        <div class="container">
+          <button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
+            <span class="icon-bar"></span>
+            <span class="icon-bar"></span>
+            <span class="icon-bar"></span>
+          </button>
+          <!-- <a class="brand" href="#">Apache Community Development Project</a> -->
+          <div class="nav-collapse collapse">
+            <ul class="nav">
+              <li><a href="/">Home</a></li>
+              <li class="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown">General<b class="caret"></b></a>
+                <ul class="dropdown-menu">
+                  <li><a href="/general/downloads.html">Downloads</a>
+                  <li><a href="/general/who-we-are.html">Who we are</a>
+                  <li><a href="/general/mailing-lists,-irc-and-archives.html">Mailing Lists</a> 
+                  <li><a href="/general/books-tutorials-and-talks.html">Books, Tutorials, Talks</a></li>
+                  <li><a href="/general/powered-by-mahout.html">Powered By Mahout</a>
+                  <li><a href="/general/professional-support.html">Professional Support</a>
+                  <li class="divider"></li>
+                  <li class="nav-header">Resources</li>
+                  <li><a href="/general/reference-reading.html">Reference Reading</a>
+		  <li><a href="/general/faq.html">FAQ</a>
+		  <li class="divider"></li>
+		  <li class="nav-header">Legal</li>
+		  <li><a href="http://www.apache.org/licenses/">License</a></li>
+		  <li><a href="http://www.apache.org/security/">Security</a></li>
+                  <li><a href="/general/privacy-policy.html">Privacy Policy</a>
+                </ul>
+              </li>
+              <li class="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown">Developers<b class="caret"></b></a>
+                <ul class="dropdown-menu">
+                  <li><a href="/developers/developer-resources.html">Developer resources</a></li>
+                  <li><a href="/developers/version-control.html">Version control</a></li>
+                  <li><a href="/developers/buildingmahout.html">Build from source</a></li>
+                  <li><a href="/developers/issue-tracker.html">Issue tracker</a></li>
+      		  <li><a href="https://builds.apache.org/job/Mahout-Quality/" target="_blank">Code quality reports</a></li>
+                  <li class="divider"></li>
+                  <li class="nav-header">Contributions</li>
+                  <li><a href="/developers/how-to-contribute.html">How to contribute</a></li>
+                  <li><a href="/developers/how-to-become-a-committer.html">How to become a committer</a></li>
+                  <li><a href="/developers/gsoc.html">GSoC</a></li>
+                  <li class="divider"></li>
+                  <li class="nav-header">For committers</li>
+                  <li><a href="/developers/how-to-update-the-website.html">How to update the website</a></li>
+                  <li><a href="/developers/patch-check-list.html">Patch check list</a></li>
+                  <li><a href="/developers/how-to-release.html">How to release</a></li>
+                  <li><a href="/developers/thirdparty-dependencies.html">Third party dependencies</a></li>
+                </ul>
+               </li>
+               <li class="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown">Basics<b class="caret"></b></a>
+                 <ul class="dropdown-menu">
+                  <li><a href="/users/basics/algorithms.html">List of algorithms</a>
+                  <li><a href="/users/basics/quickstart.html">Quickstart</a>
+                  <li class="divider"></li>
+                  <li class="nav-header">Working with text</li>
+                  <li><a href="/users/basics/creating-vectors-from-text.html">Creating vectors from text</a>
+                  <li><a href="/users/basics/collocations.html">Collocations</a>
+                  <li class="divider"></li>
+                  <li class="nav-header">Dimensionality reduction</li>
+                  <li><a href="/users/basics/dimensional-reduction.html">Singular Value Decomposition</a></li>
+                  <li><a href="/users/dim-reduction/ssvd.html">Stochastic SVD</a></li>
+                  <li class="divider"></li>
+                  <li class="nav-header">Topic Models</li>      
+                  <li><a href="/users/clustering/latent-dirichlet-allocation.html">Latent Dirichlet Allocation</a></li>
+                  <li class="divider"></li>
+                  <li class="nav-header">Mahout On Spark</li>      
+                  <li><a href="/users/sparkbindings/home.html">Scala &amp; Spark Bindings *new*</a></li>
+                </ul>
+                 </li>
+              <li class="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown">Classification<b class="caret"></b></a>
+                <ul class="dropdown-menu">
+
+              		<li><a href="/users/classification/bayesian.html">Naive Bayes</a></li>
+                  <li><a href="/users/stuff/hidden-markov-models.html">Hidden Markov Models</a></li>
+                  <li><a href="/users/classification/logistic-regression.html">Logistic Regression</a></li>
+                  <li><a href="/users/stuff/partial-implementation.html">Random Forest</a></li>
+
+                  <li class="divider"></li>
+                  <li class="nav-header">Examples</li>
+                  <li><a href="/users/classification/wikipedia-bayes-example.html">Wikipedia example</a></li>
+                  <li><a href="/users/clustering/twenty-newsgroups.html">20 newsgroups example</a></li>
+                  <li><a href="/users/classification/breiman-example.html">Breiman example</a></li>
+                </ul></li>
+               <li class="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown">Clustering<b class="caret"></b></a>
+                <ul class="dropdown-menu">
+                <li><a href="/users/clustering/k-means-clustering.html">k-Means</a></li>
+                <li><a href="/users/clustering/canopy-clustering.html">Canopy</a></li>
+                <li><a href="/users/clustering/fuzzy-k-means.html">Fuzzy k-Means</a></li>
+                <li><a href="/users/clustering/spectral-clustering.html">Spectral Clustering</a></li>
+                <li class="divider"></li>
+                <li class="nav-header">Commandline usage</li>
+                <li><a href="/users/clustering/k-means-commandline.html">Options for k-Means</a></li>
+                <li><a href="/users/clustering/canopy-commandline.html">Options for Canopy</a></li>
+            		<li><a href="/users/clustering/fuzzy-k-means-commandline.html">Options for Fuzzy k-Means</a></li>
+                <li class="divider"></li>
+                <li class="nav-header">Examples</li>
+                <li><a href="/users/clustering/clustering-of-synthetic-control-data.html">Synthetic data</a></li>
+                <li class="divider"></li>
+                <li class="nav-header">Post processing</li>
+                <li><a href="/users/clustering/cluster-dumper.html">Cluster Dumper tool</a></li>
+                <li><a href="/users/clustering/visualizing-sample-clusters.html">Cluster visualisation</a></li>
+                </ul></li>
+                <li class="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown">Recommendations<b class="caret"></b></a>
+                <ul class="dropdown-menu">
+                <li><a href="/users/recommender/quickstart.html">Quickstart</a></li>
+                <li><a href="/users/recommender/userbased-5-minutes.html">A user-based recommender <br/>in 5 minutes</a></li>
+                <li><a href="/users/recommender/recommender-first-timer-faq.html">First Timer FAQ</a></li>
+	        <li><a href="/users/recommender/recommender-documentation.html">General</a></li>
+                </ul></li>
+           </ul>
+          </div><!--/.nav-collapse -->
+        </div>
+      </div>
+    </div>
+
+</div>
+
+ <div id="sidebar">
+  <div id="sidebar-wrap">
+    <h2>Twitter</h2>
+	<ul class="sidemenu">
+		<li>
+<a class="twitter-timeline" href="https://twitter.com/ApacheMahout" data-widget-id="422861673444028416">Tweets by @ApacheMahout</a>
+<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+"://platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script>
+</li>
+	</ul>
+    <h2>Apache Software Foundation</h2>
+    <ul class="sidemenu">
+      <li><a href="http://www.apache.org/foundation/how-it-works.html">How the ASF works</a></li>
+      <li><a href="http://www.apache.org/foundation/getinvolved.html">Get Involved</a></li>
+      <li><a href="http://www.apache.org/dev/">Developer Resources</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>
+    <h2>Related Projects</h2>
+    <ul class="sidemenu">
+      <li><a href="http://lucene.apache.org/">Lucene</a></li>
+      <li><a href="http://hadoop.apache.org/">Hadoop</a></li>
+    </ul>
+  </div>
+</div>
+
+  <div id="content-wrap" class="clearfix">
+   <div id="main">
+    <p><a name="UsingMahoutwithPythonviaJPype-overview"></a></p>
+<h1 id="mahout-over-jython-some-examples">Mahout over Jython - some examples</h1>
+<p>This tutorial provides some sample code illustrating how we can read and
+write sequence files containing Mahout vectors from Python using JPype.
+This tutorial is intended for people who want to use Python for analyzing
+and plotting Mahout data. Using Mahout from Python turns out to be quite
+easy.</p>
+<p>This tutorial concerns the use of cPython (cython) as opposed to Jython.
+JPython wasn't an option for me, because  (to the best of my knowledge)
+JPython doesn't work with Python extensions numpy, matplotlib, or h5py
+which I rely on heavily.</p>
+<p>The instructions below explain how to setup a python script to read and
+write the output of Mahout clustering.</p>
+<p>You will first need to download and install the JPype package for python.</p>
+<p>The first step to setting up JPype is determining the path to the dynamic
+library for the jvm ; on linux this will be a .so file on and on windows it
+will be a .dll.</p>
+<p>In your python script, create a global variable with the path to this dll</p>
+<p>Next we need to figure out how we need to set the classpath for mahout. The
+easiest way to do this is to edit the script in "bin/mahout" to print out
+the classpath. Add the line "echo $CLASSPATH" to the script somewhere after
+the comment "run it" (this is line 195 or so). Execute the script to print
+out the classpath.  Copy this output and paste it into a variable in your
+python script. The result for me looks like the following</p>
+<p>Now we can create a function to start the jvm in python using jype</p>
+<div class="codehilite"><pre><span class="n">jvm</span><span class="p">=</span><span class="n">None</span>
+<span class="n">def</span> <span class="n">start_jpype</span><span class="p">():</span>
+<span class="k">global</span> <span class="n">jvm</span>
+<span class="k">if</span> <span class="p">(</span><span class="n">jvm</span> <span class="n">is</span> <span class="n">None</span><span class="p">):</span>
+<span class="n">cpopt</span><span class="p">=</span>&quot;<span class="o">-</span><span class="n">Djava</span><span class="p">.</span><span class="n">class</span><span class="p">.</span><span class="n">path</span><span class="p">={</span><span class="n">cp</span><span class="p">}</span>&quot;<span class="p">.</span><span class="n">format</span><span class="p">(</span><span class="n">cp</span><span class="p">=</span><span class="n">classpath</span><span class="p">)</span>
+<span class="n">startJVM</span><span class="p">(</span><span class="n">jvmlib</span><span class="p">,</span>&quot;<span class="o">-</span><span class="n">ea</span>&quot;<span class="p">,</span><span class="n">cpopt</span><span class="p">)</span>
+<span class="n">jvm</span><span class="p">=</span>&quot;<span class="n">started</span>&quot;
+</pre></div>
+
+
+<p><a name="UsingMahoutwithPythonviaJPype-WritingNamedVectorstoSequenceFilesfromPython"></a></p>
+<h1 id="writing-named-vectors-to-sequence-files-from-python">Writing Named Vectors to Sequence Files from Python</h1>
+<p>We can now use JPype to create sequence files which will contain vectors to
+be used by Mahout for kmeans. The example below is a function which creates
+vectors from two Gaussian distributions with unit variance.</p>
+<div class="codehilite"><pre><span class="n">def</span> <span class="n">create_inputs</span><span class="p">(</span><span class="n">ifile</span><span class="p">,</span><span class="o">*</span><span class="n">args</span><span class="p">,</span><span class="o">**</span><span class="n">param</span><span class="p">):</span>
+ &quot;&quot;&quot;<span class="n">Create</span> <span class="n">a</span> <span class="n">sequence</span> <span class="n">file</span> <span class="n">containing</span> <span class="n">some</span> <span class="n">normally</span> <span class="n">distributed</span>
+    <span class="n">ifile</span> <span class="o">-</span> <span class="n">path</span> <span class="n">to</span> <span class="n">the</span> <span class="n">sequence</span> <span class="n">file</span> <span class="n">to</span> <span class="n">create</span>
+ &quot;&quot;&quot;
+
+ #<span class="n">matrix</span> <span class="n">of</span> <span class="n">the</span> <span class="n">cluster</span> <span class="n">means</span>
+ <span class="n">cmeans</span><span class="p">=</span><span class="n">np</span><span class="p">.</span><span class="n">array</span><span class="p">([[</span>1<span class="p">,</span>1<span class="p">]</span> <span class="p">,[</span><span class="o">-</span>1<span class="p">,</span><span class="o">-</span>1<span class="p">]],</span><span class="n">np</span><span class="p">.</span><span class="n">int</span><span class="p">)</span>
+
+ <span class="n">nperc</span><span class="p">=</span>30  #<span class="n">number</span> <span class="n">of</span> <span class="n">points</span> <span class="n">per</span> <span class="n">cluster</span>
+
+ <span class="n">vecs</span><span class="p">=[]</span>
+
+ <span class="n">vnames</span><span class="p">=[]</span>
+ <span class="k">for</span> <span class="n">cind</span> <span class="n">in</span> <span class="n">range</span><span class="p">(</span><span class="n">cmeans</span><span class="p">.</span><span class="n">shape</span><span class="p">[</span>0<span class="p">]):</span>
+  <span class="n">pts</span><span class="p">=</span><span class="n">np</span><span class="p">.</span><span class="n">random</span><span class="p">.</span><span class="nb">randn</span><span class="p">(</span><span class="n">nperc</span><span class="p">,</span>2<span class="p">)</span>
+  <span class="n">pts</span><span class="p">=</span><span class="n">pts</span><span class="o">+</span><span class="n">cmeans</span><span class="p">[</span><span class="n">cind</span><span class="p">,:].</span><span class="nb">reshape</span><span class="p">([</span>1<span class="p">,</span><span class="n">cmeans</span><span class="p">.</span><span class="n">shape</span><span class="p">[</span>1<span class="p">]])</span>
+  <span class="n">vecs</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">pts</span><span class="p">)</span>
+
+  #<span class="n">names</span> <span class="k">for</span> <span class="n">the</span> <span class="n">vectors</span>
+  #<span class="n">names</span> <span class="n">are</span> <span class="n">just</span> <span class="n">the</span> <span class="n">points</span> <span class="n">with</span> <span class="n">an</span> <span class="n">index</span>
+  #<span class="n">we</span> <span class="n">do</span> <span class="n">this</span> <span class="n">so</span> <span class="n">we</span> <span class="n">can</span> <span class="n">validate</span> <span class="n">by</span> <span class="nb">cross</span><span class="o">-</span><span class="n">refencing</span> <span class="n">the</span> <span class="n">name</span> <span class="n">with</span> <span class="n">thevector</span>
+  <span class="n">vn</span><span class="p">=</span><span class="n">np</span><span class="p">.</span><span class="n">empty</span><span class="p">(</span><span class="n">nperc</span><span class="p">,</span><span class="n">dtype</span><span class="p">=(</span><span class="n">np</span><span class="p">.</span><span class="n">str</span><span class="p">,</span>30<span class="p">))</span>
+  <span class="k">for</span> <span class="n">row</span> <span class="n">in</span> <span class="n">range</span><span class="p">(</span><span class="n">nperc</span><span class="p">):</span>
+   <span class="n">vn</span><span class="p">[</span><span class="n">row</span><span class="p">]=</span>&quot;<span class="n">c</span>&quot;<span class="o">+</span><span class="n">str</span><span class="p">(</span><span class="n">cind</span><span class="p">)</span><span class="o">+</span>&quot;<span class="n">_</span>&quot;<span class="o">+</span><span class="n">pts</span><span class="p">[</span><span class="n">row</span><span class="p">,</span>0<span class="p">].</span><span class="n">astype</span><span class="p">((</span><span class="n">np</span><span class="p">.</span><span class="n">str</span><span class="p">,</span>4<span class="p">))</span><span class="o">+</span>&quot;<span class="n">_</span>&quot;<span class="o">+</span><span class="n">pts</span><span class="p">[</span><span class="n">row</span><span class="p">,</span>1<span class="p">].</span><span class="n">astype</span><span class="p">((</span><span class="n">np</span><span class="p">.</span><span class="n">str</span><span
  class="p">,</span>4<span class="p">))</span>
+  <span class="n">vnames</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">vn</span><span class="p">)</span>
+
+ <span class="n">vecs</span><span class="p">=</span><span class="n">np</span><span class="p">.</span><span class="n">vstack</span><span class="p">(</span><span class="n">vecs</span><span class="p">)</span>
+ <span class="n">vnames</span><span class="p">=</span><span class="n">np</span><span class="p">.</span><span class="n">hstack</span><span class="p">(</span><span class="n">vnames</span><span class="p">)</span>
+
+
+ #<span class="n">start</span> <span class="n">the</span> <span class="n">jvm</span>
+ <span class="n">start_jpype</span><span class="p">()</span>
+
+ #<span class="n">create</span> <span class="n">the</span> <span class="n">sequence</span> <span class="n">file</span> <span class="n">that</span> <span class="n">we</span> <span class="n">will</span> <span class="n">write</span> <span class="n">to</span>
+ <span class="n">io</span><span class="p">=</span><span class="n">JPackage</span><span class="p">(</span>&quot;<span class="n">org</span>&quot;<span class="p">).</span><span class="n">apache</span><span class="p">.</span><span class="n">hadoop</span><span class="p">.</span><span class="n">io</span> 
+ <span class="n">FileSystemCls</span><span class="p">=</span><span class="n">JPackage</span><span class="p">(</span>&quot;<span class="n">org</span>&quot;<span class="p">).</span><span class="n">apache</span><span class="p">.</span><span class="n">hadoop</span><span class="p">.</span><span class="n">fs</span><span class="p">.</span><span class="n">FileSystem</span>
+
+ <span class="n">PathCls</span><span class="p">=</span><span class="n">JPackage</span><span class="p">(</span>&quot;<span class="n">org</span>&quot;<span class="p">).</span><span class="n">apache</span><span class="p">.</span><span class="n">hadoop</span><span class="p">.</span><span class="n">fs</span><span class="p">.</span><span class="n">Path</span>
+ <span class="n">path</span><span class="p">=</span><span class="n">PathCls</span><span class="p">(</span><span class="n">ifile</span><span class="p">)</span>
+
+ <span class="n">ConfCls</span><span class="p">=</span><span class="n">JPackage</span><span class="p">(</span>&quot;<span class="n">org</span>&quot;<span class="p">).</span><span class="n">apache</span><span class="p">.</span><span class="n">hadoop</span><span class="p">.</span><span class="n">conf</span><span class="p">.</span><span class="n">Configuration</span> 
+ <span class="n">conf</span><span class="p">=</span><span class="n">ConfCls</span><span class="p">()</span>
+
+ <span class="n">fs</span><span class="p">=</span><span class="n">FileSystemCls</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="n">conf</span><span class="p">)</span>
+
+ #<span class="n">vector</span> <span class="n">classes</span>
+ <span class="n">VectorWritableCls</span><span class="p">=</span><span class="n">JPackage</span><span class="p">(</span>&quot;<span class="n">org</span>&quot;<span class="p">).</span><span class="n">apache</span><span class="p">.</span><span class="n">mahout</span><span class="p">.</span><span class="n">math</span><span class="p">.</span><span class="n">VectorWritable</span>
+ <span class="n">DenseVectorCls</span><span class="p">=</span><span class="n">JPackage</span><span class="p">(</span>&quot;<span class="n">org</span>&quot;<span class="p">).</span><span class="n">apache</span><span class="p">.</span><span class="n">mahout</span><span class="p">.</span><span class="n">math</span><span class="p">.</span><span class="n">DenseVector</span>
+ <span class="n">NamedVectorCls</span><span class="p">=</span><span class="n">JPackage</span><span class="p">(</span>&quot;<span class="n">org</span>&quot;<span class="p">).</span><span class="n">apache</span><span class="p">.</span><span class="n">mahout</span><span class="p">.</span><span class="n">math</span><span class="p">.</span><span class="n">NamedVector</span>
+ <span class="n">writer</span><span class="p">=</span><span class="n">io</span><span class="p">.</span><span class="n">SequenceFile</span><span class="p">.</span><span class="n">createWriter</span><span class="p">(</span><span class="n">fs</span><span class="p">,</span> <span class="n">conf</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span><span class="n">io</span><span class="p">.</span><span class="n">Text</span><span class="p">,</span><span class="n">VectorWritableCls</span><span class="p">)</span>
+
+
+ <span class="n">vecwritable</span><span class="p">=</span><span class="n">VectorWritableCls</span><span class="p">()</span>
+ <span class="k">for</span> <span class="n">row</span> <span class="n">in</span> <span class="n">range</span><span class="p">(</span><span class="n">vecs</span><span class="p">.</span><span class="n">shape</span><span class="p">[</span>0<span class="p">]):</span>
+  <span class="n">nvector</span><span class="p">=</span><span class="n">NamedVectorCls</span><span class="p">(</span><span class="n">DenseVectorCls</span><span class="p">(</span><span class="n">JArray</span><span class="p">(</span><span class="n">JDouble</span><span class="p">,</span>1<span class="p">)(</span><span class="n">vecs</span><span class="p">[</span><span class="n">row</span><span class="p">,:])),</span><span class="n">vnames</span><span class="p">[</span><span class="n">row</span><span class="p">])</span>
+  #<span class="n">need</span> <span class="n">to</span> <span class="n">wrap</span> <span class="n">key</span> <span class="n">and</span> <span class="n">value</span> <span class="n">because</span> <span class="n">of</span> <span class="n">overloading</span>
+  <span class="n">wrapkey</span><span class="p">=</span><span class="n">JObject</span><span class="p">(</span><span class="n">io</span><span class="p">.</span><span class="n">Text</span><span class="p">(</span>&quot;<span class="n">key</span> &quot;<span class="o">+</span><span class="n">str</span><span class="p">(</span><span class="n">row</span><span class="p">)),</span><span class="n">io</span><span class="p">.</span><span class="n">Writable</span><span class="p">)</span>
+  <span class="n">wrapval</span><span class="p">=</span><span class="n">JObject</span><span class="p">(</span><span class="n">vecwritable</span><span class="p">,</span><span class="n">io</span><span class="p">.</span><span class="n">Writable</span><span class="p">)</span>
+
+  <span class="n">vecwritable</span><span class="p">.</span><span class="n">set</span><span class="p">(</span><span class="n">nvector</span><span class="p">)</span>
+  <span class="n">writer</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">wrapkey</span><span class="p">,</span><span class="n">wrapval</span><span class="p">)</span>
+
+ <span class="n">writer</span><span class="p">.</span><span class="n">close</span><span class="p">()</span>
+</pre></div>
+
+
+<p><a name="UsingMahoutwithPythonviaJPype-ReadingtheKMeansClusteredPointsfromPython"></a></p>
+<h1 id="reading-the-kmeans-clustered-points-from-python">Reading the KMeans Clustered Points from Python</h1>
+<p>Similarly we can use JPype to easily read the clustered points outputted by
+mahout.</p>
+<div class="codehilite"><pre><span class="n">def</span> <span class="n">read_clustered_pts</span><span class="p">(</span><span class="n">ifile</span><span class="p">,</span><span class="o">*</span><span class="n">args</span><span class="p">,</span><span class="o">**</span><span class="n">param</span><span class="p">):</span>
+ &quot;&quot;&quot;<span class="n">Read</span> <span class="n">the</span> <span class="n">clustered</span> <span class="n">points</span>
+ <span class="n">ifile</span> <span class="o">-</span> <span class="n">path</span> <span class="n">to</span> <span class="n">the</span> <span class="n">sequence</span> <span class="n">file</span> <span class="n">containing</span> <span class="n">the</span> <span class="n">clustered</span> <span class="n">points</span>
+ &quot;&quot;&quot;
+
+ #<span class="n">start</span> <span class="n">the</span> <span class="n">jvm</span>
+ <span class="n">start_jpype</span><span class="p">()</span>
+
+ #<span class="n">create</span> <span class="n">the</span> <span class="n">sequence</span> <span class="n">file</span> <span class="n">that</span> <span class="n">we</span> <span class="n">will</span> <span class="n">write</span> <span class="n">to</span>
+ <span class="n">io</span><span class="p">=</span><span class="n">JPackage</span><span class="p">(</span>&quot;<span class="n">org</span>&quot;<span class="p">).</span><span class="n">apache</span><span class="p">.</span><span class="n">hadoop</span><span class="p">.</span><span class="n">io</span> 
+ <span class="n">FileSystemCls</span><span class="p">=</span><span class="n">JPackage</span><span class="p">(</span>&quot;<span class="n">org</span>&quot;<span class="p">).</span><span class="n">apache</span><span class="p">.</span><span class="n">hadoop</span><span class="p">.</span><span class="n">fs</span><span class="p">.</span><span class="n">FileSystem</span>
+
+ <span class="n">PathCls</span><span class="p">=</span><span class="n">JPackage</span><span class="p">(</span>&quot;<span class="n">org</span>&quot;<span class="p">).</span><span class="n">apache</span><span class="p">.</span><span class="n">hadoop</span><span class="p">.</span><span class="n">fs</span><span class="p">.</span><span class="n">Path</span>
+ <span class="n">path</span><span class="p">=</span><span class="n">PathCls</span><span class="p">(</span><span class="n">ifile</span><span class="p">)</span>
+
+ <span class="n">ConfCls</span><span class="p">=</span><span class="n">JPackage</span><span class="p">(</span>&quot;<span class="n">org</span>&quot;<span class="p">).</span><span class="n">apache</span><span class="p">.</span><span class="n">hadoop</span><span class="p">.</span><span class="n">conf</span><span class="p">.</span><span class="n">Configuration</span> 
+ <span class="n">conf</span><span class="p">=</span><span class="n">ConfCls</span><span class="p">()</span>
+
+ <span class="n">fs</span><span class="p">=</span><span class="n">FileSystemCls</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="n">conf</span><span class="p">)</span>
+
+ #<span class="n">vector</span> <span class="n">classes</span>
+ <span class="n">VectorWritableCls</span><span class="p">=</span><span class="n">JPackage</span><span class="p">(</span>&quot;<span class="n">org</span>&quot;<span class="p">).</span><span class="n">apache</span><span class="p">.</span><span class="n">mahout</span><span class="p">.</span><span class="n">math</span><span class="p">.</span><span class="n">VectorWritable</span>
+ <span class="n">NamedVectorCls</span><span class="p">=</span><span class="n">JPackage</span><span class="p">(</span>&quot;<span class="n">org</span>&quot;<span class="p">).</span><span class="n">apache</span><span class="p">.</span><span class="n">mahout</span><span class="p">.</span><span class="n">math</span><span class="p">.</span><span class="n">NamedVector</span>
+
+
+ <span class="n">ReaderCls</span><span class="p">=</span><span class="n">io</span><span class="p">.</span><span class="n">__getattribute__</span><span class="p">(</span>&quot;<span class="n">SequenceFile</span>$<span class="n">Reader</span>&quot;<span class="p">)</span> 
+ <span class="n">reader</span><span class="p">=</span><span class="n">ReaderCls</span><span class="p">(</span><span class="n">fs</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span><span class="n">conf</span><span class="p">)</span>
+
+
+ <span class="n">key</span><span class="p">=</span><span class="n">reader</span><span class="p">.</span><span class="n">getKeyClass</span><span class="p">()()</span>
+
+
+ <span class="n">valcls</span><span class="p">=</span><span class="n">reader</span><span class="p">.</span><span class="n">getValueClass</span><span class="p">()</span>
+ <span class="n">vecwritable</span><span class="p">=</span><span class="n">valcls</span><span class="p">()</span>
+ <span class="k">while</span> <span class="p">(</span><span class="n">reader</span><span class="p">.</span><span class="n">next</span><span class="p">(</span><span class="n">key</span><span class="p">,</span><span class="n">vecwritable</span><span class="p">)):</span>  
+  <span class="n">weight</span><span class="p">=</span><span class="n">vecwritable</span><span class="p">.</span><span class="n">getWeight</span><span class="p">()</span>
+  <span class="n">nvec</span><span class="p">=</span><span class="n">vecwritable</span><span class="p">.</span><span class="n">getVector</span><span class="p">()</span>
+
+  <span class="n">cname</span><span class="p">=</span><span class="n">nvec</span><span class="p">.</span><span class="n">__class__</span><span class="p">.</span><span class="n">__name__</span>
+  <span class="k">if</span> <span class="p">(</span><span class="n">cname</span><span class="p">.</span><span class="n">rsplit</span><span class="p">(</span><span class="s">&#39;.&#39;</span><span class="p">,</span>1<span class="p">)[</span>1<span class="p">]</span><span class="o">==</span>&quot;<span class="n">NamedVector</span>&quot;<span class="p">):</span>  
+   <span class="n">print</span> &quot;<span class="n">cluster</span><span class="p">={</span><span class="n">key</span><span class="p">}</span> <span class="n">Name</span><span class="p">={</span><span class="n">name</span><span class="p">}</span> <span class="n">x</span><span class="p">={</span><span class="n">x</span><span class="p">}</span><span class="n">y</span><span class="p">={</span><span class="n">y</span><span class="p">}</span>&quot;<span class="p">.</span><span class="n">format</span><span class="p">(</span><span class="n">key</span><span class="p">=</span><span class="n">key</span><span class="p">.</span><span class="n">toString</span><span class="p">(),</span><span class="n">name</span><span class="p">=</span><span class="n">nvec</span><span class="p">.</span><span class="n">getName</span><span class="p">(),</span><span class="n">x</span><span class="p">=</span><span class="n">nvec</span><span class="p">.</span><span class="n">get</span><span class="p">(</span>0<span c
 lass="p">),</span><span class="n">y</span><span class="p">=</span><span class="n">nvec</span><span class="p">.</span><span class="n">get</span><span class="p">(</span>1<span class="p">))</span>
+  <span class="k">else</span><span class="p">:</span>
+   <span class="n">raise</span> <span class="n">NotImplementedError</span><span class="p">(</span>&quot;<span class="n">Vector</span> <span class="n">isn</span><span class="o">&#39;</span><span class="n">t</span> <span class="n">a</span> <span class="n">NamedVector</span><span class="p">.</span> <span class="n">Need</span> <span class="n">tomodify</span><span class="o">/</span><span class="n">test</span> <span class="n">the</span> <span class="n">code</span> <span class="n">to</span> <span class="n">handle</span> <span class="n">this</span> <span class="k">case</span><span class="p">.</span>&quot;<span class="p">)</span>
+</pre></div>
+
+
+<p><a name="UsingMahoutwithPythonviaJPype-ReadingtheKMeansCentroids"></a></p>
+<h1 id="reading-the-kmeans-centroids">Reading the KMeans Centroids</h1>
+<p>Finally we can create a function to print out the actual cluster centers
+found by mahout,</p>
+<div class="codehilite"><pre><span class="n">def</span> <span class="n">getClusters</span><span class="p">(</span><span class="n">ifile</span><span class="p">,</span><span class="o">*</span><span class="n">args</span><span class="p">,</span><span class="o">**</span><span class="n">param</span><span class="p">):</span>
+ &quot;&quot;&quot;<span class="n">Read</span> <span class="n">the</span> <span class="n">centroids</span> <span class="n">from</span> <span class="n">the</span> <span class="n">clusters</span> <span class="n">outputted</span> <span class="n">by</span> <span class="n">kmenas</span>
+       <span class="n">ifile</span> <span class="o">-</span> <span class="n">Path</span> <span class="n">to</span> <span class="n">the</span> <span class="n">sequence</span> <span class="n">file</span> <span class="n">containing</span> <span class="n">the</span> <span class="n">centroids</span>
+ &quot;&quot;&quot;
+
+ #<span class="n">start</span> <span class="n">the</span> <span class="n">jvm</span>
+ <span class="n">start_jpype</span><span class="p">()</span>
+
+ #<span class="n">create</span> <span class="n">the</span> <span class="n">sequence</span> <span class="n">file</span> <span class="n">that</span> <span class="n">we</span> <span class="n">will</span> <span class="n">write</span> <span class="n">to</span>
+ <span class="n">io</span><span class="p">=</span><span class="n">JPackage</span><span class="p">(</span>&quot;<span class="n">org</span>&quot;<span class="p">).</span><span class="n">apache</span><span class="p">.</span><span class="n">hadoop</span><span class="p">.</span><span class="n">io</span> 
+ <span class="n">FileSystemCls</span><span class="p">=</span><span class="n">JPackage</span><span class="p">(</span>&quot;<span class="n">org</span>&quot;<span class="p">).</span><span class="n">apache</span><span class="p">.</span><span class="n">hadoop</span><span class="p">.</span><span class="n">fs</span><span class="p">.</span><span class="n">FileSystem</span>
+
+ <span class="n">PathCls</span><span class="p">=</span><span class="n">JPackage</span><span class="p">(</span>&quot;<span class="n">org</span>&quot;<span class="p">).</span><span class="n">apache</span><span class="p">.</span><span class="n">hadoop</span><span class="p">.</span><span class="n">fs</span><span class="p">.</span><span class="n">Path</span>
+ <span class="n">path</span><span class="p">=</span><span class="n">PathCls</span><span class="p">(</span><span class="n">ifile</span><span class="p">)</span>
+
+ <span class="n">ConfCls</span><span class="p">=</span><span class="n">JPackage</span><span class="p">(</span>&quot;<span class="n">org</span>&quot;<span class="p">).</span><span class="n">apache</span><span class="p">.</span><span class="n">hadoop</span><span class="p">.</span><span class="n">conf</span><span class="p">.</span><span class="n">Configuration</span> 
+ <span class="n">conf</span><span class="p">=</span><span class="n">ConfCls</span><span class="p">()</span>
+
+ <span class="n">fs</span><span class="p">=</span><span class="n">FileSystemCls</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="n">conf</span><span class="p">)</span>
+
+ #<span class="n">vector</span> <span class="n">classes</span>
+ <span class="n">VectorWritableCls</span><span class="p">=</span><span class="n">JPackage</span><span class="p">(</span>&quot;<span class="n">org</span>&quot;<span class="p">).</span><span class="n">apache</span><span class="p">.</span><span class="n">mahout</span><span class="p">.</span><span class="n">math</span><span class="p">.</span><span class="n">VectorWritable</span>
+ <span class="n">NamedVectorCls</span><span class="p">=</span><span class="n">JPackage</span><span class="p">(</span>&quot;<span class="n">org</span>&quot;<span class="p">).</span><span class="n">apache</span><span class="p">.</span><span class="n">mahout</span><span class="p">.</span><span class="n">math</span><span class="p">.</span><span class="n">NamedVector</span>
+ <span class="n">ReaderCls</span><span class="p">=</span><span class="n">io</span><span class="p">.</span><span class="n">__getattribute__</span><span class="p">(</span>&quot;<span class="n">SequenceFile</span>$<span class="n">Reader</span>&quot;<span class="p">)</span>
+ <span class="n">reader</span><span class="p">=</span><span class="n">ReaderCls</span><span class="p">(</span><span class="n">fs</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span><span class="n">conf</span><span class="p">)</span>
+
+
+ <span class="n">key</span><span class="p">=</span><span class="n">io</span><span class="p">.</span><span class="n">Text</span><span class="p">()</span>
+
+
+ <span class="n">valcls</span><span class="p">=</span><span class="n">reader</span><span class="p">.</span><span class="n">getValueClass</span><span class="p">()</span>
+
+ <span class="n">vecwritable</span><span class="p">=</span><span class="n">valcls</span><span class="p">()</span>
+
+ <span class="k">while</span> <span class="p">(</span><span class="n">reader</span><span class="p">.</span><span class="n">next</span><span class="p">(</span><span class="n">key</span><span class="p">,</span><span class="n">vecwritable</span><span class="p">)):</span>  
+  <span class="n">center</span><span class="p">=</span><span class="n">vecwritable</span><span class="p">.</span><span class="n">getCenter</span><span class="p">()</span>
+
+  <span class="n">print</span> &quot;<span class="n">id</span><span class="p">={</span><span class="n">cid</span><span class="p">}</span><span class="n">center</span><span class="p">={</span><span class="n">center</span><span class="p">}</span>&quot;<span class="p">.</span><span class="n">format</span><span class="p">(</span><span class="n">cid</span><span class="p">=</span><span class="n">vecwritable</span><span class="p">.</span><span class="n">getId</span><span class="p">(),</span><span class="n">center</span><span class="p">=</span><span class="n">center</span><span class="p">.</span><span class="n">values</span><span class="p">)</span>
+  <span class="n">pass</span>
+</pre></div>
+   </div>
+  </div>     
+</div> 
+  <footer class="footer" align="center">
+    <div class="container">
+      <p>
+        Copyright &copy; 2014 The Apache Software Foundation, Licensed under
+        the <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.
+        <br />
+        Apache and the Apache feather logos are trademarks of The Apache Software Foundation.
+      </p>
+    </div>
+  </footer>
+  
+  <script src="/js/jquery-1.9.1.min.js"></script>
+  <script src="/js/bootstrap.min.js"></script>
+  <script>
+    (function() {
+      var cx = '012254517474945470291:vhsfv7eokdc';
+      var gcse = document.createElement('script');
+      gcse.type = 'text/javascript';
+      gcse.async = true;
+      gcse.src = (document.location.protocol == 'https:' ? 'https:' : 'http:') +
+          '//www.google.com/cse/cse.js?cx=' + cx;
+      var s = document.getElementsByTagName('script')[0];
+      s.parentNode.insertBefore(gcse, s);
+    })();
+  </script>
+</body>
+</html>