mirror of
https://github.com/SheffieldML/GPy.git
synced 2026-05-06 02:24:17 +02:00
201 lines
14 KiB
HTML
201 lines
14 KiB
HTML
|
|
<!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 — 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> »</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(<param>)</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">"input"</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">'rosenbrock'</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">"input"</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">>>> </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">>>> </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">>>> </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">>>> </span><span class="n">m</span><span class="o">.</span><span class="n">optimize</span><span class="p">()</span>
|
||
|
|
<span class="gp">>>> </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">>>> </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">>>> </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> »</li>
|
||
|
|
</ul>
|
||
|
|
</div>
|
||
|
|
<div class="footer" role="contentinfo">
|
||
|
|
© Copyright 2013, Author.
|
||
|
|
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.1.
|
||
|
|
</div>
|
||
|
|
</body>
|
||
|
|
</html>
|