{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Multi-objective memetic approach\n", "\n", "In this third tutorial we consider an example with two dimensional input data and we approach its solution using a multi-objective approach where, aside the loss, we consider the formula complexity as a second objective.\n", "\n", "We will use a memetic approach to learn the model parameters while evolution will shape the model itself.\n", "\n", "Eventually you will learn:\n", "\n", " * How to instantiate a multi-objective symbolic regression problem.\n", " \n", " * How to use a memetic multi-objective approach to find suitable models for your data" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# Some necessary imports.\n", "import dcgpy\n", "import pygmo as pg\n", "# Sympy is nice to have for basic symbolic manipulation.\n", "from sympy import init_printing\n", "from sympy.parsing.sympy_parser import *\n", "init_printing()\n", "# Fundamental for plotting.\n", "from matplotlib import pyplot as plt\n", "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 1 - The data" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# We load our data from some available ones shipped with dcgpy.\n", "# In this particular case we use the problem sinecosine from the paper:\n", "# Vladislavleva, Ekaterina J., Guido F. Smits, and Dick Den Hertog.\n", "# \"Order of nonlinearity as a complexity measure for models generated by symbolic regression via pareto genetic\n", "# programming.\" IEEE Transactions on Evolutionary Computation 13.2 (2008): 333-349. \n", "X, Y = dcgpy.generate_sinecosine()\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from mpl_toolkits.mplot3d import Axes3D \n", "# And we plot them as to visualize the problem.\n", "fig = plt.figure()\n", "ax = fig.add_subplot(111, projection='3d')\n", "_ = ax.scatter(X[:,0], X[:,1], Y[:,0])\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 2 - The symbolic regression problem" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# We define our kernel set, that is the mathematical operators we will\n", "# want our final model to possibly contain. What to choose in here is left\n", "# to the competence and knowledge of the user. A list of kernels shipped with dcgpy \n", "# can be found on the online docs. The user can also define its own kernels (see the corresponding tutorial).\n", "ss = dcgpy.kernel_set_double([\"sum\", \"diff\", \"mul\", \"sin\", \"cos\"])" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\tData dimension (points): 2\n", "\tData dimension (labels): 1\n", "\tData size: 30\n", "\tKernels: [sum, diff, mul, sin, cos]\n", "\n" ] } ], "source": [ "# We instantiate the symbolic regression optimization problem\n", "# Note how we specify to consider one ephemeral constant via\n", "# the kwarg n_eph. We also request 100 kernels with a linear \n", "# layout (this allows for the construction of longer expressions) and\n", "# we set the level back to 101 (in an attempt to skew the search towards\n", "# simple expressions)\n", "udp = dcgpy.symbolic_regression(\n", " points = X, labels = Y, kernels=ss(), \n", " rows = 1, \n", " cols = 100, \n", " n_eph = 1, \n", " levels_back = 101,\n", " multi_objective=True)\n", "prob = pg.problem(udp)\n", "print(udp)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 3 - The search algorithm" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "# We instantiate here the evolutionary strategy we want to use to\n", "# search for models. Note we specify we want the evolutionary operators\n", "# to be applied also to the constants via the kwarg *learn_constants*\n", "uda = dcgpy.momes4cgp(gen = 250, max_mut = 4)\n", "algo = pg.algorithm(uda)\n", "algo.set_verbosity(10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 4 - The search" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "# We use a population of 100 individuals\n", "pop = pg.population(prob, 100)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "# Here is where we run the actual evolution. Note that the screen output\n", "# will show in the terminal (not on your Jupyter notebook in case \n", "# you are using it). Note you will have to run this a few times before \n", "# solving the problem entirely.\n", "pop = algo.evolve(pop)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 5 - Inspecting the non dominated front" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "# Compute here the non dominated front.\n", "ndf = pg.non_dominated_front_2d(pop.get_f())" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " Loss: Model: \n", "\n", "1.6049416203226965e-36 | c1*(x1*cos(x1) + cos(x1)) + 2*c1 + 6*cos(x0*sin(x1)) |\n", "1.4444474582904268e-35 | c1*x0 - 2*c1 + 6*cos(x0*sin(x1)) |\n", "1.3000027124613843e-34 | c1*x0 + 2*c1 + 6*cos(x0*sin(x1)) |\n", " 0.8559137162832793 | sin(x1) + 5*cos(x0*sin(x1)) |\n", " 3.04427756327168 | 2*c1*x1*cos(x0*sin(x1)) |\n", " 4.714418293710785 | 3*cos(x0*sin(x1)) |\n", " 8.875932935300025 | 4*cos(c1 + x0) + 1 |\n", " 9.493068363220251 | 5*cos(c1 + x0) |\n", " 13.422370193371659 | 2*c1 - 2*x0 |\n", " 13.42237019337166 | c1 - 2*x0 |\n", " 13.486758301564212 | c1 - x0 |\n", " 15.41066772551229 | 2 - x0 |\n", " 18.679277437831498 | c1 |\n", " 18.85767317484314 | 0 |\n", " 18.85767317484314 | 0 |\n" ] } ], "source": [ "# Inspect the front and print the proposed expressions.\n", "print(\"{: >20} {: >30}\".format(\"Loss:\", \"Model:\"), \"\\n\")\n", "for idx in ndf:\n", " x = pop.get_x()[idx]\n", " f = pop.get_f()[idx]\n", " a = parse_expr(udp.prettier(x))[0]\n", " print(\"{: >20} | {: >30}\".format(str(f[0]), str(a)), \"|\")" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Lets have a look to the non dominated fronts in the final population.\n", "ax = pg.plot_non_dominated_fronts(pop.get_f())\n", "_ = plt.xlabel(\"loss\")\n", "_ = plt.ylabel(\"complexity\")\n", "_ = plt.title(\"Non dominate fronts\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 6 - Lets have a look to the log content\n" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "# Here we get the log of the latest call to the evolve\n", "log = algo.extract(dcgpy.momes4cgp).get_log()\n", "gen = [it[0] for it in log]\n", "loss = [it[2] for it in log]\n", "compl = [it[4] for it in log]" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# And here we plot, for example, the generations against the best loss\n", "_ = plt.plot(gen, loss)\n", "_ = plt.title('last call to evolve')\n", "_ = plt.xlabel('generations')\n", "_ = plt.ylabel('loss')" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 2 }