From 683fa1c3f746c97f60f3dc945babf9d486632a2c Mon Sep 17 00:00:00 2001 From: sigvaldm Date: Thu, 10 Mar 2022 10:53:55 +0100 Subject: [PATCH] Updated documentation --- README.rst | 40 ++++++++++++++++++++++++++++++++++------ examples/rbf4.png | Bin 0 -> 43398 bytes examples/rbf4.py | 11 +++++------ 3 files changed, 39 insertions(+), 12 deletions(-) create mode 100644 examples/rbf4.png diff --git a/README.rst b/README.rst index 8af03b5..e2caf62 100644 --- a/README.rst +++ b/README.rst @@ -173,8 +173,8 @@ A radial basis function is a function ``g(t)``, possibly with a multidimensional This sum is fitted to a set of data points ``(x,y)``. Typically, the RBF is a Gaussian function, although any it can be any function of one argument (the radial distance), for instance any of the kernals listed above. In ``RBFnet``, the centers ``c_j`` are first determined to get a good coverage of the domain by means of K-means clustering. The radius ``r``, here taken to be the same for all terms, is a hyperparameter to be tuned. With this, linear least squares is used to fit the weights ``w_j``. -Example 1 -~~~~~~~~~ +Example 1: Getting started +~~~~~~~~~~~~~~~~~~~~~~~~~~ This example demonstrates how 10 radial basis functions can be used to fit a sine curve:: from localreg import RBFnet @@ -196,8 +196,8 @@ This example demonstrates how 10 radial basis functions can be used to fit a sin The dashed lines plotted using the ``plot_bases`` method are the individual terms in the weighted sum after training. The learning capacity of an RBF network is primarily determined by the number of basis functions, decided by the ``num`` parameter. In this case 10 basis functions makes for a good fit, but data with larger variability and more dimensions may require more basis functions. Other parameters that can be adjusted is the radius of the basis functions, as well as the analytical expression of the radial basis function itself. The radius is in terms of standard deviations of the input points, and is therefore always a number of order of magnitude one. By default Gaussian basis functions are used, but any of the kernels mentioned for local polynomial regression can be specified using the ``rbf`` parameter, as well as custom functions of one argument. Normalization can be turned off using the ``normalize`` argument. In this case the radius has similar magnitude as the input. -Example 2 -~~~~~~~~~ +Example 2: Multivariate input +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This example demonstrates multi-dimensional inputs. Due to the larger variability more basis functions are needed than in example 1. We also do not specify the radius in this case, but allow ``RBFnet`` to use an internal algorithm for choosing the radius that minimizes the RMS error (other error measures may be specified using the ``measure`` parameter). While automatically tuning the radius works well in this example, it must be considered an experimental feature. It is also more time-consuming:: from localreg import RBFnet, plot_corr @@ -233,8 +233,8 @@ The figures show excellent agreement between the true and predicted data. In the When using multi-dimensional data normalization becomes more important. If the input variables have different standard deviation, e.g., if they are variables of entirely different physical dimensions, it will be difficult to adapt the network with few basis functions of radial shape, because it will be difficult to resolve the details in the "small" axes while spanning the data in the "large" axes. Normalization make the spread along the axes more comparable. -Example 3 -~~~~~~~~~ +Example 3: Error metrics and relative least squares +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Localreg comes with several error metrics for quantifying the error: - ``rms_error`` @@ -289,3 +289,31 @@ Output:: .. image:: examples/rbf3.png This example fits the data to a tan-function, which becomes very large towards the right edge. Linear least squares (LLS) algorithms solves the so-called normal equations, which is equivalent to minimizing the squared sum of residuals or the root-mean-square (RMS) of the error. When the data spans a large range, the error can quickly become very large for the smaller values, because the algorithm optimizes the errors in absolute terms. In this example, the linear least squares algorithm makes a poor (and oscialltory) prediction of smaller values, because the absolute error in the larger values are made smaller that way. However, when working on data spanning several orders of magnitude, the relative error is often more important. By training with ``relative=True``, the normal equations are preconditioned such that the root-mean-square of the relative errors (RMSE) are minimized instead of RMSE. + +Example 4: Multivariate output +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Both the input and the output may be multidimensional. In this example, the input is univariate, but the output multivariate:: + +Output:: + + from localreg import RBFnet + import numpy as np + import matplotlib.pyplot as plt + + x = np.linspace(0,1,100) + y = np.zeros((len(x), 2)) + y[:,0] = np.sin(2*np.pi*x) + y[:,1] = np.cos(2*np.pi*x) + + net = RBFnet() + net.train(x, y) + yhat = net.predict(x) + + plt.plot(x, y[:,0], 'C0', label='Ground truth') + plt.plot(x, y[:,1], 'C1', label='Ground truth') + plt.plot(x, yhat[:,0], ':k', label='Prediction') + plt.plot(x, yhat[:,1], ':k', label='Prediction') + plt.legend() + plt.show() + +.. image:: examples/rbf4.png diff --git a/examples/rbf4.png b/examples/rbf4.png new file mode 100644 index 0000000000000000000000000000000000000000..78d0d21b5f9315d43b1721ccc1dfe52575bf6f5f GIT binary patch literal 43398 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 literal 0 HcmV?d00001 diff --git a/examples/rbf4.py b/examples/rbf4.py index c878a75..4e124cf 100644 --- a/examples/rbf4.py +++ b/examples/rbf4.py @@ -8,13 +8,12 @@ y[:,1] = np.cos(2*np.pi*x) net = RBFnet() -net.train(x, y, num=10, radius=0.3) - +net.train(x, y) yhat = net.predict(x) -plt.plot(x, y[:,0], label='Ground truth') -plt.plot(x, y[:,1], label='Ground truth') -plt.plot(x, yhat[:,0], label='Prediction') -plt.plot(x, yhat[:,1], label='Prediction') +plt.plot(x, y[:,0], 'C0', label='Ground truth') +plt.plot(x, y[:,1], 'C1', label='Ground truth') +plt.plot(x, yhat[:,0], ':k', label='Prediction') +plt.plot(x, yhat[:,1], ':k', label='Prediction') plt.legend() plt.show()