update kernel tutorial

This commit is contained in:
Homer Strong 2015-07-19 14:30:27 -07:00
parent 3a150198e8
commit 1d7712ecc8
372 changed files with 92313 additions and 121 deletions

View file

@ -0,0 +1,201 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Creating new Models &mdash; GPy documentation</title>
<link rel="stylesheet" href="_static//default.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: './',
VERSION: '',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<link rel="top" title="GPy documentation" href="index.html" />
</head>
<body role="document">
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="nav-item nav-item-0"><a href="index.html">GPy documentation</a> &raquo;</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<div class="section" id="creating-new-models">
<span id="id1"></span><h1>Creating new Models<a class="headerlink" href="#creating-new-models" title="Permalink to this headline"></a></h1>
<p>In GPy all models inherit from the base class <code class="xref py py-class docutils literal"><span class="pre">Parameterized</span></code>. <code class="xref py py-class docutils literal"><span class="pre">Parameterized</span></code> is a class which allows for parameterization of objects. All it holds is functionality for tying, bounding and fixing of parameters. It also provides the functionality of searching and manipulating parameters by regular expression syntax. See <code class="xref py py-class docutils literal"><span class="pre">Parameterized</span></code> for more information.</p>
<p>The <a class="reference internal" href="GPy.core.html#GPy.core.model.Model" title="GPy.core.model.Model"><code class="xref py py-class docutils literal"><span class="pre">Model</span></code></a> class provides parameter introspection, objective function and optimization.</p>
<p>In order to fully use all functionality of
<a class="reference internal" href="GPy.core.html#GPy.core.model.Model" title="GPy.core.model.Model"><code class="xref py py-class docutils literal"><span class="pre">Model</span></code></a> some methods need to be implemented
/ overridden. And the model needs to be told its parameters, such
that it can provide optimized parameter distribution and handling.
In order to explain the functionality of those methods
we will use a wrapper to the numpy <code class="docutils literal"><span class="pre">rosen</span></code> function, which holds
input parameters <img class="math" src="_images/math/7a9b78bdb36f2fbd5ca087212e58fc74dde40e86.png" alt="\mathbf{X}"/>. Where
<img class="math" src="_images/math/21bfcdadd1abee6b044daaa51d5a195606ee453c.png" alt="\mathbf{X}\in\mathbb{R}^{N\times 1}"/>.</p>
<div class="section" id="obligatory-methods">
<h2>Obligatory methods<a class="headerlink" href="#obligatory-methods" title="Permalink to this headline"></a></h2>
<dl class="docutils">
<dt><code class="xref py py-func docutils literal"><span class="pre">__init__()</span></code> :</dt>
<dd><p class="first">Initialize the model with the given parameters. These need to
be added to the model by calling
<cite>self.add_parameter(&lt;param&gt;)</cite>, where param needs to be a
parameter handle (See <a href="#id2"><span class="problematic" id="id3">parameterized_</span></a> for details).:</p>
<div class="last highlight-python"><div class="highlight"><pre><span class="bp">self</span><span class="o">.</span><span class="n">X</span> <span class="o">=</span> <span class="n">GPy</span><span class="o">.</span><span class="n">Param</span><span class="p">(</span><span class="s">&quot;input&quot;</span><span class="p">,</span> <span class="n">X</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add_parameter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">X</span><span class="p">)</span>
</pre></div>
</div>
</dd>
<dt><a class="reference internal" href="GPy.core.html#GPy.core.model.Model.log_likelihood" title="GPy.core.model.Model.log_likelihood"><code class="xref py py-meth docutils literal"><span class="pre">log_likelihood()</span></code></a> :</dt>
<dd><p class="first">Returns the log-likelihood of the new model. For our example
this is just the call to <code class="docutils literal"><span class="pre">rosen</span></code> and as we want to minimize
it, we need to negate the objective.:</p>
<div class="last highlight-python"><div class="highlight"><pre><span class="k">return</span> <span class="o">-</span><span class="n">scipy</span><span class="o">.</span><span class="n">optimize</span><span class="o">.</span><span class="n">rosen</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">X</span><span class="p">)</span>
</pre></div>
</div>
</dd>
<dt><code class="xref py py-meth docutils literal"><span class="pre">parameters_changed()</span></code> :</dt>
<dd><p class="first">Updates the internal state of the model and sets the gradient of
each parameter handle in the hierarchy with respect to the
log_likelihod. Thus here we need to set the negative derivative of
the rosenbrock function for the parameters. In this case it is the
gradient for self.X.:</p>
<div class="last highlight-python"><div class="highlight"><pre><span class="bp">self</span><span class="o">.</span><span class="n">X</span><span class="o">.</span><span class="n">gradient</span> <span class="o">=</span> <span class="o">-</span><span class="n">scipy</span><span class="o">.</span><span class="n">optimize</span><span class="o">.</span><span class="n">rosen_der</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">X</span><span class="p">)</span>
</pre></div>
</div>
</dd>
</dl>
<p>Here the full code for the <cite>Rosen</cite> class:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">GPy</span> <span class="kn">import</span> <span class="n">Model</span><span class="p">,</span> <span class="n">Param</span>
<span class="kn">import</span> <span class="nn">scipy</span>
<span class="k">class</span> <span class="nc">Rosen</span><span class="p">(</span><span class="n">Model</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">X</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s">&#39;rosenbrock&#39;</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">Rosen</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">name</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">X</span> <span class="o">=</span> <span class="n">Param</span><span class="p">(</span><span class="s">&quot;input&quot;</span><span class="p">,</span> <span class="n">X</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add_parameter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">X</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">log_likelihood</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="o">-</span><span class="n">scipy</span><span class="o">.</span><span class="n">optimize</span><span class="o">.</span><span class="n">rosen</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">X</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">parameters_changed</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">X</span><span class="o">.</span><span class="n">gradient</span> <span class="o">=</span> <span class="o">-</span><span class="n">scipy</span><span class="o">.</span><span class="n">optimize</span><span class="o">.</span><span class="n">rosen_der</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">X</span><span class="p">)</span>
</pre></div>
</div>
<p>In order to test the newly created model, we can check the gradients
and optimize a standard rosenbrock run:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="n">m</span> <span class="o">=</span> <span class="n">Rosen</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="p">]))</span>
<span class="gp">&gt;&gt;&gt; </span><span class="k">print</span> <span class="n">m</span>
<span class="go">Name : rosenbrock</span>
<span class="go">Log-likelihood : -404.0</span>
<span class="go">Number of Parameters : 2</span>
<span class="go">Parameters:</span>
<span class="go"> rosenbrock. | Value | Constraint | Prior | Tied to</span>
<span class="go"> input | (2,) | | |</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">m</span><span class="o">.</span><span class="n">checkgrad</span><span class="p">(</span><span class="n">verbose</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="go"> Name | Ratio | Difference | Analytical | Numerical</span>
<span class="go">------------------------------------------------------------------------------------------</span>
<span class="go"> rosenbrock.input[[0]] | 1.000000 | 0.000000 | -804.000000 | -804.000000</span>
<span class="go"> rosenbrock.input[[1]] | 1.000000 | 0.000000 | -400.000000 | -400.000000</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">m</span><span class="o">.</span><span class="n">optimize</span><span class="p">()</span>
<span class="gp">&gt;&gt;&gt; </span><span class="k">print</span> <span class="n">m</span>
<span class="go">Name : rosenbrock</span>
<span class="go">Log-likelihood : -6.52150088871e-15</span>
<span class="go">Number of Parameters : 2</span>
<span class="go">Parameters:</span>
<span class="go"> rosenbrock. | Value | Constraint | Prior | Tied to</span>
<span class="go"> input | (2,) | | |</span>
<span class="gp">&gt;&gt;&gt; </span><span class="k">print</span> <span class="n">m</span><span class="o">.</span><span class="n">input</span>
<span class="go"> Index | rosenbrock.input | Constraint | Prior | Tied to</span>
<span class="go"> [0] | 0.99999994 | | | N/A</span>
<span class="go"> [1] | 0.99999987 | | | N/A</span>
<span class="gp">&gt;&gt;&gt; </span><span class="k">print</span> <span class="n">m</span><span class="o">.</span><span class="n">gradient</span>
<span class="go">[ -1.91169809e-06, 1.01852309e-06]</span>
</pre></div>
</div>
<p>This is the optimium for the 2D Rosenbrock function, as expected, and
the gradient of the inputs are almost zero.</p>
</div>
<div class="section" id="optional-methods">
<h2>Optional methods<a class="headerlink" href="#optional-methods" title="Permalink to this headline"></a></h2>
<p>Currently none.</p>
</div>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h3><a href="index.html">Table Of Contents</a></h3>
<ul>
<li><a class="reference internal" href="#">Creating new Models</a><ul>
<li><a class="reference internal" href="#obligatory-methods">Obligatory methods</a></li>
<li><a class="reference internal" href="#optional-methods">Optional methods</a></li>
</ul>
</li>
</ul>
<div role="note" aria-label="source link">
<h3>This Page</h3>
<ul class="this-page-menu">
<li><a href="_sources/tuto_creating_new_models.txt"
rel="nofollow">Show Source</a></li>
</ul>
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
<form class="search" action="search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
<p class="searchtip" style="font-size: 90%">
Enter search terms or a module, class or function name.
</p>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="nav-item nav-item-0"><a href="index.html">GPy documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer" role="contentinfo">
&copy; Copyright 2013, Author.
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.1.
</div>
</body>
</html>