{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "Custom objective function\n", "========================" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Names of free parameters: ['A', 'mu', 'sig', 'off']\n", "Optimization terminated successfully.\n", " Current function value: 0.737605\n", " Iterations: 205\n", " Function evaluations: 358\n", "Fit result: [0.64467365 8.75706725 6.815535 1.00264823]\n", "------------------- Parameter summary --------------------\n", " A = 0.644674, free: T, restricted: F, related: F\n", " mu = 8.75707, free: T, restricted: F, related: F\n", " sig = 6.81553, free: T, restricted: F, related: F\n", " off = 1.00265, free: T, restricted: F, related: F\n", " lin = 0, free: F, restricted: F, related: F\n", "----------------------------------------------------------\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from __future__ import print_function, division\n", "import numpy as np\n", "import matplotlib.pylab as plt\n", "from PyAstronomy import funcFit2 as fuf2\n", "import scipy.optimize as sco\n", "\n", "np.random.seed(1234)\n", "\n", "# Creating a Gaussian with some noise\n", "# Choose some parameters...\n", "gPar = {\"A\":1.0, \"sig\":10.0, \"mu\":10.0, \"off\":1.0, \"lin\":0.0}\n", "# Calculate profile\n", "x = np.arange(100) - 50.0\n", "y = gPar[\"off\"] + gPar[\"A\"] / np.sqrt(2*np.pi*gPar[\"sig\"]**2) \\\n", " * np.exp(-(x-gPar[\"mu\"])**2/(2*gPar[\"sig\"]**2))\n", "# Add some noise...\n", "y += np.random.normal(0.0, 0.002, x.size)\n", "# ...and save the error bars\n", "yerr = np.ones_like(x)*0.002\n", "\n", "# Create a model object\n", "gf = fuf2.GaussFit()\n", "# Set guess values for the parameters\n", "gf.assignValues({\"A\":2, \"sig\":3.77, \"off\":0.96, \"mu\":9.5})\n", "# 'Thaw' those (the order is irrelevant)\n", "gf.thaw([\"mu\", \"sig\", \"off\", \"A\"])\n", "\n", "\n", "def myobjf(m, pars, x, y, **kwargs):\n", " \"\"\"\n", " Calculate the absolute distance between model and data points and area of the Gaussian\n", " \n", " Parameters\n", " ----------\n", " m : MBO object\n", " On setting the objective function later via gf.objf = myobjf, this\n", " gives access to the parameter values, evaluate method of the model\n", " and so on.\n", " pars : list of floats\n", " Parameter values for which the objective function is to be evaluated.\n", " A correctly ordered list of free parameter values can be obtained\n", " by using the method freeParamVals(). The order by names can be inspected\n", " using the freeParamNames() method.\n", " x, y : arrays\n", " Here, this is the data. Note that these variables are specified via the\n", " 'args' parameter later in the call to the optimization algorithm (fmin).\n", " silent : boolean\n", " Can be used to suppress output (also specified via 'args' parameter).\n", " \"\"\"\n", " model = m.evaluate(x)\n", " r = np.sum(np.abs(model - y))\n", " # Weird dependence on A\n", " r += 0.6*np.abs(m[\"A\"])\n", " # Some informative output\n", " fpv = tuple(zip((m.freeParamNames(), m.freeParamVals())))\n", " return r\n", "\n", "# Show list of free parameters\n", "print(\"Names of free parameters: \", gf.freeParamNames())\n", "\n", "# Assign objective function. As a result of this assignment,\n", "# the parameter values of the model will be set to those handed\n", "# to the objective function prior to call\n", "gf.addSPLikeObjf(myobjf, \"myobjf\")\n", "\n", "fr = sco.fmin(gf.myobjf, gf.freeParamVals(), args=(x,y))\n", "print(\"Fit result: \", fr)\n", "# Set the parameter values to best-fit\n", "gf.setFreeParamVals(fr)\n", "\n", "gf.parameterSummary()\n", "# Let us see what we have done...\n", "plt.plot(x, y, 'bp')\n", "plt.plot(x, gf.evaluate(x), 'r--')\n", "plt.show()" ] } ], "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.6.10" } }, "nbformat": 4, "nbformat_minor": 4 }