{ "cells": [ { "cell_type": "markdown", "metadata": { "toc": "true" }, "source": [ "# Table of Contents\n", "

1  非線形最小2乗法の原理
2  python code
3  具体的な手順
4  pythonによる解法の指針
5  Gauss-Newton法に関するメモ
6  課題
6.1  Gaussian(正規分布)へのフィット
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "
\n", "非線形最小2乗法(NonLinearFit)\n", "
\n", "
\n", "
\n", "file:/Users/bob/Github/TeamNishitani/jupyter_num_calc/nonlinearfit\n", "
\n", "https://github.com/daddygongon/jupyter_num_calc/tree/master/notebooks_python\n", "
\n", "cc by Shigeto R. Nishitani 2017-8 \n", "
\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 非線形最小2乗法の原理\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "前章では,データに近似的にフィットする最小二乗法を紹介した.ここでは,フィット式が多項式のような線形関係にない関数の最小二乗法を紹介する.図のようなデータにフィットする場合を考えよう.\n", "\n", "![C9_NonLinearFitplot2d1.png](figs/C9_NonLinearFitplot2d1.png)\n", "\n", "このデータにあてはめるのはローレンツ関数,\n", "\n", "$$\n", "F \\left(x;\\mathbf{a} \\right)=a _{1}+ \\frac{a _{2}}{a _{3}+\\left(x -a _{4}\\right)^{2}}\n", "$$\n", "である.この関数の特徴は,今まで見てきた関数と違いパラメータが線形関係になっていない.誤差関数は,いままでと同様に\n", "\n", "$$\n", "\\chi ^{2}\\left(\\mathbf{a} \\right)={\\sum_i^N }d _{i }^{2}=\\sum_i^N \\left(F \\left(x _{i };\\mathbf{a} \\right)-y _{i }\\right)^{2}\n", "$$\n", "で,$\\mathbf{a}=\\{a_0, a_1,..\\}$をパラメータとして変えた時に最小となる値を求める点もかわらない.しかし,線形の最小二乗法のように微分しても一元の方程式にならず,連立方程式を単に解くだけでは求まらない.\n", "\n", "そこで図のような2次関数の最小値を求める場合を考える.最小値の点$a_0$のまわりで,Taylor展開すると,$\\mathbf{d,D}$をそれぞれの係数とすると,\n", "\n", "$$\n", "\\chi^2 \\left( \\mathbf{a} \\right)= \\chi^2 \\left( \\mathbf{a_0} \\right) - \\mathbf{d} \\left(\\mathbf{a}-\\mathbf{a_0} \\right) +\\frac{1}{2} \\mathbf{D} \\left(\\mathbf{a}-\\mathbf{a_0} \\right)^{2}\n", "$$\n", "である.最小の点$a_0$は,微分が$0$になるので,\n", "\n", "$$\n", "\\mathbf{a _{0}}=\\mathbf{a} + \\mathbf{D} ^{-1} \\times (-\\mathbf{d})\n", "$$\n", "と予測される.図を参照して上の式を導け.またその意味を考察せよ.\n", "\n", "![non_linear_fit_graph](figs/non_linear_fit_graph.png)\n", "\n", "現実には高次項の影響で計算通りにはいかず,単に最小値の近似値を求めるだけである.これは,$ \\chi \\left(\\mathbf{a} \\right) ^{2}$の微分関数の解をNewton法で求める操作に対応する.つまり,この操作を何度も繰り返せばいずれ解がある精度で求まるはず.\n", "\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# python code\n", "\n", "幾つもの関数が用意されている.\n", "* curve_fit\n", "* curve_fit with bounds\n", "* least square fit\n", "\n", "全部を理解する必要はないが,manualを見ながら使うことができるといいね.\n", "boundsとかparamsの初期値が重要." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 1.04022586 9.67489309 0.96979944 4.00792049]\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from scipy.optimize import curve_fit\n", "\n", "def func(t, a1, a2, a3, a4):\n", " return a1+a2/(a3+(t-a4)**2)\n", "\n", "xdata = np.linspace(0, 10, 100)\n", "y = func(xdata, 1, 10, 1, 4)\n", "y_noise = 0.2 * np.random.normal(size=xdata.size)\n", "ydata = y + y_noise\n", "plt.plot(xdata, ydata, 'b-', label='data')\n", "\n", "popt, pcov = curve_fit(func, xdata, ydata)\n", "print(popt)\n", "plt.plot(xdata, func(xdata, *popt), 'r-', label='fit')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 7.92623836 42.57537952 400. 89.17411616 127.86538647]\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from scipy.optimize import curve_fit\n", "\n", "def func(t, a1, a2, a3, a4, a5):\n", " return a1+a2*1000/(a3+(t-a4)**2)+a2*1000/(a3+(t-a5)**2)\n", "\n", "xdata = np.linspace(0, 256, 256)\n", "y = func(xdata, 10, 40, 380, 90, 128)\n", "y_noise = 10 * np.random.normal(size=xdata.size)\n", "ydata = y + y_noise\n", "plt.plot(xdata, ydata, 'b-', label='data')\n", "\n", "popt, pcov = curve_fit(func, xdata, ydata, bounds=(0, [15,50,400,100,150]))\n", "plt.plot(xdata, func(xdata, *popt), 'r-', label='fit')\n", "\n", "print(popt)\n", "plt.show()\n", "\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 7.16505033 44.91568512 427.72186145 89.189773 127.90437592]\n" ] } ], "source": [ "import scipy.optimize\n", "from numpy import *\n", "\n", "params0=[15,50,400,100,150]\n", "\n", "def fit_func(params,t,y):\n", " a1,a2,a3,a4,a5=params\n", " residual=y-(a1+a2*1000/(a3+(t-a4)**2)+a2*1000/(a3+(t-a5)**2))\n", " return residual\n", "\n", "params, cov=scipy.optimize.leastsq(fit_func,params0,args=(xdata, ydata))\n", "print(params)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "?curve_fit" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 具体的な手順\n", "\n", "パラメータの初期値を\n", "\n", "$$\n", "\\boldsymbol{a}_0 + \\Delta \\boldsymbol{a} = \\left\\{a_{{0}}+\\Delta\\,a,\\,b_{{0}}+\\Delta\\,b,\\,c_{{0}}+\\Delta\\,c,\\,d_{{0}}+\\Delta\\,d\\right\\}\n", "$$\n", "とする.このとき関数$f$を真値$a_0, b_0, c_0, d_0$のまわりでテイラー展開し,高次項を無視すると\n", "\n", "$$\n", "\\Delta\\,f=f \\left( a_{{0}}+\\Delta\\,a_{{1}},b_{{0}}+\\Delta\\,b_{{1}},c_{{0}}+\\Delta\\,c_{{1}},d_{{0}}+\\Delta\\,d_{{1}} \\right) -f \\left( a_{{0}},b_{{0}},c_{{0}},d_{{0}} \\right)\n", "$$\n", "\n", "\n", "$$\n", "=\\left(\\frac{\\partial }{\\partial a }f \\right)_{0}\\Delta a _{1}+\\left(\\frac{\\partial }{\\partial b }f \\right)_{0}\\Delta b _{1}+\\left(\\frac{\\partial }{\\partial c }f \\right)_{0}\\Delta c _{1}+\\left(\\frac{\\partial }{\\partial d }f \\right)_{0}\\Delta d _{1}\n", "$$\n", "となる.\n", "\n", "課題でつくったデータはt = 1からt = 256までの時刻に対応したデータ点$f_{1},\\,f_{2},\\,\\cdots f_{256}$とする.各測定値とモデル関数から予想される値との差$\\Delta f_1,\\Delta f_2,\\cdots,\\Delta f_{256}$は,\n", "$$\n", "\\left(\\begin{array}{c}\\Delta f _{1} \\\\\\Delta f _{2} \\\\ \\vdots \\\\\\Delta f _{256} \\\\\\end{array}\\right)=J \\left(\\begin{array}{c}\\Delta a _{1} \\\\\\Delta b _{1} \\\\\\Delta c _{1} \\\\\\Delta d _{1} \\\\\\end{array}\\right)\n", "$$\n", "となる.ここで$J$はヤコビ行列と呼ばれる行列で,4列256行\n", "$$\n", "J =\\left(\\begin{array}{cccc}\\left(\\frac{\\partial }{\\partial a }f \\right)_{1} & \\left(\\frac{\\partial }{\\partial b }f \\right)_{1} & \\left(\\frac{\\partial }{\\partial c }f \\right)_{1} & \\left(\\frac{\\partial }{\\partial d }f \\right)_{1} \\\\ \\vdots & \\vdots & \\vdots & \\vdots \\\\\\left(\\frac{\\partial }{\\partial a }f \\right)_{256} & \\left(\\frac{\\partial }{\\partial b }f \\right)_{256} & \\left(\\frac{\\partial }{\\partial c }f \\right)_{256} & \\left(\\frac{\\partial }{\\partial d }f \\right)_{256} \\\\\\end{array}\\right)\n", "$$\n", "である.このような矩形行列の逆行列は転置行列$J^T$を用いて,`\n", "$$\n", "J ^{-1}=\\left(J ^{T }J \\right)^{-1}J ^{T }\n", "$$\n", "と表わされる.したがって,真値からのずれは\n", "$$\n", "\\left(\\begin{array}{c}\\Delta a_2 \\\\\\Delta b_2 \\\\\\Delta c_2 \\\\\\Delta d_2 \\\\\\end{array}\\right)\n", "=\\left(J ^{T }J \\right)^{-1}J ^{T }\n", "\\left(\\begin{array}{c}\\Delta f _{1} \\\\\\Delta f _{2} \\\\ \\vdots \\\\\\Delta f _{256} \\\\\\end{array}\\right)\n", "$$\n", "で求められる.理想的には$(\\Delta a_2,\\,\\Delta b_2,\\,\\Delta c_2,\\,\\Delta d_2)$は$(\\Delta a,\\,\\Delta b,\\,\\Delta c,\\,\\Delta d)$に一致するはずだが,測定誤差と高次項のために一致しない.初期値に比べ,より真値に近づくだけ.そこで,新たに得られたパラメータの組を新たな初期値に用いて,より良いパラメータに近付けていくという操作を繰り返す.新たに得られたパラメータと前のパラメータとの差がある誤差以下になったところで計算を打ち切り,フィッティングの終了となる.\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# pythonによる解法の指針\n", "\n", "まずは,お任せでcurve_fitを試しましょう." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "image/png": "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dqZeUAD//KeNq3fpYrO3Xn65hsF+771wzDHQv7+dJUkgFOgVmDLFLjk7doTXXoPf/97OXP75T1uUIZLsGjSAG26wfkT5+bBsGfToAUceaSc31WrFW7u2nZ3Xqwdnnw3r1wdedypSoO+B93Zp2bWrXWp+9JFdepZegga+L6NIAqhTx1Y/lw4xfv+93Tht187atRQXV/EFDzjAtq/74gu44gotOgqAAn0n3tulZOfOdmk5d+6uN4kaNQq7QpHw1apls7hKJwGkpUHfvtC6td3v3LKlCi/WpQvceaedrT/wQMxqThUKdOySceJEu4Ts0cOmIj70kF1i3nijXXKKyK7S0+GCC6zH/3PP2T7RAwbY+ov//Ac2bqzkC/3ud9Crly2rfv/9mNac7FI60IuL7VKxXTvrHbR+vV1KLlgAeXl2iSki5UtLszz++GOYNMnWZFx7LeTk2Ir/CofHnbNl1dnZNj/922/jUHVySslA37LFLg3btLFLxbQ0a6Y1f75dStauHXaFIonHOTj1VHjvPduoqH17+L//s1lgt99uK1HLtM8+dod1zRo77a/ygLxAigX6xo3w4INw0EF2adioka2K++wzmxqrvisiwTjhBJsVNnWq9ea67TYL9ltugcLCMr6pfXvbeeOdd2w6mVRZSgT6+vW2LD8nx9YztGxpl4affAK9e9sZuogEr1MneP55O2k6/XT4xz9sZOX66236409cfDFceaX9wE6cGO9yE15SR9nq1Xapl51t913at7c3//fes0tD58KuUCQ1tG9vMxTnzbNh8gcftLYZgwbZAr1d3H+/bTJ96aU2pVEqLSkDvajIrthatrRLvc6d7dLvtdfsUlBEwtG6NYwebRMP+ve3zw85xNpp/LhgdK+9bHeY2rVttsKGDSFWnFiSKtCXLbNucS1bwl13wWmn2ZL955+P0Z6JIlItOTkwZIidnV97reV327Z29j5zJtCihc1UmDPHuuBp0VGlJEWgL1pkw26tWtn81/POs0VB48dr+zeRKNt/f7jvPluFfcstdm+rY0c480z4qOEp8Je/WLDn54ddakJwPo7vfLm5uX7atGmBvd78+bbbyrhxNkOlf38bK8/JCewQIhJHq1fb+Pr999vuX926bOfJDWfSZMbruHffhaOPDrvEUDjnpnvvcyt6XrXP0J1zP3fOTXbOzXXOzXHOXVfd16qqzz6zTU8OPRSeftpmrixcaJdwCnORxNW4Mdx6q52x33MPzJ6TxsFTx7I8bX82nnkuvrAo7BIjrSZDLsXAjd77Q4Gjgaucc4cGU9aeTZ0KPXtChw7wyiu25VtBAfzrX3bpJiLJoUEDuOkmG07964NNuKLRM7iVRXx8UB+enbCteh0eU0C1A917v9x7P6Pk8/XAPCAmsfr++3DKKXa19cEHNhVx8WLr6dO0aSwENPedAAAHG0lEQVSOKCJRULcuXHUVPLfkCD6+NJ+j1r/J3HP/RPv2NjTz8cewaVPYVUZHRhAv4pzLBjoCU/fwtYHAQIAWLVpU6/UnTrR9Ou++225+7r139WsVkcRTuzacMKo/292H/GHUnSxfdxTXXNMTsPtnbdtac73Sj8MPtzeDVFPjm6LOuQbAO8Ad3vtyl3ZV96bo2rX2D5qK/0AispNNm+C44/BffcU3/53O1JUHMn06P36sXGlPS0+3e2y7h3y9euGWX12VvSlao0B3ztUCXgRe9d7fV9Hzg57lIiIpaNEiS+i1a22TjJwcyM7Gt8xm1T45zPkhm6krcnh7wf58MiOdopL7qGlpew75+vXD/eNURswD3TnngDHAKu/99ZX5HgW6iARi1ixbjbRokc2MKCiwlYU751lGBv7nP2dz8xxW1Mnmy+JsPl2Tw7tLspm+OoflNMOlpdGmza4h36FD9PZAiEegdwbeA2YDpfecf++9f7ms71Ggi0jMbN4MX3+9a8iXfr5o0U/6rG/LqM2ahi1YnJbD3A3ZzNmYQwHZLCabjINzaNlpP47MdRx5pC12CjPk4zLkUlUKdBEJzcaNsGRJ2YFftOsc943UYTEtWUQOi8lmQ1Y2tVvnsO+R2WSfnMNhJ2XScJ/4dPhToIuIVMWGDTYfeqfA3zRvEZv+V0DtZYuot3HVrk+nHt/UzmZ9Zg4uO5uG7bNpdmwO9Q7NtnH9xo0Da+la2UAPZNqiiEjCq1/f7poeumN9ZJ2SDwDWrYPFi1nz6SKWfVjA+tkFsGgRDYoKOOCb92n04VoYuuPlNu+1N1v3z2av1jnUOjjbmoy1bRvTP4ICXUSkMho2hHbtaNSuHY367fqlwkJ44901FLxdwHfTFrH5fwU0WrOI7IUFZC9cRKtJb7Eg+yw6xjbPFegiIjXVtCl0O6cRnNMB6ADYnPjp0+GlGTB9muevp8R+eFuBLiISA5mZtjPaqacCuJKP2EqKfugiIqJAFxFJGgp0EZEkoUAXEUkSCnQRkSShQBcRSRIKdBGRJKFAFxFJEnFtzuWcKwIWV/PbM4GVAZYTa4lUbyLVColVbyLVColVbyLVCjWrt6X3PquiJ8U10GvCOTetMt3GoiKR6k2kWiGx6k2kWiGx6k2kWiE+9WrIRUQkSSjQRUSSRCIF+vCwC6iiRKo3kWqFxKo3kWqFxKo3kWqFONSbMGPoIiJSvkQ6QxcRkXJEPtCdcyOdc4XOuc/DrqUizrmfO+cmO+fmOufmOOeuC7um8jjn6jjnPnbOfVZS71/Crqkizrl059ynzrkXw66lIs65AufcbOfcTOdcpDfTdc41cs5NcM7Nd87Nc84dE3ZNZXHOtS75Oy39WOecuz7susrinPtNyc/X5865J5xzdSr+rmoeK+pDLs65E4DvgUe994eFXU95nHPNgGbe+xnOub2B6UBv7/3ckEvbI+ecA+p77793ztUC3geu895/FHJpZXLO3QDkAg2992eEXU95nHMFQK73PvJzpZ1zY4D3vPcPO+dqA/W892vCrqsizrl0YBlwlPe+umtcYsY5tz/2c3Wo936jc+4p4GXv/ehYHC/yZ+je+3eBVRU+MQK898u99zNKPl8PzAP2D7eqsnnzfclva5V8RPYd3jl3ANADeDjsWpKJc24f4ATgEQDv/ZZECPMSXYGvohjmO8kA6jrnMoB6wDexOlDkAz1ROeeygY7A1HArKV/JEMZMoBB43Xsf5XrvB34HbA+7kErywBvOuenOuYFhF1OOHKAIGFUynPWwc65+2EVV0gXAE2EXURbv/TLgXmAJsBxY671/LVbHU6DHgHOuAfAMcL33fl3Y9ZTHe7/Ne98BOADo5JyL5LCWc+4MoNB7Pz3sWqqgc8nf7WnAVSXDh1GUARwBDPHedwQ2ADeHW1LFSoaGegJPh11LWZxzjYFe2Jtmc6C+c65vrI6nQA9YyVj0M8A47/3EsOuprJJL7MlA97BrKcNxQM+ScekngS7OucfCLal8JWdneO8LgWeBTuFWVKalwNKdrs4mYAEfdacBM7z3K8IupBzdgEXe+yLv/VZgInBsrA6mQA9QyU3GR4B53vv7wq6nIs65LOdco5LP6wK/AuaHW9Weee9v8d4f4L3Pxi6z3/Lex+xMp6acc/VLboxTMnxxChDJmVre+2+Br51zrUse6gpE8kb+bvoQ4eGWEkuAo51z9UryoSt2by0mIh/ozrkngClAa+fcUufc5WHXVI7jgIuxs8fSKVWnh11UOZoBk51zs4BPsDH0yE8HTBD7Ae875z4DPgZe8t5PCrmm8lwDjCv5v9ABuDPkespV8ib5K+yMN7JKrnomADOA2VjmxmzFaOSnLYqISOVE/gxdREQqR4EuIpIkFOgiIklCgS4ikiQU6CIiSUKBLiKSJBToIiJJQoEuIpIk/h8wlqahRuU+iQAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from scipy.optimize import curve_fit\n", "\n", "def func(t, a1, a2, a3, a4):\n", " return a1+a2/(a3+(t-a4)**2)\n", "\n", "ndata = 8\n", "nparam = 4\n", "xdata = np.linspace(1, 8, ndata)\n", "y = func(xdata, 1, 10, 1, 4)\n", "#y = func(xdata, 5,-2,0,7)\n", "ydata = y\n", "plt.plot(xdata, ydata, 'b-', label='data')\n", "\n", "popt, pcov = curve_fit(func, xdata, ydata)\n", "plt.plot(xdata, func(xdata, *popt), 'r-', label='fit')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 5.4714478 -2.5260854 0.4296826 7.52394083]\n" ] } ], "source": [ "print(popt)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "うまくいってません.curve_fitの失敗の原因は,ほとんどが初期値の取り方のせいです.\n", "\n", "では,手計算でどうなるかを観て行きましょう.まずは初期値として適当な値を取ります.さらに,numpyと線形代数計算のためにscipy.linalg as linalgを呼びだしておきます.サンプルデータydataと初期値で予測される関数を同時にplotして観ます.\n" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "guess1 = [1, 8, 1, 4.5]" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from pprint import pprint\n", "import scipy.linalg as linalg\n", "plt.plot(xdata, ydata, 'b-', label='data')\n", "\n", "plt.plot(xdata, func(xdata, *guess1), 'r-', label='fit')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "ydataと予測した関数との差をdfに入れます.\n", "\n", "見やすいように,小数点以下を3桁表示に制限しています." ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "array([ 0.396, 0.897, 2.538, 3.6 , -1.4 , -0.462, -0.103, -0.016])\n" ] } ], "source": [ "np.set_printoptions(precision=3, suppress=True)\n", "\n", "df=np.zeros([ndata])\n", "for i in range(0,ndata):\n", " df[i] = ydata[i]-func(xdata[i], *guess1)\n", "\n", "pprint(df)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "ローレンツ型の関数を仮定し,関数として定義.\n", "```python\n", "def func(t, a1, a2, a3, a4):\n", " return a1+a2/(a3+(t-a4)**2)\n", "```\n", "ヤコビアンの中の微分を新たな関数として定義します.\n", "$$\n", "{\\it dfda1}\\, := \\,x\\mapsto 1 \\notag \\\\\n", "{\\it dfda2}\\, := \\,x\\mapsto \\left( {\\it a3}+ \\left( x-{\\it a4} \\right) ^{2} \\right) ^{-1}\n", "\\notag \\\\\n", "{\\it dfda3}\\, := \\,x\\mapsto -{\\frac {{\\it a2}}{ \\left( {\\it a3}+ \\left( x-{\\it a4} \\right) ^{2} \\right) ^{2}}} \\notag \\\\\n", "{\\it dfda4}\\, := \\,x\\mapsto -{\\frac {{\\it a2}\\, \\left( -2\\,x+2\\,{\\it a4} \\right) }{ \\left( {\\it a3}+ \\left( x-{\\it a4} \\right) ^{2} \\right) ^{2}}} \\notag\n", "$$" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "def dfda1(x, a1, a2, a3, a4):\n", " return 1\n", "def dfda2(x, a1, a2, a3, a4):\n", " return (a3 + (x - a4)**2)**(-1)\n", "def dfda3(x, a1, a2, a3, a4):\n", " return -a2/(a3 + (x -a4)**2)**2\n", "def dfda4(x, a1, a2, a3, a4):\n", " return -a2*(-2*x +2*a4)/(a3 + (x-a4)**2)**2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Jacobian行列を作ります." ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "array([[ 1. , 0.075, -0.046, -0.319],\n", " [ 1. , 0.138, -0.152, -0.761],\n", " [ 1. , 0.308, -0.757, -2.272],\n", " [ 1. , 0.8 , -5.12 , -5.12 ],\n", " [ 1. , 0.8 , -5.12 , 5.12 ],\n", " [ 1. , 0.308, -0.757, 2.272],\n", " [ 1. , 0.138, -0.152, 0.761],\n", " [ 1. , 0.075, -0.046, 0.319]])\n" ] } ], "source": [ "Jac=np.zeros([ndata,nparam])\n", "for i in range(0,ndata):\n", " Jac[i,0] = dfda1(xdata[i], *guess1)\n", " Jac[i,1] = dfda2(xdata[i], *guess1)\n", " Jac[i,2] = dfda3(xdata[i], *guess1)\n", " Jac[i,3] = dfda4(xdata[i], *guess1)\n", "pprint(Jac)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "J ^{-1}=\\left(J ^{T }J \\right)^{-1}\n", "$$\n", "を求めます." ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 1.017 -6.476 -0.821 0. ]\n", " [ -6.476 50.763 6.775 -0. ]\n", " [ -0.821 6.775 0.933 -0. ]\n", " [ 0. -0. -0. 0.016]]\n" ] } ], "source": [ "iJac = linalg.inv(np.dot(np.transpose(Jac),Jac))\n", "print(iJac)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "array([ 5.451, 2.537, -12.975, -33.309])\n" ] } ], "source": [ "Jdf = np.dot(np.transpose(Jac),df)\n", "pprint(Jdf)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([-0.235, 5.592, 0.613, -0.52 ])" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.dot(iJac, Jdf)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "これをまたもとの近似値(guess)に入れ直して表示させると以下のようになる.カーブがデータに近づいているのが確認できるでしょう." ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "array([ 0.765, 13.592, 1.613, 3.98 ])\n" ] } ], "source": [ "guess1 = guess1 + np.dot(iJac, Jdf)\n", "pprint(guess1)" ] }, { "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.plot(xdata, ydata, 'b-', label='data')\n", "\n", "popt, pcov = curve_fit(func, xdata, ydata)\n", "plt.plot(xdata, func(xdata, *guess1), 'r-', label='fit')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "この操作をずれが十分小さくなるまで繰り返します." ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "array([ 1.006, 9.926, 0.989, 4. ])\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "df=np.zeros([ndata])\n", "for i in range(0,ndata):\n", " dy = ydata[i]-func(xdata[i], *guess1)\n", " df[i]=dy\n", "#pprint(df)\n", "Jac=np.zeros([ndata,nparam])\n", "for i in range(0,ndata):\n", " Jac[i,0] = dfda1(xdata[i], *guess1)\n", " Jac[i,1] = dfda2(xdata[i], *guess1)\n", " Jac[i,2] = dfda3(xdata[i], *guess1)\n", " Jac[i,3] = dfda4(xdata[i], *guess1)\n", "# pprint(Jac)\n", "iJac = linalg.inv(np.dot(np.transpose(Jac),Jac))\n", "# print(iJac)\n", "Jdf = np.dot(np.transpose(Jac),df)\n", "# pprint(Jdf)\n", "guess1 = guess1 + np.dot(iJac, Jdf)\n", "pprint(guess1)\n", "plt.plot(xdata, ydata, 'b-', label='data')\n", "\n", "popt, pcov = curve_fit(func, xdata, ydata)\n", "plt.plot(xdata, func(xdata, *guess1), 'r-', label='fit')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "4回ほど繰り返すと以上の通り,いい値に収束してます." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Gauss-Newton法に関するメモ\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "このGauss-Newton法と呼ばれる非線形最小二乗法は線形問題から拡張した方法として論理的に簡明であり,広く使われている.しかし,収束性は高くなく,むしろ発散しやすいので注意が必要.2次の項を無視するのでなく,うまく見積もる方法を用いたのがLevenberg-Marquardt法である.明快な解説がNumerical Recipes in C(C 言語による数値計算のレシピ)WilliamH.Press 他著,技術評論社1993にある.\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 課題\n", "\n", "## Gaussian(正規分布)へのフィット\n", "\n", "正規分布で知られる,ガウス関数\n", "$$\n", "f(x)= \\frac{1}{\\sqrt{2\\pi\\sigma}}\n", "\\exp \\left(\\frac{- (x-\\mu)^2}{2\\sigma^2} \\right)\n", "$$\n", "でフィットをやってみましょう.\n", "\n", "例えば,平均値($\\mu$)が60点,偏差値($\\sigma$)が15点,ピークの人数が20人としましょう." ] }, { "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": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "def func(x, a1, a2, a3):\n", " return a1*np.exp(-(x-a2)**2/a3**2)\n", "\n", "ndata = 100\n", "xdata = np.linspace(1, ndata, ndata)\n", "y = func(xdata, 20, 60, 15)\n", "ydata = y\n", "plt.plot(xdata, ydata, 'b-', label='data')\n", "\n", "popt, pcov = curve_fit(func, xdata, ydata)\n", "plt.plot(xdata, func(xdata, *popt), 'r-', label='fit')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 20. 60. 15.]\n" ] } ], "source": [ "print(popt)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```python\n", "guess1 = [10,50,10]\n", "```\n", "から初めてGauss-Newton法でfittingしなさい.\n", "\n", "ただし,Gauss関数\n", "$$\n", "f(x) = {\\it a_1}\\,{\\exp \\left(-1/2\\,{\\frac { \\left( x-{\\it a_2} \\right) ^{2}}{{{\n", "\\it a_3}}^{2}}}\\right)}\\\\\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "それぞれのパラメータでの微分は,\n", "$$\n", "\\frac{\\partial f}{\\partial a_1}\n", "={\\exp \\left({-\\,{\\frac { \\left( x-{\\it a_2} \\right) ^{2}}{{2{\\it a_3}}^{2\n", "}}}}\\right)} \\\\\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\frac{\\partial f}{\\partial a_2}\n", "={\\frac {{\\it a_1}\\, \\left( x-{\\it a_2} \\right) }\n", " {{{\\it a_3}}^{2}}\n", " }\n", "\\exp\\left({\n", " - {\\frac { \n", " \\left( x-{\\it a_2} \\right) ^{2}}\n", " {{2 \\it a_3^{2}}}}\n", " }\\right)\n", "$$\n", "$$\n", "\\frac{\\partial f}{\\partial a_3}\n", "={\\frac {{\\it a_1}\\, \\left( x-{\\it a_2} \\right) ^{2}}{{{\\it a_3}}^{3}}\n", "{\n", "\\exp\\left({-\n", "{\\frac { \\left( x-{\\it a_2} \\right) ^{2} }\n", "{2{\\it a_3}^2} \n", "}}\\right)}}\n", "$$ \n", "これらの関数は次の通り定義される." ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "from pprint import pprint\n", "import scipy.linalg as linalg\n", "\n", "def dfda1(x,a1,a2,a3):\n", " return np.exp(-(x - a2) ** 2 / a3 ** 2 / 2)\n", "def dfda2(x,a1,a2,a3):\n", " return a1 * (x - a2) / a3 ** 2 * np.exp(-(x - a2) ** 2 / a3 ** 2 / 2)\n", "def dfda3(x,a1,a2,a3):\n", " return a1 * (x - a2) ** 2 / a3 ** 3 * np.exp(-(x - a2) ** 2 / a3 ** 2 / 2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "以下の初期条件からfittingをおこなえ." ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "nparam = 3\n", "guess1 = [10, 50, 10]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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.1" }, "latex_envs": { "LaTeX_envs_menu_present": true, "autocomplete": true, "bibliofile": "biblio.bib", "cite_by": "apalike", "current_citInitial": 1, "eqLabelWithNumbers": true, "eqNumInitial": 1, "hotkeys": { "equation": "Ctrl-E", "itemize": "Ctrl-I" }, "labels_anchors": false, "latex_user_defs": false, "report_style_numbering": false, "user_envs_cfg": false }, "toc": { "colors": { "hover_highlight": "#DAA520", "navigate_num": "#000000", "navigate_text": "#333333", "running_highlight": "#FF0000", "selected_highlight": "#FFD700", "sidebar_border": "#EEEEEE", "wrapper_background": "#FFFFFF" }, "moveMenuLeft": true, "nav_menu": { "height": "12px", "width": "252px" }, "navigate_menu": true, "number_sections": true, "sideBar": true, "threshold": 4, "toc_cell": true, "toc_section_display": "block", "toc_window_display": true, "widenNotebook": false } }, "nbformat": 4, "nbformat_minor": 2 }