{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 最小二乗フィッティング\n", " カーブフィッティングは、データ解析よく用いられます。補間と同様に特定のデータポイントに基づいて関数を近似しますが、関数を近似する基準が異なります。\n", "\n", "- 補間は、指定されたデータポイントの値を必ず通ります。\n", "\n", "- フィッティングは、指定されたデータポイントの値を必ず通るわけではなく、一般的な関数を使用して全体像を記述しようとします。\n", "\n", "いろいろなところで目にするように、補完とフィッティングの間には多くの共通の数学があります。\n" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", "#define the function\n", "f = lambda x: 3*x+2\n", "\n", "#define the paramters for the plot\n", "a,b = 0,3\n", "npoints = 10\n", "\n", "x = np.linspace(a,b,npoints)\n", "y = f(x) + np.random.rand(npoints) - 0.5\n", "\n", "plt.plot(x,y, 'o', label='noisy data')\n", "plt.plot(x,f(x), '-', label='fit1')\n", "plt.plot(x,4*x+1, '--', label='fit2')\n", "\n", "plt.xlabel('x')\n", "plt.ylabel('$f(x)$')\n", "plt.xlim([a,b])\n", "plt.legend()\n", "plt.show()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "上の図は、y=3x+2という一次関数に対してランダムなノイズを加えて10個の点を生成し、プロットしたものです。\n", "\n", "オレンジの線はy=3x+2を示しているので、各点の近くを通る線となっています。\n", "\n", "それに対して点線は、y=4x+1という一次関数を示しています。x=1から離れると、各点から離れていくことがわかります。\n", "\n", "この結果から、当然ですが、y=3x+2のほうが良いフィッティングであることがわかります。\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## フィッティングの評価基準\n", "\n", " それではどのようなフィッティングがよいフィッティングかを考えてみましょう。以下のような一連の点があるとします。\n", "\n", "$$(x_1, y_1), (x_2, y_2), (x_3, y_3), ... (x_{n-1}, y_{n-1}), (x_n, y_n)$$\n", "\n", "\n", " これらの点を最もよく表す直線 $f(x) = ax+b$ を描きたいとします。$a$ と $b$ には任意の数を選択できます。この$a$ と $b$ を選択する際に最も良いの基準はどんなものでしょうか。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "フィッティングのエラーは、次のような式で見積もることができます。\n", "\n", "$$\\text{err} = \\sum(y_i - f(x_i))^2$$\n", "\n", "今考えているフィッティング関数は直線なので、\n", "\n", "$$\\text{err} = \\sum(y_i - (ax_i + b))^2 $$\n", "\n", "最も良い直線は、線とデータポイントの間のエラー(誤差)が最小になるものです。\n", "\n", "これは**最小二乗法**と呼ばれ、目標は**エラー**の最小値を見つけることです。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "その目的のために、極小値を探します。\n", "\n", "$$\\frac{\\partial{\\text{err}}}{\\partial a} = -2\\sum_i^n x_i (y_i - ax_i -b) = 0$$\n", "\n", "$$\\frac{\\partial{\\text{err}}}{\\partial b} = -2\\sum_i^n (y_i - ax_i -b) = 0$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "これらの 2 つの方程式は、次のように書き直すことができます。\n", "\n", "$$a\\sum x_i^2 + b\\sum x_i = \\sum(x_iy_i)$$\n", "\n", "$$a\\sum x_i + bn = \\sum{y_i}$$\n", "\n", "マトリックス形式が便利です。\n", "\n", "$$\n", "\\begin{bmatrix}\n", " n & \\sum x_i \\\\\n", " \\sum x_i & \\sum x_i^2 \\\\\n", "\\end{bmatrix}\n", "\\begin{bmatrix}\n", " b \\\\\n", " a \\\\\n", "\\end{bmatrix}\n", "=\n", "\\begin{bmatrix}\n", " \\sum y_i \\\\\n", " \\sum (x_iy_i)\\\\\n", "\\end{bmatrix}\n", "$$\n", "\n", "つまり、これは基本的に Ax = B を解く問題です。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "多項式フィッティングの場合、このスキームは次のように一般化できます。\n", "\n", "$$\n", "\\begin{pmatrix}\n", " n & \\sum x_i & \\sum x_i^2 &... &\\sum x_i^j \\\\\n", " \\sum x_i & \\sum x_i^2 & \\sum x_i^3 &... &\\sum x_i^{j+1} \\\\\n", " \\sum x_i^2 & \\sum x_i^3 & \\sum x_i^4 &... &\\sum x_i^{j+2} \\\\\n", " & & &... &\\\\\n", " \\sum x_i^j & \\sum x_i^{j+1} & \\sum x_i^{j+2} &... &\\sum x_i^{j+j} \n", "\\end{pmatrix}\n", "\\begin{pmatrix}\n", " a_0 \\\\\n", " a_1 \\\\\n", " a_2 \\\\\n", " ... \\\\\n", " a_j \n", "\\end{pmatrix}\n", "=\n", "\\begin{pmatrix}\n", " \\sum y_i \\\\\n", " \\sum (x_iy_i) \\\\\n", " \\sum (x_i^2y_i) \\\\\n", " ... \\\\\n", " \\sum (x_i^jy_i) \n", "\\end{pmatrix}\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 多項式フィッティング\n", "\n", "Use with p = np.polyfit(x, y, pOrder) and np.ployval(p, x)\n", "\n", "- 指定された x および y データを設定します\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline \n", "\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", "plt.figure(figsize=[12, 8])\n", "#define the function\n", "f = lambda x: x * np.sin(x) \n", "\n", "#define the paramters for the plot\n", "a,b = 0,3\n", "npoints = 100\n", "order = 10\n", "\n", "x = np.linspace(a,b,npoints)\n", "y = f(x) + np.random.rand(npoints) - 0.5" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Get a polyfit\n", "- polyval を使用して多項式を評価する\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "fit = np.polyfit(x, y, order, full=True)\n", "y_p = np.polyval(fit[0], x)" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "image/png": "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iIiHKGyLiIiIiHiIwrb4Ln9drVJERESkjsZsi2/y59UqRUREROqoZ1t8kz+vVikiIiJSR2FbfJM/r1YpIiIiUkdhW3yTP69WKSIiIlJHYVt806hJtatTHs2fVqsUERERQWFbfJVWqxQREZFmQLORiO/SapUiIiLi59SzLSIiIiLiIQrbIiIiIiIeorAtIiIiIuIhCtsiIiIiIh6isC0iIiIi4iEK2yIiIiIiHqKwLSIiIiLiIQrb4j4Zs2Faf3iide2fGbObuiIRERGRJqVFbcQ9MmbDp/dCVVnt66I9ta9BC9OIiIhIwFLPtrjHwin/Ddo/qiqrfV9EREQkQClsi3sUZTfsfREREZEAoLAt7hGT1LD3RURERAKAwra4x6hJEBp57HuhkbXvi4iIiAQohW1xj5SxMOZliEkGTO2fY17Ww5EiIiIS0DQbibhPyliFaxEREZGjqGdbRERERMRDml/Y1sIqIiIiIuIjmtcwEi2sIiIiIiI+pHn1bGthFRERERHxIc0rbGthFRERERHxIc0rbGthFRERERHxIc0rbGthFRERERHxIc0rbGthFRERERHxIc1rNhLQwioiIiIi4jOaV8+2iIiIiIgPUdgWEREREfEQhW0REREREQ9R2BYRERER8RCFbRERERERD1HYFhERERHxEIVtEREREREPUdgWEREREfEQhW0REREREQ9R2BYRERER8RCFbRERERERD1HYFhERERHxEIVtEREREREPUdgWEREREfEQhW0REREREQ8x1tqmrsFlxphiYGtT1yEuiwPymroIcYnOnX/T+fNvOn/+S+fOv/Wy1rZq6E4hnqjEi7Zaa1ObughxjTEmTefPP+nc+TedP/+m8+e/dO78mzEmzZX9NIxERERERMRDFLZFRERERDzE38P29KYuQBpF589/6dz5N50//6bz57907vybS+fPrx+QFBERERHxZf7esy0iIiIi4rP8ImwbY0YbY7YaY7YbYx6r5+fhxph/1f18pTGms/erlPo4ce5uM8bkGmPW1n39pinqlPoZY2YaY3KMMRtO8HNjjHm57vxmGGOGeLtGqZ8T5+5cY0zRUdfeJG/XKPUzxiQbY742xmwyxmw0xtxXzza69nyUk+dP15+PMsZEGGO+N8asqzt/T9azTYNyp8+HbWNMMPAacAnQF7jBGNP3uM1+DRyy1nYHpgHPerdKqY+T5w7gX9baQXVfb3u1SDmVvwGjT/LzS4AedV93AK97oSZxzt84+bkD+Paoa2+KF2oS51QDD1lr+wJnARPq+X+nrj3f5cz5A11/vqoCON9aOxAYBIw2xpx13DYNyp0+H7aBM4Dt1tqd1tpK4J/AFcdtcwUwq+77OcAoY4zxYo1SP2fOnfgwa+0SoOAkm1wBvGNrfQe0NsYkeqc6ORknzp34KGvtfmvt6rrvi4HNQMfjNtO156OcPH/io+quqZK6l6F1X8c/4Nig3OkPYbsjsOeo19n871/an7ax1lYDRUBbr1QnJ+PMuQO4uu426BxjTLJ3ShM3cfYci28aVner9EtjTL+mLkb+V93t6cHAyuN+pGvPD5zk/IGuP59ljAk2xqwFcoD51toTXn/O5E5/CNvSvH0KdLbWpgDz+e8nRRHxrNVAp7pbpa8AHzdxPXIcY0xL4EPgfmvt4aauRxrmFOdP158Ps9bWWGsHAUnAGcaY/o1pzx/C9l7g6N7OpLr36t3GGBMCxAD5XqlOTuaU585am2+trah7+TYw1Eu1iXs4c32KD7LWHv7xVqm19gsg1BgT18RlSR1jTCi1Qe19a+2/69lE154PO9X50/XnH6y1hcDX/O/zLw3Knf4QtlcBPYwxXYwxYcD1wNzjtpkL3Fr3/TXAIqsJxH3BKc/dcWMML6d2bJv4j7nALXUzI5wFFFlr9zd1UXJqxpj2P44xNMacQe2/B+qk8AF152UGsNla+8IJNtO156OcOX+6/nyXMSbeGNO67vtI4EJgy3GbNSh3hniiUHey1lYbY+4GvgKCgZnW2o3GmClAmrV2LrV/qd81xmyn9oGg65uuYvmRk+fuXmPM5dQ+vV0A3NZkBcv/MMb8AzgXiDPGZAOTqX1YBGvtG8AXwKXAdqAU+FXTVCrHc+LcXQPcZYypBsqA69VJ4TOGA78E1teNGwX4HXAa6NrzA86cP11/visRmFU3o1oQMNta+1ljcqdWkBQRERER8RB/GEYiIiIiIuKXFLZFRERERDxEYVtERERExEMUtkVEREREPERhW0RERETEQxS2RUREREQ8RGFbRERERMRDFLZFRAKAMeZ0Y0yGMSbCGNPCGLPRGNO/qesSEWnutKiNiEiAMMb8EYgAIoFsa+2fmrgkEZFmT2FbRCRAGGPCgFVAOXC2tbamiUsSEWn2NIxERCRwtAVaAq2o7eEWEREPU8+2iEiAMMbMBf4JdAESrbV3N3FJIiLNXkhTFyAiIp5njLkFqLLW/t0YEwwsN8acb61d1NS1iYg0Z+rZFhERERHxEI3ZFhERERHxEIVtEREREREPUdgWEREREfEQhW0REREREQ9R2BYRERER8RCFbRERERERD1HYFhERERHxEIVtEREREREP+f/9RpmKHAj1dAAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(x,f(x), label='ideal function')\n", "plt.plot(x,y, 'o', label='noisy data')\n", "plt.plot(x,y_p, label='polyfit'+str(order))\n", "\n", "plt.xlabel('x')\n", "plt.ylabel('$f(x)$')\n", "plt.xlim([a,b])\n", "plt.legend(fontsize=12)\n", "plt.title('fitted coefficients' + str(fit[0]) + '\\n residual: ' + str(fit[1]))\n", "plt.show()\n", "#plt.text(2, 2, fit)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### クイズ\n", "異なる多項式関数でコードを実行してみて、どの多項式が最適かを判断してください。" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Help on function polyfit in module numpy.lib.polynomial:\n", "\n", "polyfit(x, y, deg, rcond=None, full=False, w=None, cov=False)\n", " Least squares polynomial fit.\n", " \n", " Fit a polynomial ``p(x) = p[0] * x**deg + ... + p[deg]`` of degree `deg`\n", " to points `(x, y)`. Returns a vector of coefficients `p` that minimises\n", " the squared error.\n", " \n", " Parameters\n", " ----------\n", " x : array_like, shape (M,)\n", " x-coordinates of the M sample points ``(x[i], y[i])``.\n", " y : array_like, shape (M,) or (M, K)\n", " y-coordinates of the sample points. Several data sets of sample\n", " points sharing the same x-coordinates can be fitted at once by\n", " passing in a 2D-array that contains one dataset per column.\n", " deg : int\n", " Degree of the fitting polynomial\n", " rcond : float, optional\n", " Relative condition number of the fit. Singular values smaller than\n", " this relative to the largest singular value will be ignored. The\n", " default value is len(x)*eps, where eps is the relative precision of\n", " the float type, about 2e-16 in most cases.\n", " full : bool, optional\n", " Switch determining nature of return value. When it is False (the\n", " default) just the coefficients are returned, when True diagnostic\n", " information from the singular value decomposition is also returned.\n", " w : array_like, shape (M,), optional\n", " Weights to apply to the y-coordinates of the sample points. For\n", " gaussian uncertainties, use 1/sigma (not 1/sigma**2).\n", " cov : bool, optional\n", " Return the estimate and the covariance matrix of the estimate\n", " If full is True, then cov is not returned.\n", " \n", " Returns\n", " -------\n", " p : ndarray, shape (deg + 1,) or (deg + 1, K)\n", " Polynomial coefficients, highest power first. If `y` was 2-D, the\n", " coefficients for `k`-th data set are in ``p[:,k]``.\n", " \n", " residuals, rank, singular_values, rcond\n", " Present only if `full` = True. Residuals of the least-squares fit,\n", " the effective rank of the scaled Vandermonde coefficient matrix,\n", " its singular values, and the specified value of `rcond`. For more\n", " details, see `linalg.lstsq`.\n", " \n", " V : ndarray, shape (M,M) or (M,M,K)\n", " Present only if `full` = False and `cov`=True. The covariance\n", " matrix of the polynomial coefficient estimates. The diagonal of\n", " this matrix are the variance estimates for each coefficient. If y\n", " is a 2-D array, then the covariance matrix for the `k`-th data set\n", " are in ``V[:,:,k]``\n", " \n", " \n", " Warns\n", " -----\n", " RankWarning\n", " The rank of the coefficient matrix in the least-squares fit is\n", " deficient. The warning is only raised if `full` = False.\n", " \n", " The warnings can be turned off by\n", " \n", " >>> import warnings\n", " >>> warnings.simplefilter('ignore', np.RankWarning)\n", " \n", " See Also\n", " --------\n", " polyval : Compute polynomial values.\n", " linalg.lstsq : Computes a least-squares fit.\n", " scipy.interpolate.UnivariateSpline : Computes spline fits.\n", " \n", " Notes\n", " -----\n", " The solution minimizes the squared error\n", " \n", " .. math ::\n", " E = \\sum_{j=0}^k |p(x_j) - y_j|^2\n", " \n", " in the equations::\n", " \n", " x[0]**n * p[0] + ... + x[0] * p[n-1] + p[n] = y[0]\n", " x[1]**n * p[0] + ... + x[1] * p[n-1] + p[n] = y[1]\n", " ...\n", " x[k]**n * p[0] + ... + x[k] * p[n-1] + p[n] = y[k]\n", " \n", " The coefficient matrix of the coefficients `p` is a Vandermonde matrix.\n", " \n", " `polyfit` issues a `RankWarning` when the least-squares fit is badly\n", " conditioned. This implies that the best fit is not well-defined due\n", " to numerical error. The results may be improved by lowering the polynomial\n", " degree or by replacing `x` by `x` - `x`.mean(). The `rcond` parameter\n", " can also be set to a value smaller than its default, but the resulting\n", " fit may be spurious: including contributions from the small singular\n", " values can add numerical noise to the result.\n", " \n", " Note that fitting polynomial coefficients is inherently badly conditioned\n", " when the degree of the polynomial is large or the interval of sample points\n", " is badly centered. The quality of the fit should always be checked in these\n", " cases. When polynomial fits are not satisfactory, splines may be a good\n", " alternative.\n", " \n", " References\n", " ----------\n", " .. [1] Wikipedia, \"Curve fitting\",\n", " http://en.wikipedia.org/wiki/Curve_fitting\n", " .. [2] Wikipedia, \"Polynomial interpolation\",\n", " http://en.wikipedia.org/wiki/Polynomial_interpolation\n", " \n", " Examples\n", " --------\n", " >>> x = np.array([0.0, 1.0, 2.0, 3.0, 4.0, 5.0])\n", " >>> y = np.array([0.0, 0.8, 0.9, 0.1, -0.8, -1.0])\n", " >>> z = np.polyfit(x, y, 3)\n", " >>> z\n", " array([ 0.08703704, -0.81349206, 1.69312169, -0.03968254])\n", " \n", " It is convenient to use `poly1d` objects for dealing with polynomials:\n", " \n", " >>> p = np.poly1d(z)\n", " >>> p(0.5)\n", " 0.6143849206349179\n", " >>> p(3.5)\n", " -0.34732142857143039\n", " >>> p(10)\n", " 22.579365079365115\n", " \n", " High-order polynomials may oscillate wildly:\n", " \n", " >>> p30 = np.poly1d(np.polyfit(x, y, 30))\n", " /... RankWarning: Polyfit may be poorly conditioned...\n", " >>> p30(4)\n", " -0.80000000000000204\n", " >>> p30(5)\n", " -0.99999999999999445\n", " >>> p30(4.5)\n", " -0.10547061179440398\n", " \n", " Illustration:\n", " \n", " >>> import matplotlib.pyplot as plt\n", " >>> xp = np.linspace(-2, 6, 100)\n", " >>> _ = plt.plot(x, y, '.', xp, p(xp), '-', xp, p30(xp), '--')\n", " >>> plt.ylim(-2,2)\n", " (-2, 2)\n", " >>> plt.show()\n", "\n" ] } ], "source": [ "help(np.polyfit)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## より一般的なカーブ フィッティング\n", "\n", " 一般的な関数 f(x; a, b, c) を当てはめることができます。ここで、f は、与えられたデータのセットに対して最適化したいパラメーター a、b、c を持つ x の関数です。この関数は scipy.optimize から利用できます。以下は、関数 $f(x)$ を次の式に適合させる例です\n", "\n", "$$f(x) = a \\text{exp}(-bx) + c$$" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "original coefficients: 2.500, 1.300, 0.400\n", "fitted coefficients: 2.686, 1.364, 0.359\n" ] } ], "source": [ "from scipy.optimize import curve_fit\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", "plt.figure(figsize=[10, 6])\n", "\n", "\n", "#define the function\n", "f = lambda x,a,b,c: a*np.exp(-b*x)+c \n", "\n", "#define the paramters for the plot\n", "x_min, x_max = 0, 10\n", "npoints = 100\n", "a,b,c = 2.5, 1.3, 0.4\n", "\n", "x = np.linspace(x_min, x_max, npoints)\n", "y = f(x,a,b,c) + np.random.rand(npoints) - 0.5\n", "\n", "#do the curve fit\n", "params, extras = curve_fit(f, x, y)\n", "\n", "plt.plot(x,f(x,a,b,c), '--', label='ideal function')\n", "plt.plot(x,y, 'o', label='noisy data')\n", "plt.plot(x,f(x,params[0],params[1],params[2]), label='curve_fit')\n", "\n", "plt.xlabel('x')\n", "plt.ylabel('$f(x)$')\n", "plt.xlim([x_min, x_max])\n", "plt.legend(fontsize=12)\n", "plt.show()\n", "print('original coefficients: %6.3f, %6.3f, %6.3f' %(a,b,c))\n", "print('fitted coefficients: %6.3f, %6.3f, %6.3f' %(params[0], params[1], params[2]))\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 発展\n", "\n", " このセクションでは、**最小二乗距離**を使用して最も近い適合を表すことを学びました。それは常に最良の基準でしょうか?\n", " \n", " 他の基準もあります。scipy では、距離に関するさまざまな定義があります。\n", "\n", "https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.spatial.distance.pdist.html\n", "\n", "https://www.cs.utah.edu/~jeffp/teaching/cs5955/L7-Distances.pdf\n", "\n", "- $L_p$ distances\n", "- cosine\n", "- jaccard\n", "\n", " ユークリッド距離 ($L_2$) は、最も一般的に使用される距離メトリックですが、決して唯一の定義ではありません。\n", "\n", " 場合によっては、$L_1$ の距離の方が、さまざまな目的に適していることがあります。 たとえば、$L_1$ は、高速信号/画像処理専用の新しいアルゴリズムで広く使用されています。\n", " \n", "https://en.wikipedia.org/wiki/Compressed_sensing" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 課題\n", "次のことを行う独自のプログラムを作成します。\n", "- ランダム ノイズを含むデータを生成する\n", "- データに適合するために別の多項式関数を選択する\n", "- どの多項式関数が最も適しているかを議論し、その理由を述べてください。" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.11.4" } }, "nbformat": 4, "nbformat_minor": 4 }