{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# iminuit: Past and Future\n", "\n", "* Hans Dembinski, TU Dortmund, Germany\n", "\n", "PyPI | https://pypi.org/project/iminuit\n", " --------------|:--------------------------------------\n", "Code | https://github.com/scikit-hep/iminuit\n", "Documentation | http://iminuit.readthedocs.org\n", "Gitter | https://gitter.im/Scikit-HEP/community\n", "\n", "## Introduction to iminuit\n", "\n", "### iminuit is a frontend to Minuit\n", "- Minuit: General purpose tool to minimize statistical cost functions with box constraints **and to compute parameter uncertainties** (fairly unique to Minuit)\n", "- Robust technology from 1975 that stood the tests of time\n", "- Python frontend to MINUIT2 C++ code used by ROOT\n", " - Uses original ROOT code\n", " - MINUIT is driving backend in virtually every HEP analysis\n", "\n", "#### Minimization: Migrad algorithm\n", "\n", "- Newton-steps with along-the-way updated hessian matrix\n", "- Fallback to steepest descent with line search\n", "- Various heuristics to deal with sticky situations\n", "- Box-constraints implemented via parameter transformations\n", "- Stopping criterion: Estimated distance to minimum (EDM), very well suited to statistics problems\n", "\n", "#### Uncertainty computation: Hesse and Minos algorithms\n", "- Hesse algorithm, 1D intervals and ND contours\n", "- Minos algorithm, 1D intervals and ND contours\n", "- Also respect box-constraints\n", "- Different pros and cons, Hesse recommended as default (more later)\n", "\n", "### A bit of (version) history\n", "\n", "#### Fortran\n", "- Original MINUIT in Fortran (1975)\n", "\n", "#### C/C++\n", "- TMinuit: Original ported to C and integrated into ROOT (~2000)\n", "- Minuit2 (aka SEAL Minuit)\n", " - Ambitious rewrite of MINUIT in C++ (2002-2006)\n", " - Originally standalone project, now integrated into ROOT\n", "\n", "#### Python\n", "- pyminuit, pyminuit2\n", " - Original Minuit Python wrappers by Jim Pivarski\n", " - Feature highlight: auto-detection of parameter names in functions\n", "- iminuit\n", " - Rewrite using Cython by Piti Ongmongkolkul\n", " - Interface-compatible with pyminuit\n", " - *i* for interactive: Pretty display of fit status in Jupyter notebooks\n", " - Intermediate maintainer Christoph Deil (leading developer of [gammapy](https://gammapy.org/))\n", " - HD took over as maintainer in 2018\n", " - iminuit joined Scikit-HEP\n", " - Version 1.3\n", " - Tighter intergration with numpy\n", " - Support functions that accept parameters as numpy arrays\n", " - Access to parameters and covariance matrix as numpy arrays\n", " - Support for modifying fit state between fitting steps (**key feature** of MINUIT)\n", " - Fix and release parameters\n", " - Change parameter values\n", " - Better code sharing with ROOT C++ (credit: Henry Schreiner, GooFit)\n", " - Prebuild Python wheels and conda packages for every release (credit: Henry Schreiner, Chris Burr, Matt Craig, Brigitta Sipőcz, Matthew Becker)\n", " - Added lots and lots of documentation and tutorials\n", " - Try iminuit tutorials on Binder (credit: Matthew Feickert)\n", " - Lots of bug-fixes in the interface\n", " - Allow computing \"Hesse\" uncertainties without prior call to Migrad \n", " - Version 1.4 (current version 1.4.7)\n", " - Further pythonization of interface\n", " - Duplicated and legacy interface deprecated\n", " - Replaced getter/setters with properties\n", " - Make similar objects work alike\n", " - Comply with Python/Numpy expectations (e.g. dict-like objects support dict interface)\n", " - Slicing and broadcasting syntax for `Minuit.values`, `Minuit.errors`, `Minuit.fixed` (more later)\n", " - Increasing consistency pays off\n", " - Reduces mental load\n", " - Makes iminuit easier to teach and learn\n", " - PDG-rule rounding for values with errors\n", " - Cost functions (more later)\n", " - C++ Minuit2 updated to ROOT v6.23-01 (fixes some long-standing minor cornercase bugs)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Deprecated interface\n", "\n", "* Minuit.list_of_fixed_params(), Minuit.list_of_vary_params(): use Minuit.fixed\n", "* Minuit.migrad_ok(): use Minuit.valid\n", "* Minuit.matrix_accurate(): use Minuit.accurate\n", "* Minuit.get_fmin(): use Minuit.fmin\n", "* Minuit.get_param_states(): use Minuit.param\n", "* Minuit.get_initial_param_states(): use Minuit.init_param\n", "* Minuit.get_num_call_fcn(): use Minuit.ncalls_total\n", "* Minuit.get_num_call_grad(): use Minuit.ngrads_total\n", "* Minuit.hesse(maxcall=…) keyword: use ncall=… like in Minuit.migrad()\n", "* Minuit.edm: use Minuit.fmin.edm\n", "* Minuit.is_fixed: replaced by .fixed attribute\n", "* Minuit.set_strategy: assign to Minuit.strategy instead\n", "* Minuit.set_errordef: assign to Minuit.errordef instead\n", "* Minuit.set_print_level: assign to Minuit.print_level instead\n", "* Minuit.print_param_states, Minuit.print_initial_param_states, Minuit.print_fmin, Minuit.print_matrix, Minuit.print_param, Minuit.print_initial_param, Minuit.print_all_minos: use print() on the respective attributes instead" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Why use iminuit and not X (X = RooFit, pyhf, zfit ...)?\n", "\n", "* If X works for you, good! No reason to change from X to iminuit\n", "* Learning iminuit is simple and it is universally applicable\n", "* Useful in teaching courses on fitting\n", "* Good enough for simple fits\n", "* Good for experts and power users who need full control over all aspects of the fit\n", "\n", "\n", " \n", " \n", " \n", " \n", "
\"Image\n", " \n", "

VS

\n", "
\n", "\"Image\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## iminuit and a simple fit\n", "\n", "A quick demo how to do a simple least-squares fit with iminuit." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "from matplotlib import pyplot as plt\n", "from iminuit import Minuit" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# make 10 data points with scatter on y-coordinate\n", "\n", "rng = np.random.default_rng(1)\n", "\n", "x = np.linspace(0, 1, 10)\n", "ye = np.ones_like(x) * 0.2\n", "y = rng.normal(2 * x + 1, ye, size=len(x))\n", "\n", "plt.errorbar(x, y, ye, fmt=\"o\")\n", "plt.xlabel(\"x\")\n", "plt.ylabel(\"y\");" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To recover the parameters of the line, we need to write a model and a cost function. The model predicts a y value for an x value, using a set of parameters. The cost function must compute some kind of distance between the model predictions and the observations.\n", "\n", "Optimal for this case is the least-squares method, where the cost function is the sum of squared studentized residuals." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "
Name Value Hesse Error Minos Error- Minos Error+ Limit- Limit+ Fixed
0 a 0.0 0.1
1 b 0.0 0.1
\n" ], "text/plain": [ "------------------------------------------------------------------------------------------\n", "| | Name | Value | Hesse Err | Minos Err- | Minos Err+ | Limit- | Limit+ | Fixed |\n", "------------------------------------------------------------------------------------------\n", "| 0 | a | 0.0 | 0.1 | | | | | |\n", "| 1 | b | 0.0 | 0.1 | | | | | |\n", "------------------------------------------------------------------------------------------" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# line model\n", "def model(x, a, b):\n", " return a + b * x\n", "\n", "def cost(a, b):\n", " ym = model(x, a, b)\n", " res = (y - ym) / ye # studentized residuals\n", " return np.sum(res ** 2)\n", "\n", "# initialize Minuit object by passing the cost function\n", "# - Minuit uses a local minimizer, we need to set starting values\n", "# - Minuit also needs an `errordef` parameter (more later)\n", "m = Minuit(cost, a=0, b=0, errordef=1)\n", "m.params" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note: Minuit detected that the cost function has two parameters named `a` and `b`.\n", "\n", "The Minuit object represents the current state of the fit. The initial state consists of the starting values and some step sizes (here 0.1) for the numerical gradient computation. You can set the step sizes yourself, with `error_a=...` etc, but a good default is selected for you if you do not.\n", "\n", "Minuit makes it easy to interact with the fitter, which is useful for debugging and to manually help the minimizer to find the minimum. It also presents useful diagnostics that indicate if something went wrong." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
FCN = 3.959 Ncalls = 34 (34 total)
EDM = 1.09e-22 (Goal: 0.0002) up = 1.0
Valid Min. Valid Param. Above EDM Reached call limit
True True False False
Hesse failed Has cov. Accurate Pos. def. Forced
False True True True False
\n", "\n", "\n", "\n", "\n", "
Name Value Hesse Error Minos Error- Minos Error+ Limit- Limit+ Fixed
0 a 1.05 0.12
1 b 1.99 0.20
\n" ], "text/plain": [ "------------------------------------------------------------------\n", "| FCN = 3.959 | Ncalls=34 (34 total) |\n", "| EDM = 1.09e-22 (Goal: 0.0002) | up = 1.0 |\n", "------------------------------------------------------------------\n", "| Valid Min. | Valid Param. | Above EDM | Reached call limit |\n", "------------------------------------------------------------------\n", "| True | True | False | False |\n", "------------------------------------------------------------------\n", "| Hesse failed | Has cov. | Accurate | Pos. def. | Forced |\n", "------------------------------------------------------------------\n", "| False | True | True | True | False |\n", "------------------------------------------------------------------\n", "------------------------------------------------------------------------------------------\n", "| | Name | Value | Hesse Err | Minos Err- | Minos Err+ | Limit- | Limit+ | Fixed |\n", "------------------------------------------------------------------------------------------\n", "| 0 | a | 1.05 | 0.12 | | | | | |\n", "| 1 | b | 1.99 | 0.20 | | | | | |\n", "------------------------------------------------------------------------------------------" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# calling Migrad minimizer \n", "m.migrad()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Values and errors are rounded according to the **PDG rounding rules**." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The \"Hesse Errors\" now show estimated uncertainties of the parameters. *Migrad* computes these mostly for free as part of its minimization process.\n", "\n", "Things to note:\n", "- **EDM**: estimated distance to minimum, must be smaller than \"Goal\"; shows that Migrad converged\n", "- **Ncalls**: How many function calls were used by Migrad (and the total by this Minuit object so far)\n", "- **Pos. def.**: Whether the Hessian matrix (matrix of second derivatives) is positive definite; it must be for a valid minimum\n", "\n", "You can get the values from the `Minuit.fmin` attribute." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "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n89l4cKF3HPPPbRp04YrrriCr776igULFlCjRo0gVpy3KQhEJKycq/3zuaxfv56GDRvywAMPsGfPHj766CPWrFlDw4YNfXkm0IVQEIhIWMmp/fOwr7dlu/3OnTtp3749d955J8uWLeONN95g+/bttG/fnoIFC4ai5DxPk8UiElZyav989vIDBw4QFxfHqFGjAOjWrRsxMTFcc801Qa8xv1EQiEhYyan9c/GoSCCzKdyoUaOIi4vj0KFDtG/fnn79+lGqVKlQl5pvmHPO6xouSPXq1V18fLzXZYhIkJycIzj98FBkREEGNa/EofXfEhsby65du2jUqBFDhgyhSpUqHlabd5jZKudc9ezWaUQgImHlZJvnHp+tJyU9gxJRhXnohuP0fboRGzdupEaNGkyePJn69et7W2g+osliEQk7zaNLEF0qirLsJuLvA+j/bGOOHz/Op59+yvLlyxUCAaYRgYiEnR07dvD9+FfZtXohxYoVY/To0XTs2JGIiAivS8uXFAQiEjb27NlzqikcBSOo+NizLJvyFldddZXXpeVrCgIR8dyRI0cYMWIEw4cP5/jx43Ts2JFdpRsRefV1CoEQ0ByBiHgmNTWVMWPGULZsWfr160fDhg3ZvHkzY8eOJfLq67wuzzc0IhCRkHPOMX36dF599VUSEhKoV68ec+bMoWbNml6X5ksaEYhISC1atIiaNWvSunVrChcuzBdffHFqmXgjaEFgZiXNbKGZbTazTWb2Sjbb1DezQ2a2NusjNlj1iIi3NmzYQKNGjbj//vvZvXs3H374IWvXruWxxx5TUziPBfPQUBrwF+fcajO7ClhlZt845zaftd0S51zjINYhIh7auXMnsbGxTJo0iauvvpqhQ4fSpUsXIiMjvS5NsgQtCJxzu4HdWY+PmNkWoARwdhCISD7022+/MXjw4FNN4f7yl78QExPDtdde63FlcraQTBabWWkgGliezeraZrYO+AXo5pzblM3XdwQ6AmosJRLmjh8/zqhRoxg8eDCHDh3ij3/8I/379+eWW27xujTJQdAni83sSmAG8Gfn3OGzVq8GbnHOVQNGAbOyew7n3HjnXHXnXPVixYoFt2ARuSjp6elMnDiR8uXL06NHD2rXrs3atWuZOHGiQiDMBXVEYGYRZIbAx865mWevPz0YnHNfmdlYMyvqnPs1mHWJSOA455g3bx69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fHr27Mm6deuIjo7mgw8+4KGHHgr4a+nduHgh6BeUmdmVwAzgz865wxfzHM658c656s656sWKFQtsgSLnsGrVKh566CEeffRRDh8+zCeffEJ8fHxQQkDEK0ENAjOLIDMEPnbOzcxmkySg5Gmf35y1TMRT//73v3nyySepXr0669at46233mLLli08+eSTFFBTOMlngvYTnXW9wQRgi3NuZA6bzQH+lHX2UC3gkOYHxEv79u3j5ZdfpkKFCsyePZtXX32VxMREXnnlFS6//HKvyxMJimCe5FwX+COwwczWZi3rDZQCcM6NA74CGgEJwDEgdLdiEjlN2olktn83lTLdp3Ls2DE6dOhA3759KV68uNeliQRd0ILAOfdP4JyXU2adLdQ5WDWInE9aWhoTJkzgqz6vcvzwfpo3b05cXBwVKlTwujSRkNHBTvGlk03hKleuTKdOnfhd0eI80G0cn3/+uUJAfEfXv4vv/POf/6RHjx4sXbqUChUqMGvWLD7eXUz9gMS3NCIQ39i8eTPNmjXj3nvv5aeffuL9999nw4YNNGvWTCEgvqYgkHwvKSmJ559/nipVqrBo0SIGDRqkpnAip9FvgeRbhw4dYujQobz11lukpaXRpUsXXnvtNYoWLep1aSJhRUEg+c6JEycYO3YsAwcO5MCBAzz11FMMHDjwnE3h1NpB/EyHhiTfONkUrkKFCnTt2pW77rqLVatW8fHHH+ebzqAiwaAgkHxh/vz53H333bRr145rrrmG+fPn880333DXXbrFhcj5KAgkT1u9ejUPP/wwDRo04ODBg/ztb38jPj6ehx9+2OvSRPIMBYHkST/88ANt27bl7rvvZs2aNbz55pts3bqVtm3bqimcyAXSZLHkKb/++isDBw5k7NixFCpUiN69e9OjRw+uvvpqr0sTybMUBJInHDt2jLfeeouhQ4dy9OhRnn32WV5//XVKlMj5lpIikjsKAglraWlpfPjhh/Tt25fdu3fTrFkzBg8eTMWKFb0uTSTf0MFUCUvOOWbPnk3VqlXp2LEjpUuXZsmSJcyaNUshIBJgCgIJO99//z333nsvzZs3JyMjg88//5x//etf/P73v/e6NJF8SUEgYWPr1q08/vjj1K1bl8TERN577z02btxI8+bN1RROJIgUBOK5X375hRdeeIHKlSvz3XffMXDgQBISEujYsaOawomEgH7LxDOHDx/mjTfeYOTIkaSlpdG5c2dee+01ihUr5nVpIr6iIPCp1u8tBbxptpaSksK4ceMYMGAAv/76K23atGHQoEHcdtttIa9FRHRoSEIoIyODKVOmUKFCBV555RWqVatGfHw8U6ZMUQiIeEhBICHx7bffUqNGDZ566imKFCnC119/zTfffMPdd9/tdWkivqcgkKBau3YtDRo04OGHH2b//v1MnjyZ1atX88gjj+hMIJEwoSCQoPjxxx9p164d0dHRxMfHM3LkSLZt20a7du3UFE4kzGiyWAJq//79DBo0iDFjxlCgQAF69epFz549iYqK8ro0EcmBgkAC4tixY7z99tsMGTKEo0eP8swzz9CvXz81hRPJAxQEcknS0tKYOHEiffv2JSkpiaZNmzJ48GAqVarkdWkikks6WCsXxTnHnDlzqFatGs899xwlS5Zk8eLFzJ49WyEgkscoCOSCLV26lHr16tGsWTPS0tKYMWPGqUZxF6r1e0tPXdwmIt5QEEiubdu2jRYtWlCnTh0SEhIYN24cmzZtokWLFjoVVCQPUxCEWF58B7x79246depEpUqV+PbbbxkwYAAJCQm88MILagonkg/ot1hydPjwYYYNG8bIkSNJTU3lpZdeok+fPmoKJ5LPKAjkf2TXFG7gwIGUKVPG69JEJAh0aMiHZq1JYs3Ogyz/4QB1hyxg1pokILMp3NSpU7njjjt45ZVXqFq1KitXrmTKlCkKAZF8LGgjAjP7K9AY2Oucq5zN+vrAbOCHrEUznXP9g1WPZJq1JomYmRtISc8AIOlgMjEzN7Bx00ZmvfUqq1atolq1avz9739XPyARnwjmoaGPgNHApHNss8Q51ziINchZhn29jeTU9DOWJaemM+5feym4bx+TJk2ibdu26gck4iNBCwLn3GIzKx2s55eL88vB5GyXF7q6GFu3baNw4cIhrkhEvOb1277aZrbOzOaZWY6Xo5pZRzOLN7P4ffv2hbK+fOeGIpdlu7xE1BUKARGf8jIIVgO3OOeqAaOAWTlt6Jwb75yr7pyrrlMXL05ycjJDhgwhceabZKQeP2NdZERBuje43aPKRMRrngWBc+6wc+5o1uOvgAgzK+pVPflVeno6EyZMoFy5csTExFC7eCF61L+ZywpmfutLREUS16IKzaPVJVTErzy7jsDMbgT2OOecmd1DZijt96qe/MY5xxdffEGvXr3YvHkztWrV4pNPPqFevXoALPnFu5vXi0h4Cebpo1OA+kBRM9sF9AUiAJxz44BWwItmlgYkA22ccy5Y9fjJsmXL6NGjB0uWLKF8+fLMmDGDxx9/XKeCiki2gnnW0JPnWT+azNNLJUC2bdtG7969mTlzJjfccAPvvvsuHTp0ICIiwuvSsnXywraU9AzqDllA9wa36xCViAe8PmvIV3K6ovdS7d69mxdffJFKlSoxf/58+vfvT0JCAp06dQrrEMjuwrZA/Z+ISO4pCEIkGH/4jhw5QmxsLGXLluWDDz7gxRdfJDExkT59+nDllVcGqvSgyOnCtmFfb/OoIhH/UhCESCD/8KWkpDB69GjKlCnDgAEDaNKkCVu2bGHUqFFcf/31gSo5qHK6sC2n5SISPAqCEAnEH76MjAymTZtGxYoV6dKlC5UrV2bFihVMnTqVsmXLBqrUkCgeFXlBy0UkeBQEIXKpf/gWLFhAzZo1adOmDb/73e+YN28e3333HTVq1AhkmSHTvcHtREYUPGOZLmwT8YaCIEQu9g/f+vXradiwIQ8++CB79+5l4sSJrF69mkcffTRPnw7aPLoEcS2q6MI2kTCgG9OEyMk/cD0+W09KegYloiLPebrkTz/9RGxsLJMnTyYqKorhw4fTuXPnfNUPqHl0Caas2AnowjYRLykIQig3f/gOHDjA4MGDGT068xKL7t2706tXL6655pqQ1Ski/qIgCBPJycm88847xMXFcfjwYZ5++mn69etHyZIlvS5NRPI5BYHH0tPTmTRpErGxsezatYvGjRsTFxdH5cr/c1O3gNKhGBE5SZPFHjnZFK5atWo8++yzFC9enEWLFjF37tygh4CIyOk0IvDA/h82Ub9+LxYvXky5cuWYPn06LVu2zNNnAYlI3qUgCKHt27fz/fhX2bV6ITfccANjx47lueeeC9t+QCLiD74Jgtbvedd//z//+Q/9+/dn/PjxWKHLqdS4A8umvBX2/YBExB98EwReOHLkCMOHD2fEiBGcOHGCTp068fMtDSlc5FqFgIiEDU0WB0FKSgpjxoyhbNmy9O/fn0aNGrF582ZGjx5N4SLXel2eiMgZNCIIIOcc06dPp3fv3iQmJlK/fn3mzp3LPffc43VpIiI50oggQBYuXEjNmjVp3bo1kZGRfPnllyxYsEAhICJhTyOCS7R+/Xp69erFvHnzKFmyJB999BHt2rWjYMGC5/9i0YVtImFAI4KLtHPnTp5++mnuvPNOli5dyhtvvMG2bdto3769QkBE8hSNCC7QgQMHiIuLY9SoUQB069aNmJiYXDeF0ztgEQk3CoJcSk5OZtSoUcTFxXHo0CHat29Pv379KFWqlNeliYhcEh0aOo/09HQ++ugjypcvT8+ePalTpw7r1q3jww8/VAiISL6gIMiBc44vv/ySO++8k2eeeYabbrqJhQsX8uWXX1KlShWvyxMRCRgFQTZWrFjB/fffT+PGjTl+/Diffvopy5cvp379+l6XJiIScAqC0+zYsYMnnniCmjVrnroSePPmzTzxxBPqDCoi+ZYvgmDWmiTW7DzI8h8OUHfIAmatSTpj/Z49e+jcuTMVK1Zk3rx59O3bl8TERDp37qzOoCKS7+X7s4ZmrUkiZuYGUtIzAEg6mEzMzA0APFi2CCNGjGD48OEcP36cjh07Ehsby4033uhlySIiIZXvg2DY19tITk0/Y1lyajqxn8Xzwgcd2bt3L61atWLQoEGUL1/eoypFRLyT74Pgl4PJ2S4/lFaAChUqMGfOHGrWrBniqkREwke+D4LiUZEkZRMG1xYuwKJFizQJLCK+l+8ni7s3uJ3IiDN7/0RGFKBv8zsVAiIiBDEIzOyvZrbXzDbmsN7M7B0zSzCz9WZ2VzDqaB5dgrgWVbisYOauloiKJK5FVZpHlwjGy4mI5DnBPDT0ETAamJTD+oZAuayPmsC7Wf8GXPPoEkxZsRNQ0zcRkbMFbUTgnFsMHDjHJs2ASS7TMiDKzG4KVj0iIpI9L+cISgA/n/b5rqxl/8PMOppZvJnF79u3LyTFiYj4RZ6YLHbOjXfOVXfOVS9WrJjX5YiI5CteBkESUPK0z2/OWiYiIiHkZRDMAf6UdfZQLeCQc263h/WIiPhS0M4aMrMpQH2gqJntAvoCEQDOuXHAV0AjIAE4BjwTrFpERCRnQQsC59yT51nvgM7Ben0REcmdPDFZLCIiwaMgEBHxOQWBiIjPKQhERHxOQSAi4nP5/n4EJ6nZnIhI9jQiEBHxOQWBiIjPKQhERHxOQSAi4nMKAhERn1MQiIj4nIJARMTnFAQiIj6nIBAR8TnLvC1A3mFm+4CfLvLLiwK/BrCcvED77A/aZ3+4lH2+xTmX7U3f81wQXAozi3fOVfe6jlDSPvuD9tkfgrXPOjQkIuJzCgIREZ/zWxCM97oAD2if/UH77A9B2WdfzRGIiMj/8tuIQEREzqIgEBHxuXwZBGb2qJltM7MEM+uVzfrLzWxa1vrlZlY69FUGVi72uauZbTaz9Wb2nZnd4kWdgXS+fT5tu5Zm5swsz59qmJt9NrM/ZH2vN5nZJ6GuMdBy8bNdyswWmtmarJ/vRl7UGShm9lcz22tmG3NYb2b2Ttb/x3ozu+uSX9Q5l68+gIJAInAbcBmwDqh41jYvAeOyHrcBpnlddwj2+X7giqzHL/phn7O2uwpYDCwDqntddwi+z4glcHQAAAOQSURBVOWANcA1WZ9f73XdIdjn8cCLWY8rAj96Xfcl7nM94C5gYw7rGwHzAANqAcsv9TXz44jgHiDBOfdv51wKMBVodtY2zYCJWY8/Ax40MwthjYF23n12zi10zh3L+nQZcHOIawy03HyfAQYAQ4HjoSwuSHKzz88DY5xzvwE45/aGuMZAy80+O6BI1uOrgV9CWF/AOecWAwfOsUkzYJLLtAyIMrObLuU182MQlAB+Pu3zXVnLst3GOZcGHAKuC0l1wZGbfT5dBzLfUeRl593nrCFzSefcl6EsLIhy830uD5Q3s3+Z2TIzezRk1QVHbvb5daCdme0CvgK6hKY0z1zo7/t5FbqkciTPMbN2QHXgPq9rCSYzKwCMBJ72uJRQK0Tm4aH6ZI76FptZFefcQU+rCq4ngY+ccyPMrDYw2cwqO+cyvC4sr8iPI4IkoORpn9+ctSzbbcysEJnDyf0hqS44crPPmNlDwKtAU+fciRDVFizn2+ergMrAIjP7kcxjqXPy+IRxbr7Pu4A5zrlU59wPwHYygyGvys0+dwA+BXDOLQUKk9mcLb/K1e/7hciPQbASKGdmt5rZZWROBs85a5s5QPusx62ABS5rFiaPOu8+m1k08B6ZIZDXjxvDefbZOXfIOVfUOVfaOVeazHmRps65eG/KDYjc/GzPInM0gJkVJfNQ0b9DWWSA5WafdwIPApjZHWQGwb6QVhlac4A/ZZ09VAs45JzbfSlPmO8ODTnn0szs/4CvyTzj4K/OuU1m1h+Id87NASaQOXxMIHNSpo13FV+6XO7zMOBKYHrWvPhO51xTz4q+RLnc53wll/v8NfCImW0G0oHuzrk8O9rN5T7/BXjfzP4fmRPHT+flN3ZmNoXMMC+aNe/RF4gAcM6NI3MepBGQABwDnrnk18zD/18iIhIA+fHQkIiIXAAFgYiIzykIRER8TkEgIuJzCgIREZ9TEIiI+JyCQETE5xQEIpfIzGpk9YUvbGa/y7oPQGWv6xLJLV1QJhIAZjaQzNYGkcAu51ycxyWJ5JqCQCQAsvrgrCTzvgd1nHPpHpckkms6NCQSGNeR2cvpKjJHBiJ5hkYEIgFgZnPIvHvWrcBNzrn/87gkkVzLd91HRULNzP4EpDrnPjGzgsD3ZvaAc26B17WJ5IZGBCIiPqc5AhERn1MQiIj4nIJARMTnFAQiIj6nIBAR8TkFgYiIzykIRER87v8DvVa4jA7JyLwAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.errorbar(x, y, ye, fmt=\"o\")\n", "plt.xlabel(\"x\")\n", "plt.ylabel(\"y\")\n", "plt.plot(x, model(x, *m.values[:]), color=\"k\"); # trick to access values as a tuple" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "FMin(fval=3.9594362732650183, edm=1.0859678150194733e-22, tolerance=0.1, nfcn=34, ncalls=34, up=1.0, is_valid=True, has_valid_parameters=True, has_accurate_covar=True, has_posdef_covar=True, has_made_posdef_covar=False, hesse_failed=False, has_covariance=True, is_above_max_edm=False, has_reached_call_limit=False)\n" ] } ], "source": [ "print(repr(m.fmin)) # repr() disables the usual pretty printing" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\"Minos Errors\" are not automatically computed. You need to run *Minos* explicitly." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
a b
Error -0.12 0.12 -0.2 0.2
Valid True True True True
At Limit False False False False
Max FCN False False False False
New Min False False False False
\n" ], "text/plain": [ "------------------------------------------------------------\n", "| | a | b |\n", "------------------------------------------------------------\n", "| Error | -0.12 | 0.12 | -0.2 | 0.2 |\n", "| Valid | True | True | True | True |\n", "| At Limit | False | False | False | False |\n", "| Max FCN | False | False | False | False |\n", "| New Min | False | False | False | False |\n", "------------------------------------------------------------" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "m.minos()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In such a simple fit, the Minos and Hesse uncertainty estimates are equal, but in non-parabolic cost functions they are not.\n", "\n", "The Minos and Hesse uncertaintes are now nicely comparable in the parameter display:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "
Name Value Hesse Error Minos Error- Minos Error+ Limit- Limit+ Fixed
0 a 1.05 0.12 -0.12 0.12
1 b 1.99 0.20 -0.20 0.20
\n" ], "text/plain": [ "------------------------------------------------------------------------------------------\n", "| | Name | Value | Hesse Err | Minos Err- | Minos Err+ | Limit- | Limit+ | Fixed |\n", "------------------------------------------------------------------------------------------\n", "| 0 | a | 1.05 | 0.12 | -0.12 | 0.12 | | | |\n", "| 1 | b | 1.99 | 0.20 | -0.20 | 0.20 | | | |\n", "------------------------------------------------------------------------------------------" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "m.params" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The Minos uncertainties can be read-out with the following attribute (read-only)." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Did Minos work for parameter a? True\n", "lower error=-0.118 upper error=0.118\n" ] } ], "source": [ "a_me = m.merrors[\"a\"] # returns a data struct with many fields\n", "print(f\"Did Minos work for parameter {a_me.name}? {a_me.is_valid}\\n\"\n", " f\"lower error={a_me.lower:.3} upper error={a_me.upper:.3}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Much more information can be pulled from this object. Try `dir(a_me)`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Interactively manipulate fit state" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's mess around. Let's say we know that `a = 1`, what is the value of `b` then? We can fix `a` and set its value, and then run *Migrad* again.\n", "\n", "We can manipulate Minuit with the attributes `m.values`, `m.fixed`, and `m.errors` (to set different step sizes)." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
FCN = 4.127 Ncalls = 8 (66 total)
EDM = 1.51e-20 (Goal: 0.0002) up = 1.0
Valid Min. Valid Param. Above EDM Reached call limit
True True False False
Hesse failed Has cov. Accurate Pos. def. Forced
False True True True False
\n", "\n", "\n", "\n", "\n", "
Name Value Hesse Error Minos Error- Minos Error+ Limit- Limit+ Fixed
0 a 1.00 0.12 -0.12 0.12 yes
1 b 2.06 0.11 -0.20 0.20
\n" ], "text/plain": [ "------------------------------------------------------------------\n", "| FCN = 4.127 | Ncalls=8 (66 total) |\n", "| EDM = 1.51e-20 (Goal: 0.0002) | up = 1.0 |\n", "------------------------------------------------------------------\n", "| Valid Min. | Valid Param. | Above EDM | Reached call limit |\n", "------------------------------------------------------------------\n", "| True | True | False | False |\n", "------------------------------------------------------------------\n", "| Hesse failed | Has cov. | Accurate | Pos. def. | Forced |\n", "------------------------------------------------------------------\n", "| False | True | True | True | False |\n", "------------------------------------------------------------------\n", "------------------------------------------------------------------------------------------\n", "| | Name | Value | Hesse Err | Minos Err- | Minos Err+ | Limit- | Limit+ | Fixed |\n", "------------------------------------------------------------------------------------------\n", "| 0 | a | 1.00 | 0.12 | -0.12 | 0.12 | | | yes |\n", "| 1 | b | 2.06 | 0.11 | -0.20 | 0.20 | | | |\n", "------------------------------------------------------------------------------------------" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "m.values[\"a\"] = 1\n", "m.fixed[\"a\"] = True\n", "m.migrad()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This took Minuit only 8 calls, because it was already close to the minimum and because it could *reuse information from the previous minimization*. This is another **key feature** of Minuit and iminuit.\n", "\n", "The value and error of `b` changed a bit. Let's see how `b` varies when we scan over `a`." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "a = np.linspace(0.5, 1.5, 20)\n", "b = []\n", "be = []\n", "fval = []\n", "for ai in a:\n", " m.values[\"a\"] = ai\n", " m.migrad()\n", " assert m.valid # assert that fit is valid\n", " fval.append(m.fval) # get value of cost function\n", " b.append(m.values[\"b\"])\n", " be.append(m.errors[\"b\"])\n", "\n", "# values and uncertainty of b as a function of a, also shown is the function minimum\n", "plt.errorbar(a, b, be, fmt=\"o\", color=\"C0\")\n", "plt.twinx()\n", "plt.plot(a, fval, color=\"C1\");" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The uncertainty estimate does not change, because the cost function has a constant second derivative, and Minuit uses the second derivative by default to estimate the uncertainty (\"Hesse method\").\n", "\n", "Let's see how the corresponding lines look like. " ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.errorbar(x, y, ye, fmt=\"o\")\n", "for i, (ai, bi) in enumerate(zip(a, b)):\n", " plt.plot(x, model(x, ai, bi), color=f\"{i / 30.}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Mechanical analog**: **stiff rod** attached to the data points with **springs** of constant tension. If both `a` and `b` are minimized, Migrad finds the minimum energy configuration. This is also true, if `a` is externally constrained to other values (fixed during minimization)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Cost functions\n", "\n", "Minuit now comes with builtin cost functions, which can be imported from `iminuit.cost`. Currently available:\n", "\n", "- Unbinned negative log-likelihood\n", "- Extended unbinned negative log-likelihood\n", "- Binned negative log-likelihood\n", "- Extended binned negative log-likelihood\n", "- Least-squares\n", "- Robust least-squares\n", "\n", "The `errordef` parameter is automatically set correctly for these.\n", "\n", "As a particle physicist, you will often fit some peak over background. Let's do that." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from scipy import stats\n", "\n", "rng = np.random.default_rng(1)\n", "\n", "x = np.append(stats.norm(0.5, 0.05).rvs(size=500, random_state=rng),\n", " stats.expon(0.0, 0.5).rvs(size=1000, random_state=rng))\n", "\n", "plt.hist(x, bins=30, range=(0, 1));" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
FCN = 4351 Ncalls = 106 (117 total)
EDM = 5.04e+03 (Goal: 0.0001) up = 0.5
Valid Min. Valid Param. Above EDM Reached call limit
False True True False
Hesse failed Has cov. Accurate Pos. def. Forced
False True False False True
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
Name Value Hesse Error Minos Error- Minos Error+ Limit- Limit+ Fixed
0 ns 1.0 0.5
1 mu 1.0 0.4
2 sigma 0.55 0.13
3 nb 1.0 0.2
4 lambd 0.6 0.5
\n" ], "text/plain": [ "------------------------------------------------------------------\n", "| FCN = 4351 | Ncalls=106 (117 total) |\n", "| EDM = 5.04e+03 (Goal: 0.0001) | up = 0.5 |\n", "------------------------------------------------------------------\n", "| Valid Min. | Valid Param. | Above EDM | Reached call limit |\n", "------------------------------------------------------------------\n", "| False | True | True | False |\n", "------------------------------------------------------------------\n", "| Hesse failed | Has cov. | Accurate | Pos. def. | Forced |\n", "------------------------------------------------------------------\n", "| False | True | False | False | True |\n", "------------------------------------------------------------------\n", "-------------------------------------------------------------------------------------------\n", "| | Name | Value | Hesse Err | Minos Err- | Minos Err+ | Limit- | Limit+ | Fixed |\n", "-------------------------------------------------------------------------------------------\n", "| 0 | ns | 1.0 | 0.5 | | | | | |\n", "| 1 | mu | 1.0 | 0.4 | | | | | |\n", "| 2 | sigma | 0.55 | 0.13 | | | | | |\n", "| 3 | nb | 1.0 | 0.2 | | | | | |\n", "| 4 | lambd | 0.6 | 0.5 | | | | | |\n", "-------------------------------------------------------------------------------------------" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# extended binned maximum likelihood fit\n", "from iminuit.cost import ExtendedBinnedNLL\n", "\n", "n, xe = np.histogram(x, bins=30, range=(0, 1)) # or use boost_histogram here!\n", "\n", "\n", "# ExtendedBinnedNLL wants a model that returns the expected counts per bin\n", "\n", "def signal(xe, ns, mu, sigma):\n", " return ns * stats.norm(mu, sigma).cdf(xe)\n", "\n", "\n", "def background(xe, nb, lambd):\n", " return nb * stats.expon(0.0, lambd).cdf(xe)\n", "\n", "\n", "def total(xe, ns, mu, sigma, nb, lambd):\n", " return signal(xe, ns, mu, sigma) + background(xe, nb, lambd)\n", "\n", "cost = ExtendedBinnedNLL(n, xe, total)\n", "\n", "m = Minuit(cost, ns=1, mu=1, sigma=1, nb=1, lambd=1)\n", "m.migrad()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Uh oh, this does not look good. Let's do this again in verbose mode." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(1.0, 1.0, 1.0, 1.0, 1.0) -> 4674.964736477243\n", "(1.0004721689651892, 1.0, 1.0, 1.0, 1.0) -> 4674.747479989268\n", "(0.9995278310348108, 1.0, 1.0, 1.0, 1.0) -> 4675.182029100815\n", "(1.0037087473289117, 1.0, 1.0, 1.0, 1.0) -> 4673.259222937664\n", "(0.9962912526710882, 1.0, 1.0, 1.0, 1.0) -> 4676.672479454253\n", "(1.0, 1.0004721689651892, 1.0, 1.0, 1.0) -> 4675.082012794044\n", "(1.0, 0.9995278310348108, 1.0, 1.0, 1.0) -> 4674.847538457714\n", "(1.0, 1.0025195417256905, 1.0, 1.0, 1.0) -> 4675.591439464525\n", "(1.0, 0.9974804582743095, 1.0, 1.0, 1.0) -> 4674.340262923246\n", "(1.0, 1.0, 1.0004721689651892, 1.0, 1.0) -> 4675.108461158805\n", "(1.0, 1.0, 0.9995278310348108, 1.0, 1.0) -> 4674.820982318544\n", "(1.0, 1.0, 1.0041063146339098, 1.0, 1.0) -> 4676.2136721107645\n", "(1.0, 1.0, 0.9958936853660902, 1.0, 1.0) -> 4673.713571570834\n", "(1.0, 1.0, 1.0, 1.0004721689651892, 1.0) -> 4674.532834946704\n", "(1.0, 1.0, 1.0, 0.9995278310348108, 1.0) -> 4675.3967755808835\n", "(1.0, 1.0, 1.0, 1.001900763621876, 1.0) -> 4673.2269103671\n", "(1.0, 1.0, 1.0, 0.998099236378124, 1.0) -> 4676.704792024484\n", "(1.0, 1.0, 1.0, 1.0, 1.0004721689651892) -> 4675.230740501793\n", "(1.0, 1.0, 1.0, 1.0, 0.9995278310348108) -> 4674.6986609070855\n", "(1.0, 1.0, 1.0, 1.0, 1.0026357449497056) -> 4676.448710524963\n", "(1.0, 1.0, 1.0, 1.0, 0.9973642550502942) -> 4673.478533005953\n", "(1.0, 1.0, 0.9958936853660902, 1.0, 1.0) -> 4673.713571570834\n", "(1.0, 1.0, 0.9794684268304512, 1.0, 1.0) -> 4668.687788287826\n", "(1.0, 1.0, 0.9384052804913535, 1.0, 1.0) -> 4655.999021917714\n", "(1.0, 1.0, 0.8152158414740606, 1.0, 1.0) -> 4617.747455906111\n", "(1.0, 1.0, 0.4456475244221817, 1.0, 1.0) -> 4580.859682709635\n", "(1.0, 1.0, 0.5137150129086776, 1.0, 1.0) -> 4563.82573900133\n", "(1.0, 1.0, 0.5874484732019645, 1.0, 1.0) -> 4564.126392536502\n", "(1.0, 1.0, 0.5494450164593476, 1.0, 1.0) -> 4562.090551203665\n", "(1.0036637038367755, 1.0, 0.5494450164593476, 1.0, 1.0) -> 4560.200497718858\n", "(0.9963362961632245, 1.0, 0.5494450164593476, 1.0, 1.0) -> 4563.983565611905\n", "(1.0, 1.002488943851375, 0.5494450164593476, 1.0, 1.0) -> 4564.255266810877\n", "(1.0, 0.9975110561486249, 0.5494450164593476, 1.0, 1.0) -> 4559.929472257163\n", "(1.0, 1.0, 0.5535016088329827, 1.0, 1.0) -> 4562.135477405995\n", "(1.0, 1.0, 0.5453884240857125, 1.0, 1.0) -> 4562.091244256899\n", "(1.0, 1.0, 0.5503309029222405, 1.0, 1.0) -> 4562.096515707349\n", "(1.0, 1.0, 0.5485591299964547, 1.0, 1.0) -> 4562.086762188794\n", "(1.0, 1.0, 0.5494450164593476, 1.0018776786774248, 1.0) -> 4560.479344337338\n", "(1.0, 1.0, 0.5494450164593476, 0.9981223213225751, 1.0) -> 4563.703743308258\n", "(1.0, 1.0, 0.5494450164593476, 1.0, 1.0026037414694076) -> 4563.519650839014\n", "(1.0, 1.0, 0.5494450164593476, 1.0, 0.9973962585305924) -> 4560.659130785849\n", "(1.0, 1.0, 0.5494450164593476, 1.0, 0.9973962585305924) -> 4560.659130785849\n", "(1.0, 1.0, 0.5494450164593476, 1.0, 0.9869812926529622) -> 4554.910259878616\n", "(1.0, 1.0, 0.5494450164593476, 1.0, 0.9609438779588867) -> 4540.376251333627\n", "(1.0, 1.0, 0.5494450164593476, 1.0, 0.8828316338766602) -> 4495.413838360195\n", "(1.0, 1.0, 0.5494450164593476, 1.0, 0.6484949016299804) -> 4351.069350631338\n", "(1.0, 1.0, 0.5494450164593476, 1.0, -0.054515295110058704) -> nan\n", "(nan, nan, nan, nan, nan) -> nan\n", "(nan, nan, nan, nan, nan) -> nan\n", "(nan, nan, nan, nan, nan) -> nan\n", "(nan, nan, nan, nan, nan) -> nan\n", "(nan, nan, nan, nan, nan) -> nan\n", "(1.0030670068127157, 1.0, 0.5494450164593476, 1.0, 0.6484949016299804) -> 4349.650048427409\n", "(0.9969329931872843, 1.0, 0.5494450164593476, 1.0, 0.6484949016299804) -> 4352.490416381839\n", "(1.0, 1.001880059906998, 0.5494450164593476, 1.0, 0.6484949016299804) -> 4352.484827719281\n", "(1.0, 0.9981199400930022, 0.5494450164593476, 1.0, 0.6484949016299804) -> 4349.65580502589\n", "(1.0, 1.0, 0.5503101987837744, 1.0, 0.6484949016299804) -> 4351.120385981633\n", "(1.0, 1.0, 0.5485798341349208, 1.0, 0.6484949016299804) -> 4351.019998685358\n", "(1.0, 1.0, 0.5494450164593476, 1.0019196539019368, 0.6484949016299804) -> 4349.320380512302\n", "(1.0, 1.0, 0.5494450164593476, 0.9980803460980631, 0.6484949016299804) -> 4352.82066610135\n", "(1.0, 1.0, 0.5494450164593476, 1.0, 0.6509569048797456) -> 4352.6151864718095\n", "(1.0, 1.0, 0.5494450164593476, 1.0, 0.6460328983802152) -> 4349.524230388504\n", "(1.0, 1.0, 0.5494450164593476, 1.0, 0.6526872958388353) -> 4353.702053535972\n", "(1.0, 1.0, 0.5494450164593476, 1.0, 0.6443025074211254) -> 4348.43872332317\n", "(3.4698604520405016, -0.3768522769030831, 0.5236480900797368, 2.4324800341458888, -4.667074736776749) -> nan\n", "(nan, nan, nan, nan, nan) -> nan\n", "(nan, nan, nan, nan, nan) -> nan\n", "(nan, nan, nan, nan, nan) -> nan\n", "(nan, nan, nan, nan, nan) -> nan\n", "(nan, nan, nan, nan, nan) -> nan\n", "(nan, nan, nan, nan, nan) -> nan\n", "(nan, nan, nan, nan, nan) -> nan\n", "(nan, nan, nan, nan, nan) -> nan\n", "(nan, nan, nan, nan, nan) -> nan\n", "(nan, nan, nan, nan, nan) -> nan\n", "(1.0, 1.0, 0.5494450164593476, 1.0, 0.6484949016299804) -> 4351.069350631338\n", "(1.0030670068127157, 1.0, 0.5494450164593476, 1.0, 0.6484949016299804) -> 4349.650048427409\n", "(0.9969329931872843, 1.0, 0.5494450164593476, 1.0, 0.6484949016299804) -> 4352.490416381839\n", "(1.0, 1.001880059906998, 0.5494450164593476, 1.0, 0.6484949016299804) -> 4352.484827719281\n", "(1.0, 0.9981199400930022, 0.5494450164593476, 1.0, 0.6484949016299804) -> 4349.65580502589\n", "(1.0, 1.0, 0.5503101987837744, 1.0, 0.6484949016299804) -> 4351.120385981633\n", "(1.0, 1.0, 0.5485798341349208, 1.0, 0.6484949016299804) -> 4351.019998685358\n", "(1.0, 1.0, 0.5494450164593476, 1.0019196539019368, 0.6484949016299804) -> 4349.320380512302\n", "(1.0, 1.0, 0.5494450164593476, 0.9980803460980631, 0.6484949016299804) -> 4352.82066610135\n", "(1.0, 1.0, 0.5494450164593476, 1.0, 0.6526872958388353) -> 4353.702053535972\n", "(1.0, 1.0, 0.5494450164593476, 1.0, 0.6443025074211254) -> 4348.43872332317\n", "(1.0006134013625432, 1.0, 0.5494450164593476, 1.0, 0.6484949016299804) -> 4350.7853492625145\n", "(0.9993865986374568, 1.0, 0.5494450164593476, 1.0, 0.6484949016299804) -> 4351.353422541959\n", "(1.0, 1.0003760119813996, 0.5494450164593476, 1.0, 0.6484949016299804) -> 4351.352292332769\n", "(1.0, 0.9996239880186004, 0.5494450164593476, 1.0, 0.6484949016299804) -> 4350.786486189247\n", "(1.0, 1.0, 0.5496180529242329, 1.0, 0.6484949016299804) -> 4351.079423391176\n", "(1.0, 1.0, 0.5492719799944623, 1.0, 0.6484949016299804) -> 4351.059345207472\n", "(1.0, 1.0, 0.5494450164593476, 1.0003839307803875, 0.6484949016299804) -> 4350.719369189276\n", "(1.0, 1.0, 0.5494450164593476, 0.9996160692196127, 0.6484949016299804) -> 4351.4194258873495\n", "(1.0, 1.0, 0.5494450164593476, 1.0, 0.6493333804717514) -> 4351.595735282312\n", "(1.0, 1.0, 0.5494450164593476, 1.0, 0.6476564227882093) -> 4350.543048968641\n", "(1.0030670068127157, 1.001880059906998, 0.5494450164593476, 1.0, 0.6484949016299804) -> 4351.068348023784\n", "(1.0030670068127157, 1.0, 0.5503101987837744, 1.0, 0.6484949016299804) -> 4349.700977099286\n", "(1.0030670068127157, 1.0, 0.5494450164593476, 1.0019196539019368, 0.6484949016299804) -> 4347.90269969041\n", "(1.0030670068127157, 1.0, 0.5494450164593476, 0.9999999999999999, 0.6526872958388353) -> 4352.281183475792\n", "(1.0, 1.001880059906998, 0.5503101987837744, 0.9999999999999999, 0.6484949016299804) -> 4352.531912644887\n", "(1.0, 1.001880059906998, 0.5494450164593476, 1.0019196539019368, 0.6484949016299804) -> 4350.734089393373\n", "(1.0, 1.001880059906998, 0.5494450164593476, 0.9999999999999999, 0.6526872958388353) -> 4355.119901611518\n", "(1.0, 1.0, 0.5503101987837744, 1.0019196539019368, 0.6484949016299804) -> 4349.371481813372\n", "(1.0, 1.0, 0.5503101987837744, 0.9999999999999999, 0.6526872958388353) -> 4353.752422639777\n", "(1.0, 1.0, 0.5494450164593476, 1.0019196539019368, 0.6526872958388353) -> 4351.954059911005\n", "(49.66909317565592, -40.32568678306268, -11.343906753210103, -16.693789048054562, 45.42198533718604) -> nan\n", "(nan, nan, nan, nan, nan) -> nan\n", "(nan, nan, nan, nan, nan) -> nan\n", "(nan, nan, nan, nan, nan) -> nan\n", "(nan, nan, nan, nan, nan) -> nan\n", "(nan, nan, nan, nan, nan) -> nan\n", "(nan, nan, nan, nan, nan) -> nan\n", "(nan, nan, nan, nan, nan) -> nan\n", "(nan, nan, nan, nan, nan) -> nan\n", "(nan, nan, nan, nan, nan) -> nan\n", "(nan, nan, nan, nan, nan) -> nan\n" ] }, { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
FCN = 4351 Ncalls = 106 (117 total)
EDM = 5.04e+03 (Goal: 0.0001) up = 0.5
Valid Min. Valid Param. Above EDM Reached call limit
False True True False
Hesse failed Has cov. Accurate Pos. def. Forced
False True False False True
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
Name Value Hesse Error Minos Error- Minos Error+ Limit- Limit+ Fixed
0 ns 1.0 0.5
1 mu 1.0 0.4
2 sigma 0.55 0.13
3 nb 1.0 0.2
4 lambd 0.6 0.5
\n" ], "text/plain": [ "------------------------------------------------------------------\n", "| FCN = 4351 | Ncalls=106 (117 total) |\n", "| EDM = 5.04e+03 (Goal: 0.0001) | up = 0.5 |\n", "------------------------------------------------------------------\n", "| Valid Min. | Valid Param. | Above EDM | Reached call limit |\n", "------------------------------------------------------------------\n", "| False | True | True | False |\n", "------------------------------------------------------------------\n", "| Hesse failed | Has cov. | Accurate | Pos. def. | Forced |\n", "------------------------------------------------------------------\n", "| False | True | False | False | True |\n", "------------------------------------------------------------------\n", "-------------------------------------------------------------------------------------------\n", "| | Name | Value | Hesse Err | Minos Err- | Minos Err+ | Limit- | Limit+ | Fixed |\n", "-------------------------------------------------------------------------------------------\n", "| 0 | ns | 1.0 | 0.5 | | | | | |\n", "| 1 | mu | 1.0 | 0.4 | | | | | |\n", "| 2 | sigma | 0.55 | 0.13 | | | | | |\n", "| 3 | nb | 1.0 | 0.2 | | | | | |\n", "| 4 | lambd | 0.6 | 0.5 | | | | | |\n", "-------------------------------------------------------------------------------------------" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cost.verbose = 1\n", "m = Minuit(cost, ns=1, mu=1, sigma=1, nb=1, lambd=1)\n", "m.migrad()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The problem is that some computations during minimization returned nan. Migrad can recover from that some extend, but it shouldn't happen.\n", "\n", "Here, it happens for several reasons:\n", "- `sigma` must be positive, but no limit is set\n", "- `lambd` must be positive, but no limit is set\n", "\n", "This is why Minuit supports parameter limits. Adding limits does not change the parameter values at the minimum, but it will distort the parameter uncertainties if the fit converges with a parameter value at its limit.\n", "\n", "Let's try again with limits for `sigma` and `lambd`." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/hdembinski/Extern/iminuit/src/iminuit/cost.py:12: RuntimeWarning: invalid value encountered in log\n", " return np.log(x + log_const)\n" ] }, { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
FCN = -4067 Ncalls = 1081 (1081 total)
EDM = 9.22 (Goal: 0.0001) up = 0.5
Valid Min. Valid Param. Above EDM Reached call limit
False True False True
Hesse failed Has cov. Accurate Pos. def. Forced
False True False True False
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
Name Value Hesse Error Minos Error- Minos Error+ Limit- Limit+ Fixed
0 ns 1.77e3 0.12e3
1 mu 0.338 0.033
2 sigma 0.30 0.04 0
3 nb -27.3e3 1.8e3
4 lambd 10.1e3 0.6e3 0
\n" ], "text/plain": [ "------------------------------------------------------------------\n", "| FCN = -4067 | Ncalls=1081 (1081 total) |\n", "| EDM = 9.22 (Goal: 0.0001) | up = 0.5 |\n", "------------------------------------------------------------------\n", "| Valid Min. | Valid Param. | Above EDM | Reached call limit |\n", "------------------------------------------------------------------\n", "| False | True | False | True |\n", "------------------------------------------------------------------\n", "| Hesse failed | Has cov. | Accurate | Pos. def. | Forced |\n", "------------------------------------------------------------------\n", "| False | True | False | True | False |\n", "------------------------------------------------------------------\n", "-------------------------------------------------------------------------------------------\n", "| | Name | Value | Hesse Err | Minos Err- | Minos Err+ | Limit- | Limit+ | Fixed |\n", "-------------------------------------------------------------------------------------------\n", "| 0 | ns | 1.77e3 | 0.12e3 | | | | | |\n", "| 1 | mu | 0.338 | 0.033 | | | | | |\n", "| 2 | sigma | 0.30 | 0.04 | | | 0 | | |\n", "| 3 | nb | -27.3e3 | 1.8e3 | | | | | |\n", "| 4 | lambd | 10.1e3 | 0.6e3 | | | 0 | | |\n", "-------------------------------------------------------------------------------------------" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cost.verbose = 0\n", "m = Minuit(cost, ns=1, mu=1, sigma=1, nb=1, lambd=1,\n", " limit_lambd=(0, None),\n", " limit_sigma=(0, None))\n", "m.migrad()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This looks better, more green, but still a failure. This time, Minuit gave up because it ran over its call limit. We didn't set a call limit, but Minuit uses a heuristic in this case to not iterate forever. In fact, that was not the only problem, another NaN result was encountered.\n", "\n", "Let's try again with an increased the call limit." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
FCN = -4079 Ncalls = 489 (1581 total)
EDM = 6.27e-06 (Goal: 0.0001) up = 0.5
Valid Min. Valid Param. Above EDM Reached call limit
True True False False
Hesse failed Has cov. Accurate Pos. def. Forced
False True False False True
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
Name Value Hesse Error Minos Error- Minos Error+ Limit- Limit+ Fixed
0 ns 1.34e3 0.12e3
1 mu 0.373 0.010
2 sigma 0.247 0.017 0
3 nb 0.8e6 2.3e6
4 lambd 0.006e6 0.012e6 0
\n" ], "text/plain": [ "------------------------------------------------------------------\n", "| FCN = -4079 | Ncalls=489 (1581 total) |\n", "| EDM = 6.27e-06 (Goal: 0.0001) | up = 0.5 |\n", "------------------------------------------------------------------\n", "| Valid Min. | Valid Param. | Above EDM | Reached call limit |\n", "------------------------------------------------------------------\n", "| True | True | False | False |\n", "------------------------------------------------------------------\n", "| Hesse failed | Has cov. | Accurate | Pos. def. | Forced |\n", "------------------------------------------------------------------\n", "| False | True | False | False | True |\n", "------------------------------------------------------------------\n", "-------------------------------------------------------------------------------------------\n", "| | Name | Value | Hesse Err | Minos Err- | Minos Err+ | Limit- | Limit+ | Fixed |\n", "-------------------------------------------------------------------------------------------\n", "| 0 | ns | 1.34e3 | 0.12e3 | | | | | |\n", "| 1 | mu | 0.373 | 0.010 | | | | | |\n", "| 2 | sigma | 0.247 | 0.017 | | | 0 | | |\n", "| 3 | nb | 0.8e6 | 2.3e6 | | | | | |\n", "| 4 | lambd | 0.006e6 | 0.012e6 | | | 0 | | |\n", "-------------------------------------------------------------------------------------------" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "m = Minuit(cost, ns=1, mu=1, sigma=1, nb=1, lambd=1,\n", " limit_lambd=(0, None),\n", " limit_sigma=(0, None))\n", "m.migrad(ncall=1e6)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This time, Minuit converged to something, but it does not seem to be a minimum. The Hessian matrix is not positiv definite.\n", "\n", "Let's plot this \"solution\"." ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAD4CAYAAAAXUaZHAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAUJUlEQVR4nO3df5Bd5X3f8fcnUrHr1Al2JDCRMMINuFFQM2E2lOJpiqNMwo+M5ZkwjNS6xgpTjR3XTZt0HIgnJVOHidwfduyp41SN+eGOK0GoG2lquy0hJjRxwF3ARiCHRAFkRCVrDTZtxy0Y+ds/7sHdLCvu2ftr9559v2Y0e+85z733e7Srj559znOek6pCktQt37XcBUiSRs9wl6QOMtwlqYMMd0nqIMNdkjpo7XIXALBu3bratGnTcpchSVPl/vvv/1pVrV9s34oI902bNjE7O7vcZUjSVEly5FT7HJaRpA4y3CWpgwx3Seogw12SOshwl6QOMtwlqYMMd0nqIMNdkjrIcJekDloRV6hKK9mm6z7dqt0Tu68ccyVSe/bcJamDDHdJ6iDDXZI6yHCXpA4y3CWpg/qGe5KbkpxI8vCC7e9J8idJHknyz+dtvz7J4SSPJvmpcRQtSXp5baZC3gL8a+ATL25I8mZgG/DDVfVckjOa7ZuB7cAPAd8P/F6S86vq5KgLlySdWt+ee1XdAzyzYPO7gN1V9VzT5kSzfRuwr6qeq6rHgcPARSOsV5LUwqBj7ucDfyvJfUn+IMmPNts3AE/Oa3e02SZJmqBBr1BdC7wWuBj4UeD2JG9Yyhsk2QXsAnj9618/YBmSpMUM2nM/Cnyqer4AfBtYBzwFnD2v3cZm20tU1Z6qmqmqmfXrF715tyRpQIOG++8CbwZIcj5wGvA14ACwPckrkpwLnAd8YRSFSpLa6zssk2QvcCmwLslR4AbgJuCmZnrk88A1VVXAI0luBw4BLwDvdqaMJE1e33Cvqh2n2PW2U7S/EbhxmKIkScPxClVJ6iDXc9eq1HaNdmla2XOXpA4y3CWpgwx3Seogw12SOshwl6QOMtwlqYMMd0nqIMNdkjrIcJekDjLcJamDDHdJ6iDDXZI6yHCXpA4y3CWpg/qGe5Kbkpxo7rq0cN8vJqkk65rnSfKRJIeTPJTkwnEULUl6eW167rcAly3cmORs4CeBr8zbfDm9+6aeB+wCPjZ8iZKkpeob7lV1D/DMIrs+BLwXqHnbtgGfqJ57gdOTnDWSSiVJrQ005p5kG/BUVX1pwa4NwJPznh9tti32HruSzCaZnZubG6QMSdIpLDnck7wK+GXgnw7zwVW1p6pmqmpm/fr1w7yVJGmBQe6h+leBc4EvJQHYCDyQ5CLgKeDseW03NtskSRO05J57VR2sqjOqalNVbaI39HJhVR0HDgBvb2bNXAw8W1XHRluyJKmfNlMh9wJ/DLwxydEk175M888AjwGHgX8L/NxIqpQkLUnfYZmq2tFn/6Z5jwt49/BlSZKG4RWqktRBhrskdZDhLkkdZLhLUgcZ7pLUQYa7JHWQ4S5JHWS4S1IHGe6S1EGGuyR1kOEuSR1kuEtSBxnuktRBhrskdZDhLkkdZLhLUge1uRPTTUlOJHl43rZ/keRPkjyU5D8mOX3evuuTHE7yaJKfGlfhkqRTa9NzvwW4bMG2O4ELquqvA38KXA+QZDOwHfih5jW/mWTNyKqVJLXSN9yr6h7gmQXb/mtVvdA8vRfY2DzeBuyrqueq6nF691K9aIT1SpJaGMWY+88Cn20ebwCenLfvaLPtJZLsSjKbZHZubm4EZUiSXjRUuCd5H/AC8Mmlvraq9lTVTFXNrF+/fpgyJEkLrB30hUneAfw0sLWqqtn8FHD2vGYbm22SpAkaqOee5DLgvcBbquqb83YdALYneUWSc4HzgC8MX6YkaSn69tyT7AUuBdYlOQrcQG92zCuAO5MA3FtV76yqR5LcDhyiN1zz7qo6Oa7iJUmL6xvuVbVjkc0ff5n2NwI3DlOUJGk4XqEqSR1kuEtSBxnuktRBhrskdZDhLkkdNPBFTNJKtOm6Ty93CdKKYM9dkjrIcJekDjLcJamDDHdJ6iDDXZI6yHCXpA4y3CWpgwx3Seogw12SOqhvuCe5KcmJJA/P2/baJHcm+bPm62ua7UnykSSHkzyU5MJxFi9JWlybnvstwGULtl0H3FVV5wF3Nc8BLqd3a73zgF3Ax0ZTpiRpKfqGe1XdAzyzYPM24Nbm8a3AW+dt/0T13AucnuSsURUrSWpn0DH3M6vqWPP4OHBm83gD8OS8dkebbZKkCRr6hGpVFVBLfV2SXUlmk8zOzc0NW4YkaZ5Bl/z9apKzqupYM+xyotn+FHD2vHYbm20vUVV7gD0AMzMzS/7PQVpp2i43/MTuK8dciTR4z/0AcE3z+Bpg/7ztb29mzVwMPDtv+EaSNCF9e+5J9gKXAuuSHAVuAHYDtye5FjgCXN00/wxwBXAY+Cawcww1S5L66BvuVbXjFLu2LtK2gHcPW5QkaTheoSpJHWS4S1IHGe6S1EGGuyR1kOEuSR1kuEtSBxnuktRBhrskdZDhLkkdZLhLUgcZ7pLUQYa7JHWQ4S5JHWS4S1IHGe6S1EGGuyR10FDhnuQfJ3kkycNJ9iZ5ZZJzk9yX5HCS25KcNqpiJUntDBzuSTYA/xCYqaoLgDXAduADwIeq6geArwPXjqJQSVJ7ww7LrAX+cpK1wKuAY8CPA3c0+28F3jrkZ0iSlmjgcK+qp4B/CXyFXqg/C9wPfKOqXmiaHQU2LPb6JLuSzCaZnZubG7QMSdIihhmWeQ2wDTgX+H7gu4HL2r6+qvZU1UxVzaxfv37QMiRJixhmWOYngMeraq6qvgV8CngTcHozTAOwEXhqyBolSUs0TLh/Bbg4yauSBNgKHAI+B1zVtLkG2D9ciZKkpVrbv8niquq+JHcADwAvAA8Ce4BPA/uS/Fqz7eOjKFRTZPZmOHhH/3ZLseUqmNk52veUOmzgcAeoqhuAGxZsfgy4aJj31ZQ7eAccPwiv2zKa9zvyh70/Lf7D2LHmjew9uXU0nytNsaHCXatM2x75i8G+89MT/9xta5423CUMdy1F2x7567b0hlFGZWZnuyGZm6+Ex58e3edKU8xw19KMskc+BptzhH2nvb9vu/0nL7GHr04z3LX04ZaVastVHGrRc9+cI7AGw12dZrhr+YZbRm1mJ9vvOKNvszY9e2naGe7qWeHDLZKWxnDXqtR2bB4cn9d0Mty16uw/eUlvgeoWHJ/XtDLcu2opV4mu9BOlI7b35NbWYe34vKaVt9nrqhdPkrax0k+USloye+5d5klSadWa+nDfdF378Hpi95VjrERd5YVRmkZTH+7SOLU9+eqJV600hrv0MtqefPXEq1Yaw33adGWpAElj5WyZadN2FowzYKRVbaiee5LTgd8GLgAK+FngUeA2YBPwBHB1VX19qCr1FzkLRlIfw/bcPwz856r6a8APA18GrgPuqqrzgLua55KkCRq4557ke4EfA94BUFXPA88n2QZc2jS7Fbgb+KVhipSmQev1amZPeD9Yjd0wPfdzgTng5iQPJvntJN8NnFlVx5o2x4EzF3txkl1JZpPMzs3NDVGGtPz2n7yEQ3VO33abc2T0Nw+XFjHMmPta4ELgPVV1X5IPs2AIpqoqSS324qraA+wBmJmZWbTNquIsmKm2lCmTF0+gHmmYnvtR4GhV3dc8v4Ne2H81yVkAzdcTw5W4SjgLRtIIDdxzr6rjSZ5M8saqehTYChxq/lwD7G6+7h9JpauBs2AkjciwFzG9B/hkktOAx4Cd9H4buD3JtcAR4OohP2Nk2q5D4xo0kqbdUOFeVV8EZhbZ5QIbGqmlLBAnyeUHFmUPX2N1/CDc3OJnZ8tVTpnUwFx+QJqg/ScvaTfb6fhBp0xqKPbcx80pjppn78mt/PrOD/Zv2KZnL70Me+7j5hRHScvAnvskOMVR0oTZc5ekDjLcJamDHJbRkjhNdIKcMqkhGO7SStT25PqLJ+sNdy1guA9ox5q74Obf7N/QKY4axMzOdoHtlEmdgmPuA9q25vNOcZS0YtlzH8YyTXHs0rj3alwzpkvfP61chvsQ7n38aba3+IfqP1JJk+awjCR1kD33FWQ1DlFoBJwyqUUM3XNPsqa5QfZ/ap6fm+S+JIeT3NbcyEPSOGy5ylUmtahR9Nx/Hvgy8D3N8w8AH6qqfUl+C7gW+NgIPkfSQk6Z1CkMFe5JNgJXAjcCv5AkwI8Df6dpcivwq0xRuO9Yc1dvmmMfm3OEQ3XOBCqSpKUbdljmN4D3At9unn8f8I2qeqF5fhTYsNgLk+xKMptkdm5ubsgyRmfbms+zOUf6tjtU5/RuvCBJK9DAPfckPw2cqKr7k1y61NdX1R5gD8DMzEwNWsc4HKpz2P78ryx3GZI0sGGGZd4EvCXJFcAr6Y25fxg4Pcnapve+EXhq+DIlSUsxcLhX1fXA9QBNz/2fVNXfTfI7wFXAPuAaYP8I6pQ0LKdMrirjmOf+S8C+JL8GPAh8fAyfoRFzjn3HucrkqjOScK+qu4G7m8ePAReN4n01HANb3+GUyVVn1Vyh6hRHSavJqgn3F6c49gvucUxxtActadJWTbiDUxwnyf/QpOXlqpCS1EGrqucuqYW2UybBaZMrmOEu6f9byi0hnTa5ok13uH/2Ovaddnerps6CkVpoO2USnDa5wk13uC+BC31p2nivVQ1jusP98t1s/wNnZUjSQs6WkaQOmu6eu6Tl5WJkK5bhLmkwLka2ohnu0pRbthOvLka2ojnmLkkdZLhLUgc5LCNp/DzxOnED99yTnJ3kc0kOJXkkyc8321+b5M4kf9Z8fc3oypU0dbZcBa/b0r/d8YNw8I7x17NKDNNzfwH4xap6IMmrgfuT3Am8A7irqnYnuQ64jt6t9yStRp54XRYD99yr6lhVPdA8/l/Al4ENwDbg1qbZrcBbhy1SkrQ0IzmhmmQT8CPAfcCZVXWs2XUcOPMUr9mVZDbJ7Nzc3CjKkCQ1hj6hmuSvAP8B+EdV9T+TfGdfVVWSWux1VbUH2AMwMzOzaBtJq4wnXkdmqHBP8pfoBfsnq+pTzeavJjmrqo4lOQs4MWyRklYBr3gdqYHDPb0u+seBL1fVB+ftOgBcA+xuvu4fqkJJq8PMTjbdcUbfZvtOez8XT6CcaTdMz/1NwN8DDib5YrPtl+mF+u1JrgWOAFcPV6KkaTfyG6a3HL65/vAb2Xtya992XVwTf+Bwr6o/BHKK3f3/NiVpAPtPXgL/5/Pw+NMv225zjrBtzdOtwr2LvEJVWiW6cmenvSe3tgrsfae9fwLVrFyuLSNJHWTPXdJfMPLx8WW0OUfa9eBnT3Ru9o3hLqmT9p+8BNb0b7c5R3pr2ow43Jd7GMxwl9RJSxmbv7iDF0855i5pVdt/8pJOrlppz13Sqrb35FZ+fecH+ze8+cr2yyMAO9a0m2M/LvbcJamNtuvSAxw/yLY1nx9vPX3Yc5ekNtquSw9w85VsfuKBdjN1Pvvf4PLdw9W2CHvukjRqW67iUJ2zrCXYc5ekltpfA3AG8CutWj5x+XimQtpzl6QOMtwlqYMMd0nqIMfcJa16XVpP50X23CWpg8YW7kkuS/JoksNJrhvX50iSXmos4Z5kDfBR4HJgM7AjyeZxfJYk6aXG1XO/CDhcVY9V1fPAPmDbmD5LkrTAuE6obgCenPf8KPA35jdIsgvY1Tz930keHfCz1gFfG/C108pjXh085lUgHxjqmE95GeyyzZapqj3AnmHfJ8lsVc2MoKSp4TGvDh7z6jCuYx7XsMxTwNnznm9stkmSJmBc4f7fgfOSnJvkNGA7cGBMnyVJWmAswzJV9UKSfwD8F3p3Mbypqh4Zx2cxgqGdKeQxrw4e8+owlmNOVY3jfSVJy8grVCWpgwx3SeqgqQn3fssZJHlFktua/fcl2TT5KkerxTH/QpJDSR5KcleS5b31ywi0XbYiyc8kqSRTP22uzTEnubr5Xj+S5N9PusZRa/Gz/fokn0vyYPPzfcVy1DkqSW5KciLJw6fYnyQfaf4+Hkpy4dAfWlUr/g+9k7J/DrwBOA34ErB5QZufA36rebwduG25657AMb8ZeFXz+F2r4Zibdq8G7gHuBWaWu+4JfJ/PAx4EXtM8P2O5657AMe8B3tU83gw8sdx1D3nMPwZcCDx8iv1XAJ8FAlwM3DfsZ05Lz73NcgbbgFubx3cAW5NkgjWOWt9jrqrPVdU3m6f30rueYJq1Xbbi/cAHgP87yeLGpM0x/33go1X1dYCqOjHhGketzTEX8D3N4+8F/scE6xu5qroHeOZlmmwDPlE99wKnJzlrmM+clnBfbDmDDadqU1UvAM8C3zeR6sajzTHPdy29//mnWd9jbn5dPbuqurIAd5vv8/nA+Un+KMm9SS6bWHXj0eaYfxV4W5KjwGeA90ymtGWz1H/vfXmzjg5I8jZgBvjby13LOCX5LuCDwDuWuZRJW0tvaOZSer+d3ZNkS1V9Y1mrGq8dwC1V9a+S/E3g3yW5oKq+vdyFTYtp6bm3Wc7gO22SrKX3q9zTE6luPFot4ZDkJ4D3AW+pqucmVNu49DvmVwMXAHcneYLe2OSBKT+p2ub7fBQ4UFXfqqrHgT+lF/bTqs0xXwvcDlBVfwy8kt6iYl018iVbpiXc2yxncAC4pnl8FfD71ZypmFJ9jznJjwD/hl6wT/s4LPQ55qp6tqrWVdWmqtpE7zzDW6pqdnnKHYk2P9u/S6/XTpJ19IZpHptkkSPW5pi/AmwFSPKD9MJ9bqJVTtYB4O3NrJmLgWer6thQ77jcZ5GXcLb5Cno9lj8H3tds+2f0/nFD75v/O8Bh4AvAG5a75gkc8+8BXwW+2Pw5sNw1j/uYF7S9mymfLdPy+xx6w1GHgIPA9uWueQLHvBn4I3ozab4I/ORy1zzk8e4FjgHfoveb2LXAO4F3zvsef7T5+zg4ip9rlx+QpA6almEZSdISGO6S1EGGuyR1kOEuSR1kuEtSBxnuktRBhrskddD/A6YkQ52WRCwNAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "def plot_model(xe, cdf): # helper function\n", " plt.plot(xe, np.append(np.diff(cdf), np.nan), drawstyle=\"steps-post\")\n", "\n", "plt.hist(x, bins=30, range=(0, 1));\n", "plot_model(xe, total(xe, *m.values[:]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The fit clearly looks bad. In fact, we only see the signal. The background has a huge amplitude, but also a huge lambda, making it effectively a delta peak at zero. That is not a plausible solution.\n", "\n", "We need better starting values. Let's mask out the signal and fit only the background. The cost function has a `mask` attribute for that." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
FCN = -1397 Ncalls = 159 (159 total)
EDM = 6.32e-07 (Goal: 0.0001) up = 0.5
Valid Min. Valid Param. Above EDM Reached call limit
True True False False
Hesse failed Has cov. Accurate Pos. def. Forced
False True True True False
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
Name Value Hesse Error Minos Error- Minos Error+ Limit- Limit+ Fixed
0 ns 0.00 0.01 yes
1 mu 1.00 0.01 yes
2 sigma 1.00 0.01 0 yes
3 nb 1.01e3 0.06e3
4 lambd 0.55 0.04 0
\n" ], "text/plain": [ "------------------------------------------------------------------\n", "| FCN = -1397 | Ncalls=159 (159 total) |\n", "| EDM = 6.32e-07 (Goal: 0.0001) | up = 0.5 |\n", "------------------------------------------------------------------\n", "| Valid Min. | Valid Param. | Above EDM | Reached call limit |\n", "------------------------------------------------------------------\n", "| True | True | False | False |\n", "------------------------------------------------------------------\n", "| Hesse failed | Has cov. | Accurate | Pos. def. | Forced |\n", "------------------------------------------------------------------\n", "| False | True | True | True | False |\n", "------------------------------------------------------------------\n", "-------------------------------------------------------------------------------------------\n", "| | Name | Value | Hesse Err | Minos Err- | Minos Err+ | Limit- | Limit+ | Fixed |\n", "-------------------------------------------------------------------------------------------\n", "| 0 | ns | 0.00 | 0.01 | | | | | yes |\n", "| 1 | mu | 1.00 | 0.01 | | | | | yes |\n", "| 2 | sigma | 1.00 | 0.01 | | | 0 | | yes |\n", "| 3 | nb | 1.01e3 | 0.06e3 | | | | | |\n", "| 4 | lambd | 0.55 | 0.04 | | | 0 | | |\n", "-------------------------------------------------------------------------------------------" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# signal window is roughly 0.3 to 0.7, let's mask that out\n", "cx = 0.5 * (xe[1:] + xe[:-1]) # compute bin centers\n", "\n", "cost.mask = (cx < 0.3) | (0.7 < cx)\n", "\n", "cost.verbose = 0 # turn verbosity off again, this fit should not cause trouble\n", "\n", "m = Minuit(cost, ns=1, mu=1, sigma=1, nb=1, lambd=1,\n", " limit_lambd=(0, None),\n", " limit_sigma=(0, None))\n", "\n", "# fix signal parameters for next fit and set signal amplitude to zero\n", "m.fixed[:3] = True\n", "m.values[\"ns\"] = 0\n", "\n", "m.migrad()" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.hist(x, bins=30, range=(0, 1));\n", "plot_model(xe, total(xe, *m.values[:]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Much better! We now unmask the signal, fix the background parameters and only fit the signal." ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
FCN = -4292 Ncalls = 227 (386 total)
EDM = 3.47e-06 (Goal: 0.0001) up = 0.5
Valid Min. Valid Param. Above EDM Reached call limit
True True False False
Hesse failed Has cov. Accurate Pos. def. Forced
False True True True False
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
Name Value Hesse Error Minos Error- Minos Error+ Limit- Limit+ Fixed
0 ns 510 27
1 mu 0.4990 0.0028
2 sigma 0.0467 0.0028 0
3 nb 1.01e3 0.06e3 yes
4 lambd 0.55 0.04 0 yes
\n" ], "text/plain": [ "------------------------------------------------------------------\n", "| FCN = -4292 | Ncalls=227 (386 total) |\n", "| EDM = 3.47e-06 (Goal: 0.0001) | up = 0.5 |\n", "------------------------------------------------------------------\n", "| Valid Min. | Valid Param. | Above EDM | Reached call limit |\n", "------------------------------------------------------------------\n", "| True | True | False | False |\n", "------------------------------------------------------------------\n", "| Hesse failed | Has cov. | Accurate | Pos. def. | Forced |\n", "------------------------------------------------------------------\n", "| False | True | True | True | False |\n", "------------------------------------------------------------------\n", "-------------------------------------------------------------------------------------------\n", "| | Name | Value | Hesse Err | Minos Err- | Minos Err+ | Limit- | Limit+ | Fixed |\n", "-------------------------------------------------------------------------------------------\n", "| 0 | ns | 510 | 27 | | | | | |\n", "| 1 | mu | 0.4990 | 0.0028 | | | | | |\n", "| 2 | sigma | 0.0467 | 0.0028 | | | 0 | | |\n", "| 3 | nb | 1.01e3 | 0.06e3 | | | | | yes |\n", "| 4 | lambd | 0.55 | 0.04 | | | 0 | | yes |\n", "-------------------------------------------------------------------------------------------" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cost.mask = None\n", "m.fixed[:] = False\n", "m.fixed[\"nb\"] = True\n", "m.fixed[\"lambd\"] = True\n", "m.values[\"ns\"] = 1\n", "m.migrad()" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.hist(x, bins=30, range=(0, 1));\n", "plot_model(xe, total(xe, *m.values[:]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This looks great! To wrap things up, we let Minuit optimize everything together to get the final values and uncertainties." ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
FCN = -4293 Ncalls = 97 (483 total)
EDM = 2.55e-06 (Goal: 0.0001) up = 0.5
Valid Min. Valid Param. Above EDM Reached call limit
True True False False
Hesse failed Has cov. Accurate Pos. def. Forced
False True True True False
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
Name Value Hesse Error Minos Error- Minos Error+ Limit- Limit+ Fixed
0 ns 501 29
1 mu 0.4991 0.0028
2 sigma 0.0458 0.0029 0
3 nb 1.05e3 0.05e3
4 lambd 0.56 0.04 0
\n" ], "text/plain": [ "------------------------------------------------------------------\n", "| FCN = -4293 | Ncalls=97 (483 total) |\n", "| EDM = 2.55e-06 (Goal: 0.0001) | up = 0.5 |\n", "------------------------------------------------------------------\n", "| Valid Min. | Valid Param. | Above EDM | Reached call limit |\n", "------------------------------------------------------------------\n", "| True | True | False | False |\n", "------------------------------------------------------------------\n", "| Hesse failed | Has cov. | Accurate | Pos. def. | Forced |\n", "------------------------------------------------------------------\n", "| False | True | True | True | False |\n", "------------------------------------------------------------------\n", "-------------------------------------------------------------------------------------------\n", "| | Name | Value | Hesse Err | Minos Err- | Minos Err+ | Limit- | Limit+ | Fixed |\n", "-------------------------------------------------------------------------------------------\n", "| 0 | ns | 501 | 29 | | | | | |\n", "| 1 | mu | 0.4991 | 0.0028 | | | | | |\n", "| 2 | sigma | 0.0458 | 0.0029 | | | 0 | | |\n", "| 3 | nb | 1.05e3 | 0.05e3 | | | | | |\n", "| 4 | lambd | 0.56 | 0.04 | | | 0 | | |\n", "-------------------------------------------------------------------------------------------" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "m.fixed[:] = False\n", "m.migrad()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The values changed a bit and the uncertaintes of the signal parameters became larger. That is expected unless the parameters are independent." ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.hist(x, bins=30, range=(0, 1));\n", "plot_model(xe, total(xe, *m.values[:]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "🎉🎉🎉" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Final note: set limits appropriately\n", "\n", "We could have gotten the good result right away by setting appropriate limits on all parameters." ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
FCN = -4293 Ncalls = 626 (626 total)
EDM = 3.46e-05 (Goal: 0.0001) up = 0.5
Valid Min. Valid Param. Above EDM Reached call limit
True True False False
Hesse failed Has cov. Accurate Pos. def. Forced
False True True True False
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
Name Value Hesse Error Minos Error- Minos Error+ Limit- Limit+ Fixed
0 ns 501 29 0
1 mu 0.4991 0.0028 0.4 0.6
2 sigma 0.0457 0.0029 0 0.2
3 nb 1.05e3 0.05e3 0
4 lambd 0.56 0.04 0 2
\n" ], "text/plain": [ "------------------------------------------------------------------\n", "| FCN = -4293 | Ncalls=626 (626 total) |\n", "| EDM = 3.46e-05 (Goal: 0.0001) | up = 0.5 |\n", "------------------------------------------------------------------\n", "| Valid Min. | Valid Param. | Above EDM | Reached call limit |\n", "------------------------------------------------------------------\n", "| True | True | False | False |\n", "------------------------------------------------------------------\n", "| Hesse failed | Has cov. | Accurate | Pos. def. | Forced |\n", "------------------------------------------------------------------\n", "| False | True | True | True | False |\n", "------------------------------------------------------------------\n", "-------------------------------------------------------------------------------------------\n", "| | Name | Value | Hesse Err | Minos Err- | Minos Err+ | Limit- | Limit+ | Fixed |\n", "-------------------------------------------------------------------------------------------\n", "| 0 | ns | 501 | 29 | | | 0 | | |\n", "| 1 | mu | 0.4991 | 0.0028 | | | 0.4 | 0.6 | |\n", "| 2 | sigma | 0.0457 | 0.0029 | | | 0 | 0.2 | |\n", "| 3 | nb | 1.05e3 | 0.05e3 | | | 0 | | |\n", "| 4 | lambd | 0.56 | 0.04 | | | 0 | 2 | |\n", "-------------------------------------------------------------------------------------------" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "m = Minuit(cost, ns=1, mu=1, sigma=1, nb=1, lambd=1,\n", " limit_ns=(0, None),\n", " limit_nb=(0, None), \n", " limit_mu=(0.4, 0.6),\n", " limit_lambd=(0, 2),\n", " limit_sigma=(0, 0.2))\n", "m.migrad()" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.hist(x, bins=30, range=(0, 1));\n", "plot_model(xe, total(xe, *m.values[:]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As you can see, the result is the same with and without limits within the precision that matters.\n", "\n", "Some sources (including the Minuit2 user guide) warn about setting limits carelessly. That advice is correct, but unless a parameter converges to a value very close to a limit boundary, the result with and without limits will be effectively the same. For the parameter value itself, this is a guaranteed proven property. Only the parameter uncertainty may be off." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Bonus: iminuit and resample" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "nfcn for original fit = 626\n", "nfcn for fit of b_sample[0] = 93\n", "nfcn for fit of b_sample[1] = 37\n", "nfcn for fit of b_sample[2] = 35\n", "nfcn for fit of b_sample[3] = 33\n", "nfcn for fit of b_sample[4] = 34\n", "nfcn for fit of b_sample[5] = 47\n", "nfcn for fit of b_sample[6] = 46\n", "nfcn for fit of b_sample[7] = 46\n", "nfcn for fit of b_sample[8] = 46\n", "nfcn for fit of b_sample[9] = 34\n", "nfcn for fit of b_sample[10] = 47\n", "nfcn for fit of b_sample[11] = 48\n", "nfcn for fit of b_sample[12] = 46\n", "nfcn for fit of b_sample[13] = 47\n", "nfcn for fit of b_sample[14] = 109\n", "nfcn for fit of b_sample[15] = 80\n", "nfcn for fit of b_sample[16] = 78\n", "nfcn for fit of b_sample[17] = 47\n", "nfcn for fit of b_sample[18] = 46\n", "nfcn for fit of b_sample[19] = 48\n", "nfcn for fit of b_sample[20] = 78\n", "nfcn for fit of b_sample[21] = 47\n", "nfcn for fit of b_sample[22] = 80\n", "nfcn for fit of b_sample[23] = 83\n", "nfcn for fit of b_sample[24] = 45\n", "nfcn for fit of b_sample[25] = 80\n", "nfcn for fit of b_sample[26] = 79\n", "nfcn for fit of b_sample[27] = 96\n", "nfcn for fit of b_sample[28] = 93\n", "nfcn for fit of b_sample[29] = 94\n", "nfcn for fit of b_sample[30] = 48\n", "nfcn for fit of b_sample[31] = 37\n", "nfcn for fit of b_sample[32] = 78\n", "nfcn for fit of b_sample[33] = 35\n", "nfcn for fit of b_sample[34] = 47\n", "nfcn for fit of b_sample[35] = 96\n", "nfcn for fit of b_sample[36] = 46\n", "nfcn for fit of b_sample[37] = 81\n", "nfcn for fit of b_sample[38] = 47\n", "nfcn for fit of b_sample[39] = 35\n", "nfcn for fit of b_sample[40] = 81\n", "nfcn for fit of b_sample[41] = 49\n", "nfcn for fit of b_sample[42] = 34\n", "nfcn for fit of b_sample[43] = 82\n", "nfcn for fit of b_sample[44] = 48\n", "nfcn for fit of b_sample[45] = 35\n", "nfcn for fit of b_sample[46] = 50\n", "nfcn for fit of b_sample[47] = 47\n", "nfcn for fit of b_sample[48] = 95\n", "nfcn for fit of b_sample[49] = 35\n" ] } ], "source": [ "from resample import bootstrap\n", "\n", "cost.n = np.histogram(x, bins=30, range=(0, 1))[0]\n", "m = Minuit(cost, ns=1, mu=1, sigma=1, nb=1, lambd=1,\n", " limit_ns=(0, None),\n", " limit_nb=(0, None), \n", " limit_mu=(0.4, 0.6),\n", " limit_lambd=(0, 2),\n", " limit_sigma=(0, 0.2))\n", "m.migrad()\n", "print(f\"nfcn for original fit = {m.fmin.nfcn}\")\n", "\n", "errors = m.errors[:]\n", "nfcn = m.fmin.nfcn\n", "\n", "rng = np.random.default_rng(1)\n", "b_value = []\n", "b_nfcn = []\n", "for i, b_sample in enumerate(bootstrap.resample(x, size=50,\n", " random_state=rng)):\n", " cost.n = np.histogram(b_sample, bins=30, range=(0, 1))[0]\n", " m.migrad()\n", " print(f\"nfcn for fit of b_sample[{i}] = {m.fmin.nfcn}\")\n", " assert m.valid\n", " b_value.append(m.values[:])\n", " b_nfcn.append(m.fmin.nfcn)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Migrad remembers previous fit result and converges quickly to nearby bootstrapped result." ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.axvline(nfcn, color=\"C0\", label=\"original\")\n", "plt.hist(b_nfcn, color=\"C1\", label=\"bootstrapped\")\n", "plt.xlabel(\"number of likelihood evaluations\")\n", "plt.legend();" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "b_cov = np.cov(np.transpose(b_value))\n", "b_errors = np.diag(b_cov) ** 0.5\n", "\n", "height = 0.35\n", "i = np.arange(5)\n", "plt.barh(i - height/2, errors, height, label=\"Minuit\")\n", "plt.barh(i + height/2, b_errors, height, label=\"bootstrap\")\n", "plt.semilogx()\n", "plt.yticks(i, m.parameters)\n", "plt.xlabel(\"uncertainty estimate\")\n", "plt.legend();" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Future plans\n", "\n", "* Replace Cython bindings with pybind11 bindings\n", " * Cython is lagging behind C++ features\n", " * iminuit requires lots of workarounds because of missing features in Cython\n", " * pybind11 is not a separate code generator, just C++\n", "* Support unicode parameters\n", "* Support pickling of Minuit object\n", "\n", "## PS: Check out more great iminuit tutorials\n", "\n", "https://nbviewer.jupyter.org/github/scikit-hep/iminuit/tree/master/tutorial/\n", "\n", "* How Hesse and Minos really work, which to use when, and is Minos really better? *The answer may surprise you.*\n", "* How to use the new cost functions\n", "* How to combine automatic differentation with JAX with iminuit\n", "* How to use numba to accelerate cost functions" ] } ], "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.8.3" } }, "nbformat": 4, "nbformat_minor": 4 }