diff --git a/examples/example_combined_fit.ipynb b/examples/example_combined_fit.ipynb index e658e7da..a492c674 100644 --- a/examples/example_combined_fit.ipynb +++ b/examples/example_combined_fit.ipynb @@ -45,7 +45,7 @@ { "cell_type": "code", "execution_count": 4, - "id": "modern-relay", + "id": "45f67973", "metadata": {}, "outputs": [ { @@ -55,14 +55,14 @@ "Fit with 3 parameters\n", "Method: migrad\n", "Optimization terminated successfully.\n", - "chisquare/d.o.f.: 0.3395164548834892\n", - "fit parameters [0.98791658 1.00784727 1.56875359]\n", - "chisquare/expected_chisquare: 0.339844373345418\n" + "chisquare/d.o.f.: 0.8085703524653507\n", + "fit parameters [0.97737577 1.01063624 1.47900852]\n", + "chisquare/expected_chisquare: 0.8121288230401409\n" ] } ], "source": [ - "output_test = pe.fits.least_squares(x_test,y_test,funcs_test,expected_chisquare=True)" + "output_test = pe.fits.least_squares(x_test,y_test,funcs_test,method='migrad',expected_chisquare=True)" ] }, { @@ -78,38 +78,12 @@ { "cell_type": "code", "execution_count": 6, - "id": "persistent-mathematics", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Goodness of fit:\n", - "χ²/d.o.f. = 0.339516\n", - "χ²/χ²exp = 0.339844\n", - "p-value = 0.9620\n", - "Fit parameters:\n", - "0\t 0.988(35)\n", - "1\t 1.008(32)\n", - "2\t 1.569(42)\n", - "\n" - ] - } - ], - "source": [ - "print(output_test)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, "id": "wooden-potential", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -129,246 +103,6 @@ "plt.legend()\n", "plt.show()" ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "3b82d1c6", - "metadata": {}, - "outputs": [], - "source": [ - "x_const = {'c':[0,1,2,3,4,5,6,7,8,9],'d':list(np.arange(10,20))}\n", - "y_const = {'c':[pe.Obs([np.random.normal(1, val, 1000)],['ensemble1']) \n", - " for val in [0.25,0.3,0.01,0.2,0.5,1.3,0.26,0.4,0.1,1.0]],\n", - " 'd':[pe.Obs([np.random.normal(1, val, 1000)],['ensemble1'])\n", - " for val in [0.5,1.12,0.26,0.25,0.3,0.01,0.2,1.0,0.38,0.1]]}\n", - "for key in y_const.keys():\n", - " [item.gamma_method() for item in y_const[key]]" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "7c1f7950", - "metadata": {}, - "outputs": [], - "source": [ - "#needs to be vectorized for expected chi2 to work (jacobian matrix incorrect dim. otherwise)\n", - "#@anp.vectorize\n", - "def func_const(a,x):\n", - " return a[0]#*anp.ones(len(x))\n", - "\n", - "funcs_const = {\"c\": func_const,\"d\": func_const}" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "82e0cdb6", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Fit with 1 parameter\n", - "Method: migrad\n", - "Optimization terminated successfully.\n", - "chisquare/d.o.f.: 1.444161495357013\n", - "fit parameters [0.9997047]\n" - ] - } - ], - "source": [ - "output_const = pe.fits.least_squares(x_const,y_const,funcs_const,method='migrad')" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "ab5c5bef", - "metadata": {}, - "outputs": [], - "source": [ - "output_const.gamma_method()" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "d6abfe4f", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - " chisquare: 27.439068411783246\n", - " chisquare_by_dof: 1.444161495357013\n", - " dof: 19\n", - " fit_function: {'c': , 'd': }\n", - " fit_parameters: [Obs[0.99970(22)]]\n", - " iterations: 15\n", - " message: 'Optimization terminated successfully.'\n", - " method: 'migrad'\n", - " p_value: 0.09483431965197764" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "output_const" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "50e3de50", - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Fit with 1 parameter\n", - "Method: migrad\n", - "Optimization terminated successfully.\n", - "chisquare/d.o.f.: 1.444161495357013\n", - "fit parameters [0.9997047]\n" - ] - } - ], - "source": [ - "output_const = pe.fits.least_squares(x_const,y_const,funcs_const,method='migrad')" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "efd3d4d0", - "metadata": {}, - "outputs": [], - "source": [ - "y_const_ls = []\n", - "for key in y_const:\n", - " for item in y_const[key]:\n", - " y_const_ls.append(item)" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "57d65824", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[Obs[1.0101(80)], Obs[0.9908(97)], Obs[0.99919(32)], Obs[0.9962(64)], Obs[0.965(17)], Obs[1.004(42)], Obs[1.0094(82)], Obs[1.004(13)], Obs[0.9974(31)], Obs[0.954(34)], Obs[1.004(16)], Obs[1.058(37)], Obs[0.9893(84)], Obs[0.9895(85)], Obs[0.9914(96)], Obs[1.00028(33)], Obs[1.0005(62)], Obs[0.957(32)], Obs[0.988(13)], Obs[1.0040(32)]]\n" - ] - } - ], - "source": [ - "print(y_const_ls)" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "731552bc", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Fit with 1 parameter\n", - "Method: Levenberg-Marquardt\n", - "`ftol` termination condition is satisfied.\n", - "chisquare/d.o.f.: 1.4441614953561615\n" - ] - } - ], - "source": [ - "output_const2 = pe.fits.least_squares(list(np.arange(0,20)),y_const_ls, func_const)" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "019583b5", - "metadata": {}, - "outputs": [], - "source": [ - "output_const2.gamma_method()" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "f28a3478", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - " chisquare: 27.439068411767067\n", - " chisquare_by_dof: 1.4441614953561615\n", - " dof: 19\n", - " fit_function: \n", - " fit_parameters: [Obs[0.99970(22)]]\n", - " iterations: 7\n", - " message: '`ftol` termination condition is satisfied.'\n", - " method: 'Levenberg-Marquardt'\n", - " p_value: 0.0948343196523247" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "output_const2" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "466cd303", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYAAAAD5CAYAAAAuneICAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAnYklEQVR4nO3de3wU9b3/8deHmwliRAxqAFtoD20xCAEj2FYNRY9FT4vCzwsXFbSWg1bb09b+1HKElUqPPcfWWqVRRERaK96i0pYebYtEqUoJNqKAF4ygoREoKl64iOVz/pgJLrluspvdTeb9fDzmkZ3vd76zn53d7Gdnvt+ZMXdHRESip1OmAxARkcxQAhARiSglABGRiFICEBGJKCUAEZGIUgIQEYmoLs0tYGYLgK8BW919cAP1XwDuAoYDM9z9xri6McDNQGdgvrvfEJYPABYDhwOrgQvc/aPmYsnPz/f+/fsn8LJERKTW6tWr/+HuveuWW3PnAZjZycAHwKJGEsARwKeBs4B3ahOAmXUGXgH+FagGVgET3X2dmd0PlLn7YjO7DXje3UubexHFxcVeUVHR3GIiIhLHzFa7e3Hd8mYPAbn7k8DbTdRvdfdVwN46VSOADe5eFf66XwycaWYGjAYeDJe7myB5iIhIGrVlH0Bf4M24+eqw7HDgXXf/uE65iIikUdZ3ApvZNDOrMLOKbdu2ZTocEZEOo9lO4CRsBo6Om+8Xlm0HeppZl3AvoLa8Qe4+D5gHQR9A24UrIq21d+9eqqur2b17d6ZDibScnBz69etH165dE1q+LRPAKmBgOOJnMzABmOTubmZPAGcT9AtMAR5twzhEpI1VV1dzyCGH0L9/f4JuPkk3d2f79u1UV1czYMCAhNokMgz0XmAUkG9m1cAsoGv4hLeZ2VFABZAH7DOz/wCOcff3zOxy4DGCYaAL3H1tuNqrgMVmdj3wN+DOxF+miGSb3bt368s/w8yMww8/nJYcKm82Abj7xGbq3yI4jNNQ3VJgaQPlVQSjhESkg9CXf+a19D3I+k5gERFpG0oAIlkqFothZvWmWCyW6dAio0ePHg2Wz5w5kz/96U8peY5Ro0bR0AmuTz31FIWFhRQVFbF582bOPvtsACorK1m6tN6BlVZRAhDJUrFYDHenpKSEkpIS3B13VwLIArNnz+bUU09t0+e45557uOaaa6isrKRv3748+GBw7qwSgIhIHYsWLWLIkCEMHTqUCy64AICNGzcyevRohgwZwimnnMIbb7wBwNSpU7n00ks54YQT+MxnPsPy5cu5+OKLGTRoEFOnTj1gvd/97ncpLCzklFNO2d/BOnXq1P1fyP3792fWrFkMHz6cY489lpdeegmADz/8kIsvvpgRI0YwbNgwHn00GOy4a9cuJkyYwKBBgxg3bhy7du2q91rmz5/P/fffz7XXXsvkyZPZuHEjgwcP5qOPPmLmzJncd999FBUVcd999yW1zdpyGKiIRNDzW3ewY/fHzS/YAofmdGHoEYc2Wr927Vquv/56nn76afLz83n77eDqNVdccQVTpkxhypQpLFiwgG9/+9s88sgjALzzzjs888wzLFmyhLFjx/KXv/yF+fPnc/zxx1NZWUlRUREffvghxcXF3HTTTcyePZvrrruOW2+9td7z5+fn89xzz/HLX/6SG2+8kfnz5zNnzhxGjx7NggULePfddxkxYgSnnnoqt99+O927d2f9+vWsWbOG4cOH11vfJZdcwooVK/ja177G2WefzcaNGwHo1q0bs2fPpqKiosE4Wkp7ACLS7i1btoxzzjmH/Px8AHr16gXAM888w6RJkwC44IILWLFixf42X//61zEzjj32WI488kiOPfZYOnXqRGFh4f4v3E6dOnHeeecBcP755x/QPt748eMBOO644/a3ffzxx7nhhhsoKipi1KhR7N69mzfeeIMnn3yS888/H4AhQ4YwZMiQ1G6MFtAegIikVFO/1LPJQQcdBARf8rWPa+c//rjhPZjGhlnWtu/cufP+tu7OQw89xOc///lUhp1S2gMQkXZv9OjRPPDAA2zfvh1g/yGgL33pSyxevBgIOlVPOumkFq133759+4/1/+Y3v+HEE09MuO1Xv/pVbrnlFmovuf+3v/0NgJNPPpnf/OY3ALz44ousWbOmRTEdcsghvP/++y1q0xglABFp9woLC5kxYwYlJSUMHTqU733vewDccsst3HXXXQwZMoRf/epX3HzzzS1a78EHH8xf//pXBg8ezLJly5g5c2bCba+99lr27t3LkCFDKCws5NprrwXg0ksv5YMPPmDQoEHMnDmT4447rkUxfeUrX2HdunUp6QRu9oYw2UQ3hJEoGjVqFADLly/PaBxNWb9+PYMGDcp0GELD70WrbwgjIiIdkxKAiEhE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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "colour= {'c':'red','d':'black'}\n", - "plt.figure()\n", - "for key in funcs_const.keys():\n", - " plt.errorbar(x_const[key],[o.value for o in y_const[key]],ls='none',marker='*',\n", - " color=colour[key],yerr=[o.dvalue for o in y_const[key]],capsize=3,label=key)\n", - "plt.plot(np.arange(0,20),[func_const(output_const.fit_parameters,x_val) for x_val in list(np.arange(0,20))],\n", - " label='combined fit',color ='lightblue')\n", - "plt.plot(np.arange(0,20),[func_const(output_const2.fit_parameters,x_val) for x_val in list(np.arange(0,20))],\n", - " label='one fit',color='black',ls='--')\n", - "plt.legend()\n", - "plt.show()" - ] } ], "metadata": { @@ -388,6 +122,11 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.3" + }, + "vscode": { + "interpreter": { + "hash": "31f2aee4e71d21fbe5cf8b01ff0e069b9275f58929596ceb00d14d90e3e16cd6" + } } }, "nbformat": 4, diff --git a/pyerrors/fits.py b/pyerrors/fits.py index f5f0850e..a82a947c 100644 --- a/pyerrors/fits.py +++ b/pyerrors/fits.py @@ -140,7 +140,9 @@ def least_squares(x, y, func, priors=None, silent=False, **kwargs): can be used to choose an alternative method for the minimization of chisquare. The possible methods are the ones which can be used for scipy.optimize.minimize and migrad of iminuit. If no method is specified, Levenberg-Marquard is used. - Reliable alternatives are migrad (default for combined fit), Powell and Nelder-Mead. + Reliable alternatives are migrad, Powell and Nelder-Mead. + tol: float, optional + can only be used for combined fits and methods other than Levenberg-Marquard correlated_fit : bool If True, use the full inverse covariance matrix in the definition of the chisquare cost function. For details about how the covariance matrix is estimated see `pyerrors.obs.covariance`. @@ -706,6 +708,9 @@ def _combined_fit(x, y, func, silent=False, **kwargs): x_all = np.concatenate([np.array(o) for o in x.values()]) y_all = np.concatenate([np.array(o) for o in y.values()]) + y_f = [o.value for o in y_all] + dy_f = [o.dvalue for o in y_all] + if len(x_all.shape) > 2: raise Exception('Unknown format for x values') @@ -740,10 +745,6 @@ def _combined_fit(x, y, func, silent=False, **kwargs): else: x0 = [0.1] * n_parms - output.method = kwargs.get('method', 'migrad') - if not silent: - print('Method:', output.method) - def chisqfunc(p): chisq = 0.0 for key in func.keys(): @@ -756,27 +757,46 @@ def _combined_fit(x, y, func, silent=False, **kwargs): chisq += anp.sum((y_f - model) @ C_inv @ (y_f - model)) return chisq - if output.method == 'migrad': - tolerance = 1e-4 - if 'tol' in kwargs: - tolerance = kwargs.get('tol') - fit_result = iminuit.minimize(chisqfunc, x0, tol=tolerance) # Stopping criterion 0.002 * tol * errordef - output.iterations = fit_result.nfev - else: - tolerance = 1e-12 - if 'tol' in kwargs: - tolerance = kwargs.get('tol') - fit_result = scipy.optimize.minimize(chisqfunc, x0, method=kwargs.get('method'), tol=tolerance) - output.iterations = fit_result.nit + output.method = kwargs.get('method', 'Levenberg-Marquardt') + if not silent: + print('Method:', output.method) + + if output.method != 'Levenberg-Marquardt': + if output.method == 'migrad': + tolerance = 1e-4 + if 'tol' in kwargs: + tolerance = kwargs.get('tol') + fit_result = iminuit.minimize(chisqfunc, x0, tol=tolerance) # Stopping criterion 0.002 * tol * errordef + output.iterations = fit_result.nfev + else: + tolerance = 1e-12 + if 'tol' in kwargs: + tolerance = kwargs.get('tol') + fit_result = scipy.optimize.minimize(chisqfunc, x0, method=kwargs.get('method'), tol=tolerance) + output.iterations = fit_result.nit + + chisquare = fit_result.fun + + else: + def chisqfunc_residuals(p): + model = np.concatenate([np.array(func[key](p, np.asarray(x[key]))) for key in func.keys()]) + chisq = ((y_f - model) / dy_f) + return chisq + if 'tol' in kwargs: + print('tol cannot be set for Levenberg-Marquardt') + fit_result = scipy.optimize.least_squares(chisqfunc_residuals, x0, method='lm', ftol=1e-15, gtol=1e-15, xtol=1e-15) + + chisquare = np.sum(fit_result.fun ** 2) + assert np.isclose(chisquare, chisqfunc(fit_result.x), atol=1e-14) + output.iterations = fit_result.nfev - chisquare = fit_result.fun output.message = fit_result.message if not fit_result.success: raise Exception('The minimization procedure did not converge.') if x_all.shape[-1] - n_parms > 0: - output.chisquare = chisqfunc(fit_result.x) + output.chisquare = chisquare output.dof = x_all.shape[-1] - n_parms output.chisquare_by_dof = output.chisquare / output.dof output.p_value = 1 - scipy.stats.chi2.cdf(output.chisquare, output.dof) @@ -815,8 +835,6 @@ def _combined_fit(x, y, func, silent=False, **kwargs): return hat_vector fitp = fit_result.x - y_f = [o.value for o in y_all] - dy_f = [o.dvalue for o in y_all] if np.any(np.asarray(dy_f) <= 0.0): raise Exception('No y errors available, run the gamma method first.') @@ -842,7 +860,7 @@ def _combined_fit(x, y, func, silent=False, **kwargs): A = W @ hat_vector # hat_vector = 'jacobian(func)(fit_result.x, x)' P_phi = A @ np.linalg.pinv(A.T @ A) @ A.T expected_chisquare = np.trace((np.identity(x_all.shape[-1]) - P_phi) @ W @ cov @ W) - output.chisquare_by_expected_chisquare = chisquare / expected_chisquare + output.chisquare_by_expected_chisquare = output.chisquare / expected_chisquare if not silent: print('chisquare/expected_chisquare:', output.chisquare_by_expected_chisquare) diff --git a/tests/fits_test.py b/tests/fits_test.py index 9cf7b23a..8bcca5f4 100644 --- a/tests/fits_test.py +++ b/tests/fits_test.py @@ -625,6 +625,32 @@ def test_combined_fit_list_v_array(): assert (res[0][1] - res[1][1]).is_zero(atol=1e-8) +def test_combined_fit_vs_standard_fit(): + + x_const = {'a':[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 'b':np.arange(10, 20)} + y_const = {'a':[pe.Obs([np.random.normal(1, val, 1000)], ['ensemble1']) + for val in [0.25, 0.3, 0.01, 0.2, 0.5, 1.3, 0.26, 0.4, 0.1, 1.0]], + 'b':[pe.Obs([np.random.normal(1, val, 1000)], ['ensemble1']) + for val in [0.5, 1.12, 0.26, 0.25, 0.3, 0.01, 0.2, 1.0, 0.38, 0.1]]} + for key in y_const.keys(): + [item.gamma_method() for item in y_const[key]] + y_const_ls = np.concatenate([np.array(o) for o in y_const.values()]) + x_const_ls = np.arange(0, 20) + + def func_const(a,x): + return 0 * x + a[0] + + funcs_const = {"a": func_const,"b": func_const} + for method_kw in ['Levenberg-Marquardt', 'migrad', 'Powell', 'Nelder-Mead']: + res = [] + res.append(pe.fits.least_squares(x_const, y_const, funcs_const, method = method_kw, expected_chisquare=True)) + res.append(pe.fits.least_squares(x_const_ls, y_const_ls, func_const, method = method_kw, expected_chisquare=True)) + [item.gamma_method for item in res] + assert np.isclose(0.0, (res[0].chisquare_by_dof - res[1].chisquare_by_dof), 1e-14, 1e-8) + assert np.isclose(0.0, (res[0].chisquare_by_expected_chisquare - res[1].chisquare_by_expected_chisquare), 1e-14, 1e-8) + assert np.isclose(0.0, (res[0].p_value - res[1].p_value), 1e-14, 1e-8) + assert (res[0][0] - res[1][0]).is_zero(atol=1e-8) + def fit_general(x, y, func, silent=False, **kwargs): """Performs a non-linear fit to y = func(x) and returns a list of Obs corresponding to the fit parameters.