<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 14 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Excellent work, thanks very much.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Arial","sans-serif";color:#1F497D">Dale Smith, Ph.D.<o:p></o:p></span></b></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Arial","sans-serif";color:#1F497D">Senior Financial Quantitative Analyst<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="font-size:10.0pt;font-family:"Arial","sans-serif";color:#1F497D">Financial & Risk Management Solutions<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="font-size:10.0pt;font-family:"Arial","sans-serif";color:#1F497D">Fiserv<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Arial","sans-serif";color:#1F497D">Office: 678-375-5315<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><a href="http://www.fiserv.com/">www.fiserv.com</a></span><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif""> rcpp-devel-bounces@r-forge.wu-wien.ac.at [mailto:rcpp-devel-bounces@r-forge.wu-wien.ac.at]
<b>On Behalf Of </b>Qiang Kou<br>
<b>Sent:</b> Thursday, July 24, 2014 8:25 PM<br>
<b>To:</b> rcpp-devel@lists.r-forge.r-project.org<br>
<b>Subject:</b> [Rcpp-devel] New package: RcppMLPACK, integration with MLPACK using Rcpp<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal">RcppMLPACK is almost done, and I really hope it is useful for other people. Testing and bug report are deeply welcome. Not only the code, also the results. Now you can try it from my repo:
<a href="https://github.com/thirdwing/RcppMLPACK">https://github.com/thirdwing/RcppMLPACK</a> <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">I am afraid there will be known problems on Windows about<b> size_t</b> type.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">MLPACK is a scalable C++ machine learning library providing an intuitive and simple API. It implements a wide array of machine learning methods and uses Armadillo as input/output. For more detail about MLPACK, please visit its homepage:
<a href="http://www.mlpack.org/">http://www.mlpack.org/</a> <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Since we have Rcpp and RcppArmadillo, which can integrate C++ and Armadillo with R seamlessly, RcppMLPACK becomes something very natural. The RcppMLPACK package includes the source code from the MLPACK library. Thus users do not need to
 install MLPACK itself in order to use RcppMLPACK. <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">I use k-means as an example. By using RcppMLPACK, a k-means method can be implemented like below. The interfere between R and C++ is handled by Rcpp and RcppArmadillo.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">#include "RcppMLPACK.h"<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">using namespace mlpack::kmeans;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">using namespace Rcpp;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">// [[Rcpp::export]]<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">List kmeans(const arma::mat& data, const int& clusters) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">    <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">    arma::Col<size_t> assignments;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">    // Initialize with the default arguments.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">    KMeans<> k;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">    k.Cluster(data, clusters, assignments); <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">    return List::create(_["clusters"] = clusters,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">                        _["result"]   = assignments);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">}<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"><b>inline</b> package provides a complete wrapper around the compilation, linking, and loading steps. So all the steps can be done in an R session. There is no reason that RcppMLPACK doesn't support the inline compilation.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">library(inline)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">library(RcppMLPACK)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">code <- '<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">  arma::mat data = as<arma::mat>(test);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">  int clusters = as<int>(n);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">  arma::Col<size_t> assignments;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">  mlpack::kmeans::KMeans<> k;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">  k.Cluster(data, clusters, assignments); <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">  return List::create(_["clusters"] = clusters,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">                      _["result"]   = assignments);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">'<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">mlKmeans <- cxxfunction(signature(test="numeric", n ="integer"), code, plugin="RcppMLPACK")<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">data(trees, package="datasets")<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">mlKmeans(t(trees), 3)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<div>
<p class="MsoNormal">There is one point we need to pay attention to: Armadillo matrices in MLPACK are stored in a <b>column-major format</b> for speed. That means <b>observations are stored as columns and dimensions as rows</b>.So when using MLPACK, additional
 transpose may be needed.<o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">The package also contains a RcppMLPACK.package.skeleton() function for people who want to use MLPACK code in their own package. It follows the structure of RcppArmadillo.package.skeleton().<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">library(RcppMLPACK)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">RcppMLPACK.package.skeleton("foobar")<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Creating directories ...<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Creating DESCRIPTION ...<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Creating NAMESPACE ...<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Creating Read-and-delete-me ...<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Saving functions and data ...<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Making help files ...<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Done.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Further steps are described in './foobar/Read-and-delete-me'.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Adding RcppMLPACK settings<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> >> added Imports: Rcpp<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> >> added LinkingTo: Rcpp, RcppArmadillo, BH, RcppMLPACK<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> >> added useDynLib and importFrom directives to NAMESPACE<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> >> added Makevars file with RcppMLPACK settings<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> >> added Makevars.win file with RcppMLPACK settings<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> >> added example src file using MLPACK classes<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> >> invoked Rcpp::compileAttributes to create wrappers<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">system("ls -R foobar")<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">foobar:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">DESCRIPTION  man  NAMESPACE  R  Read-and-delete-me  src<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">foobar/man:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">foobar-package.Rd<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">foobar/R:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">RcppExports.R<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">foobar/src:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">kmeans.cpp  Makevars  Makevars.win  RcppExports.cpp<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Even without a performance testing, we are still sure the C++ implementations should be faster. A small wine data set from UCI data sets repository is used for benchmarking. A script using rbenchmark package is written as below:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">suppressMessages(library(rbenchmark))<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">res <- benchmark(mlKmeans(t(wine),3),<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">                 kmeans(wine,3),<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">                 columns=c("test", "replications", "elapsed",<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">                 "relative", "user.self", "sys.self"), order="relative")<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">For 100 replications, MLPACK version of k-means (0.028s) is 33-time faster than kmeans in R (0.947s). However, we should note that R returns more information than the clustering result and there are much more checking functions in R.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">There is an important problem in MLPACK: it uses <b>size_t</b> type heavily. <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">There will be problems in wrapping such type, since in 64-bit Windows,
<b>size_t</b> is defined as <b>unsigned long long int</b>. No this kind of error found during testing on my Ubuntu.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Testing and bug report are deeply welcome. Not only the code, also the results.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Best,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">KK<o:p></o:p></p>
</div>
<p class="MsoNormal">-- <o:p></o:p></p>
<div>
<p class="MsoNormal">Qiang Kou<o:p></o:p></p>
<div>
<p class="MsoNormal"><a href="mailto:qkou@umail.iu.edu" target="_blank">qkou@umail.iu.edu</a><o:p></o:p></p>
<div>
<p class="MsoNormal">School of Informatics and Computing, Indiana University<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
</div>
</div>
</div>
</body>
</html>