{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 関数近似\n", "\n", "pythonのライブラリ利用演習を兼ねて、初歩的な関数近似と、利用上の注意について述べる。\n", "\n", "特に、自然科学における利用とデータサイエンス的な観点との差異にも述べる。\n", "\n", "
\n", " このページのオリジナルのipynbファイル\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## データの準備\n", "\n", "2つの値の組の$n$個のデータがあるとする。$(x_1,y_1),\\ (x_2, y_2),\\ \\cdots,\\ (x_n,y_n)$\n", "\n", "ここでは、$x$と$y$の関係が何かある関数$y=f(x)$で表されるとしてそれを探る問題を考えてみる。\n", "\n", "準備として仮想的なデータを用意する。\n", "\n", "$\\sin x$の値に、ガウシアンノイズを載せたデータを返す関数make_data_by_sin_gaussian()を以下のように作成する。\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" }, { "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 random\n", "\n", "def make_data_by_sin_gaussian(x):\n", " # y=sin (x)を計算し、ガウス分布に従うノイズを加える\n", " y = np.sin(x)\n", " e = [random.gauss(0, 0.2) for i in range(len(y))]\n", " # e = np.random.randn(len(x))*0.2\n", " y += e\n", " return y\n", "\n", "# データ数\n", "n_tr = 10\n", "x = np.linspace(0., np.pi*2., n_tr) # リスト 0から2πまでをn_tr等分した値を一次元配列\n", "y = make_data_by_sin_gaussian(x)\n", "\n", "# データの描画\n", "import matplotlib.pyplot as plt\n", "plt.plot(x,y, \"ob\")\n", "\n", "# sinの描画\n", "#n_tr = 100\n", "#x = np.linspace(0., np.pi*2., n_tr)\n", "#plt.plot(x, np.sin(x))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(注)\n", "\n", "\n", "ノイズの部分\n", "```python\n", "e = [random.gauss(0, 0.2) for i in range(len(y))]\n", "```\n", "は、numpyの乱数発生関数\n", "```python\n", "e = np.random.randn(len(x))*0.2\n", "```\n", "でもよい。こちらの方が繰り返し記述がない分、シンプルかも。\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## べき多項式関数近似\n", "\n", "データに潜む原理から、べき的な振る舞いを示しているものだと想定し、べき関数での近似を行ってみる。つまり、\n", "\n", "$$\n", " y(x, {\\bf w}) = w_0 + w_1 x + w_2 x^2 + \\cdots + w_M x^M = \\sum_{j=0}^{M} w_j x^j\n", "$$\n", "\n", "置き、トレーニングデータ$\\{(t_n, x_n)\\}$, $n=1,\\cdots, N$を使って、係数${\\bf w} = (w_1,\\ w_2,\\ \\cdots,\\ w_n)$を\n", "2乗誤差\n", "\n", "$$\n", "E({\\bf w}) = \\frac{1}{2} \\sum_{n=1}^N \\{y(x_n,{\\bf w}) - t_n\\}^2\n", "$$\n", "\n", "を最小にするよう${\\bf w}$を決める。\n", "\n", "このことを最小2乗法と呼ぶ。\n", "\n", "pythonのライブラリscikit-learnにあるlinear_modelを用いてみる\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 線形近似" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### べき多項式近似\n", "\n", "まずは、べき関数へのフィッティングをlinear_modelで行うために、$x$の値に対する各べきの値$x^1,\\ x^2,\\ x^3,\\ \\cdots,\\ x^n$を行として並べた行列(Vandermonde行列)を作成しておく。\n", "\n", "(注)データ分析に慣れている人向け説明:\n", "\n", "$n$個の説明変数に対する係数$\\{w_i\\}$を線形重回帰(multiple linear regression)によって決めるということに相当する。\n", "\n", "このことの必要性を理解するために、最初に[社会的データの重回帰分析](multiple_regression.html)について説明する。\n" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "# トレーニングデータの数\n", "n_tr = 10\n", "x_tr = np.linspace(0., np.pi*2., n_tr)\n", "\n", "# データの作成\n", "y = make_data_by_sin_gaussian(x_tr) # データ\n", "\n", "# 説明変数の作成 (x, x^2, ...x^m) 行列\n", "m=3 # フィッティング関数の次数\n", "power_matrix_x = np.vander(x_tr, m+1)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 0. , 0. , 0. , 1. ],\n", " [ 0.34026092, 0.48738787, 0.6981317 , 1. ],\n", " [ 2.72208739, 1.94955149, 1.3962634 , 1. ],\n", " [ 9.18704494, 4.38649084, 2.0943951 , 1. ],\n", " [ 21.77669912, 7.79820595, 2.7925268 , 1. ],\n", " [ 42.53261547, 12.18469679, 3.4906585 , 1. ],\n", " [ 73.49635954, 17.54596338, 4.1887902 , 1. ],\n", " [116.70949686, 23.88200571, 4.88692191, 1. ],\n", " [174.21359298, 31.19282379, 5.58505361, 1. ],\n", " [248.05021344, 39.4784176 , 6.28318531, 1. ]])" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "power_matrix_x" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import sklearn.linear_model as lm\n", "import matplotlib.pyplot as plt\n", "\n", "# 関数フィッティング\n", "lrp = lm.LinearRegression()\n", "lrp.fit(power_matrix_x, y) # 以上が学習(フィッティングにより係数を決定)\n", "# 予測 (下の実線)\n", "x_lrp = np.linspace(0., np.pi*3.0, 100)\n", "y_lrp = lrp.predict(np.vander(x_lrp, m+1))\n", "\n", "# データの描画\n", "plt.plot(x_tr, y, \"ob\", ms=8)\n", "# 近似曲線の描画\n", "plt.plot(x_lrp, y_lrp)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAD7CAYAAABkO19ZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nOzdeVzU1frA8c+ZGWCAYVFEFlEU3DUxFc0lNS1sMStKM9u1tDRN0/q1a9lm2d69pXWt7i3bXNtMSnNfwH3fwA1BRWQdgdnO7w+WUFGBmWGAOe/Xi5fwXR+H4eHwnPM9R0gpURRFUeovjasDUBRFUZxLJXpFUZR6TiV6RVGUek4lekVRlHpOJXpFUZR6TiV6RVGUes6uRC+EeEYIsU4IsUUIMUcI4XnB/glCiCQhxDYhxBT7QlUURVGqo9qJXgjRCAgAekspuwA+wG3l9vcG7gF6A92B24UQ3ewLV1EURamqaid6KeUZKeULUkophDBQnPR3lTtkMPCllNIkpTQBcyj3i0BRFEWpGTp7LyCE+BaIA2YA+8rtCgLWl/s6HehxiWuMBkYD+Pr6dm3btq29YSmKUknJ2cl4aj1p6tfU1aGUOXAqDy+dlsiGekjfAX6hxR/KJW3evPmMlDK4on12J3op5b1CCB/gf8CDwFclu04BjcsdGlqyraJrzAZmA3Tr1k1u2rTJ3rAURamk2xbdRsvAlrzb/11XhwJAgclK+6l/8OTAVkxsnQVz4mD4bGh7s6tDq9WEEEcvtc+eGn1nIcSDAFLKc8ABILDcIYuBB4QQHkIILcW/BH6u7v0URXEOq7Si1WhdHUaZA6fykBLahvpD+vbijWExrg2qjrNn1M1+oJcQYpMQYjXQHJgthFghhAiVUm6iOLFvBDYAv5RsUxSlFrHYLOiE3X/cO8ze9FwA2oeVJHqfRuAf7uKo6rZqf3ellAXAmAp29S93zExgZnXvoSiK89W2Fv2+k3n4emqJaOANaVsh/GoQwtVh1Wm159f4ZZjNZlJTUyksLHR1KHWeXq8nIiICDw8PV4ei1BJWmxWtqD2JfndaDu3C/NFYCiBjL7S9xdUh1Xl1ItGnpqbi5+dH8+bNEeo3e7VJKcnMzCQ1NZUWLVq4OhyllrBKKzpN7UgFNptkT1oud3WNgJM7QdqKW/SKXerEFAiFhYUEBQWpJG8nIQRBQUHqLyPlPBabpda06I+ePYfRZKVDeEBx2QZUoneAOpHoAZXkHUS9jsqFalONfndaDgDtw/0hfRsYQsA/zMVR1X11JtEriuIcVpu11oy62Z2Wi04jaBVi+KcjVrGbSvTVMG3aND777DOX3f+PP/6gd+/eXHPNNVx//fUcO3bMZbEodZ9FWmpRiz6XViF+eFkLIGO/SvQOohJ9HfTXX3+xZMkSNmzYwJ133smMGTNcHZJSh9WmUTd70nLpEO4PJ3cAUiV6B6kdf69VwSu/7GZPWq5Dr9k+3J+pt3a47DGTJ09mzZo1ZUMTQ0OL591Yv349U6ZMQaPR0LlzZz7++GNsNhsPP/wwycnJGAwGpJT89NNPTJgwgS5durB48WIWLVrEihUreO2119DpdAwePJjnnnsOm83GE088wfbt29Fqtbz//vt07dr1vFhmzix+NMFms3H48GG6d+/u0NdDcR82aUMia0WL/nRuIWfyi4oTfdqa4o1hnV0bVD2hWvSV8Pvvv3Po0CE2bNjAjz/+SF5eXtm+++67j6+//prVq1ej0+lYtGgRS5cupbCwkDVr1jBp0iSaN2+Ov78/AHv37mXZsmVYrVbGjx/PkiVLWLt2LUlJSWzdupU5c+ZQWFjI2rVr+f777xk/fnyFMb333ns0a9aM9PR04uPja+R1UOofq80KUCtq9LtLGnBlI278m4BfiIujqh9c/92toiu1vJ1h9+7d9OvXDyEEWq2W2NhYAM6cOcPp06d55JFHADh37hxNmjShV69eGI1GpJTk5OSQk5NTdq2bbroJgEOHDmE0GsuSdG5uLvv372fbtm0kJSXRv39/ADIzMzGZTHh6nremC0899RQTJ05k5syZjB8/nq+++srJr4JSH1mkBaBWtOhLR9y0C/ODtG2qNe9AdS7Ru0KnTp346KOPmDhxIiaTib///pt77rmHoKAgWrRowQ8//EBISAgnTpygoKCAJk2akJ+fT79+/fD29uaTTz4pu1Zpwo6OjqZp06b89ttv+Pr6sn//fgICAsjNzSUgIIDXX38dgJUrV56X5HNycvjoo494/vnn0Wq1xMTEsG7dupp9QZR6o7RFXxtq9LvTcokM8sGPAsg8CJ3udnVI9YZK9JUwaNAgVqxYQffu3WnYsCEdOhT/VSGEYNasWQwdOhQAg8HAp59+SlZWFiaTCZ1Oh5SS77//npdeeum8azZo0IBXX32V66+/Hp1OR2hoKLNnz2bUqFFMnDiR3r17AxAfH0+/fv3KzgsICMBgMNC9e3cMBgNarZZPP/20hl4Jpb6xypLSTS14MnZ3Wi4dm5SbsVJ1xDqMkFK6OobzVDQf/d69e2nXrp2LIqq67777jsTERN5++21ycnK4+uqrSUpKKuvAdbW69noqzpNZkEn/H/vzQo8XGN52uMviyC0002laAk8PasM4z9/hz5fg6WTwbeSymOoaIcRmKWWFy7W6/td4PRQTE8Onn35KXFwcRUVFPPLII7UmyStKeaUtelfX6EtH0rUP94cdWyCgqUryDqQSvRO0b9+eVatWuToMRbmi2jLqZk/ZiBt/WLIZmnS9whlKVajhlYrixmrLqJvdabk0MnjRWORB9jGIqLACoVSTSvSK4sZqy6ibXSdyuKqJP5zYXLxBtegdSiV6RXFjtaFGf85k4eDpPK6KCCxO9EKr1oh1MLsLc0KIYcAkwAKkAw+VLBZeun/FBac8I6VMtPe+iqLYz2IrLt24ska/Jy0Xm4SrmgTA5k3QuD14+rosnvrIrha9EKIh8AwwQEp5LXAUeOSCw7yklP3LfdT5JO/q2StLrVy5Eq3W9Q+6KHVXWYvehaWbnSeKn4jtVFq6adLFZbHUV3YleinlWaBPyULhUPwXQunnCCF0QIAQ4kchxCohxHQhasEjePVAbm4u06dPL5uOQVGqo6xG78LSzc7UHBr7eRFiSYPCHNUR6wR2/70mpSwUQuiBGYAXMKfcbgOwEngOyAVmU9zin1X+GkKI0cBogGbNml3+hkueLV5L0pFCr4Kb3rrsIbVp9kqACRMm8NxzzzF9+nTHvhaKWyl7MtaFpZudJ3KKyzapJQ9Kqo5Yh7O7M1YIEQEsBP6QUj4mZck7B5BSZkspHy/51wYsAC6aU1dKOVtK2U1K2S04ONjekByuts1eOW/ePAwGAwMHDqyx10Cpn0pr9K5q0RuLLBzKyOeqiIDiso2HLwS3dUks9Zldv8ZLWvJfAQ9LKY9XsD8UGAm8KYvnWrgR2GLPPa/U8naG2jR7ZXp6OjNnzmT58uU19d9X6jFX1+h3p+UiSzti12wqnt+mFsykWd/Y+/fa9UA74H/lFp1eDgwAhgOnKC7fbBFC5APbKC7f1Cm1afbKv/76C51Ox4gRIwDYtWsXt99+Ox999NGVy16KcoGyJ2NdNKlZaUfsVSH64pJsj8dcEkd9Z9d3V0r5K9Ckgl2vlvv8+ZKPOqs2zV55//33c//995d93b9/fxYtWuTsl0Cpp8qejHVRi35najah/noaFxwCq0nV551EzV7pBGr2SqWu+PvY30z4ewI/DP6B9kHta/z+A99dQYtGBr5ouwWWPA2TdkNARI3HUR9cbvZK9WSsE8TExLB582bi4uIYMmSImr1SqbVcWaPPKzSTcsZIp9KOWENI8fKBisOp2SudQM1eqdQVpaUbV9Toz+uI3Z0IEbHwT1+f4kCqRa8obsyVk5rtKu2IbWCCsynQ9KKR14qDqESvKG7MlZOa7UjNITxAT6OsHcUbIlSidxaV6BXFjbly4ZEdqdnFD0qlJoJGB+GdazwGd6ESvaK4MVctPJJlNHEk8xydmzaA40kQ2gk8vGs0BneiEn01uHr2yqSkJMaNG0ejRo3Yt29f2fbs7GzuvPNOevXqRY8ePdi2bZvLYlTqBlfV6LenZgPQuYlP8Yibpj1q9P7uRiX6OsjT05NJkybRsWPH87Y//fTT9O/fn3Xr1vH555/z0EMPuSZApc4om9SshkfdbDuejRAQ43ECLAXQVM3C6kx1bnjljMQZ7Du778oHVkHbhm35v+7/d9ljatPslTExFa++8/vvv/PRRx8BxdM2+Pv7k5ycTHR0tANeJaU+KpvUrKZb9MezadXYgM+pkqmvVEesU9W5RO8K5WevtNlsDBkypGzffffdx9KlS2nZsiWTJk1i0aJFeHl5lc1euXTpUhYsWHDR7JXZ2dmMHz+eLVu20LBhQ+Lj49m6dSubN28um70yLS2Nu+66i3Xr1lUqTovFgrf3P3XOsLAwTp8+rRK9ckmuGHUjpWTb8WxuaB8CxzeCX7h6GtbJ6lyiv1LL2xlq0+yVl+Pt7U1RURFeXl4AnDx5kpCQEIe9Dkr944qlBI+fLSDrnJmYpoGwPrG4bKMelHKqOpfoXaE2zV55OYMHD+bLL7/kscceY+/eveTl5REVFeX4F0SpN0xWE1CzNfqtx7MA6BZkguxj0H1Mjd3bXanO2EoYNGgQnTp1onv37gwZMqTC2Sv79u3Lo48+ioeHR9nslUDZ7JUXKj975bXXXsuLL76Il5cXo0aNIjc3l969e9O7d28unODtcqZPn87vv/9Oz549GTVqFHPmzLnySYpbM9lMeGo8ETXYot5+PAe9h4aWRXuLN6gRN06nZq90AjV7pVJXzEicwaJDi1g/Yn2N3TP+32vRagQ/Rf0OG2fBc6mg86qx+9dXavbKGqZmr1TqCpPVhKe2cqVBRzBbbexKyyUmIhCOJ0JYZ5Xka4Cq0TuBmr1SqStMNhMeGo8au9++9DxMFhtdmuhhyxa45vEau7c7qzMt+tpWYqqr1OuolFfTLfptJU/EdtUdAZsZInvV2L3dmd2JXggxTAixXgixWgjxoxDC54L9E4QQSUKIbUKIKdW5h16vJzMzUyUpO0kpyczMRK/XuzoUpZYw28x4amow0R/LppHBk8ZZJQ9KqY7YGmFX6UYI0RB4BrhWSlkghHgHeAT4qGR/b+AeoHfJKcuFECuklJUfSgJERESQmppKRkaGPeEqFP/SjIhQD6coxWq8RX88i5iIQMSxDRDcFnwa1ti93Zm9i4OfFUL0kVIWlrteQblDBgNfSilNAEKIOcBtQJUSvYeHBy1atLAnVEVRKmCymvDQ1kyNPstoIjnDyJ1Xh8HGROgYXyP3VRxQupFSFgoh9EKIDwFvoPzg7SDgZLmv04HGF15DCDFaCLFJCLFJtdoVpeaUjqOvCaUPSvUJyICiHGjWs0buqzimRh8BLAT+kFI+JmXJ5BnFTnF+Yg8t2XYeKeVsKWU3KWW34OBge0NSFKWSzFZzjZVuthzNRqsRtC3aXbyh2TU1cl/FzkQvhNADXwGjpZRLKjhkMfCAEMJDCKEFHgR+tueeiqI4Tk226DcfzaJDuD+eaSUTmQU2q5H7KvaPo78eaAf8r9wj1MuBAcBwKeUmIcTPwEbACnxf1Y5YRVGcp6Zq9BarjW3Hs7m7WwQcWg+RPdVEZjXI3s7YX4EmFex6tdwxM4GZ9txHURTnqKlRN/tO5lFgttI7uAC2pqn6fA2rMw9MKYrieDVVutl8tLgjtqsoWTRI1edrlEr0iuLGaqozdvPRLEL99TQ4sxm8AqBxe6ffU/mHSvSK4sZqaq6bzUez6BrZAHF0XfFCIzW4opWiEr2iuLWaqNGfyi3kRHYBvcIknNkPzfs49X7KxVSiVxQ3JaUsnuvGyYl+S0l9vpe2ZKGR5tc69X7KxVSiVxQ3ZbaZAZzeGbv5aBaeOg3NcreApwHCYpx6P+ViKtEripsqXS/W2S36zceyiIkIQHtsbfFomxqaW0f5h0r0iuKmTLbiRO/MztgCk5VdJ3LoEy4hYx9E9r7ySYrDqUSvKG6qJlr0W49nYbZKBngfKt6g6vMuoRK9orgps7WkRu/ERJ90OAshoHXBdvDwhfDOTruXcmkq0SuKmyot3TizMzbpyFnahvrjdXydqs+7kEr0iuKmSks3zprUzGy1sfloFv2bABl7obmqz7uKSvSK4qac3aLfnZZLgdnK9b7JxRtUfd5lVKJXFDfl7BZ90uGzALQr2g4ePhB+tVPuo1yZSvSK4qbKOmOd1KLfePgszYN88EnboOrzLqYSvaK4qbLSjRNG3dhskk1HzzKgKXB6jyrbuJi9K0wpilJHlZVunPDA1KGMfLLPmYnzPly8Iaq/w++hVJ5q0SuKm3Jmi35jSX2+Y9FW0Aeo+W1czK4WvRDiLmAYcI2U8qKVfoUQKy7Y9IyUMtGeeyqK4hjOfGAq6fBZQvw88T2xGlr0VfPPu5i9pZsMYCyw6xL7vaSUanFIRamFyqZAcHBnrJSSpCNnualJIeJIKvSe6NDrK1VnV+lGSrlSSnmmon1CCB0QIIT4UQixSggxXQihfq0rSi3hrNLN0cxzpOcUcqPP/uINUdc59PpK1TmzRm8AVgKjgf5AGPBIRQcKIUYLITYJITZlZGQ4MSRFUUo5qzN2fUomAB2LtoB/EwiKduj1lapzWqKXUmZLKR8v+dcGLAC6X+LY2VLKblLKbsHBwc4KSVGUcpzVol+XnEmIwQPftPXFo22EcOj1lapzWqIXQoQKIZ4Xouy7fCOwxVn3UxSlasxWMxqhQadx3ChrKSXrkzO5MyIbUXAWWvRz2LWV6nN4ohdCrBBChAKnKC7fbBFCrAYEMNvR91MUpXpMVpPDO2KTM/I5k19EnL5kfdgolehrA4f8KpdShpb7vH+5Xc+XfCiKUsuYbWaHz3OzLrm4Pt/m3BYIbgt+oVc4Q6kJ6oEpRXFTJpvjW/TrkzNpEaBFn7ZRlW1qEZXoFcVNmawmh3bE2myS9SmZ3B1yAmEpgJYDHXZtxT4q0SuKmzJbzQ5N9PtO5pF9zswA3Q7QekLzPg67tmIflegVxU2ZbCaHjqEvHT/fImcDNOsJnr4Ou7ZiH5XoFcVNObp0sz75DN0anMMjcx+0vN5h11XspxK9orgpR3bGWqw2Nh4+y/CGh4o3qPp8raISvaK4KUfW6HecyCGv0EJPtoFfGDRu75DrKo6hEr2iuCmT1eSwcfRrDp5BJ6yEZW6A6IFq2oNaRiV6RXFTjizdrD6Ywe3Bp9AUZquyTS2kEr2iuClHdcbmFZrZciybO/z2gdCoZQNrIZXoFcVNmW1mh7ToN6ScxWqTdCraBE26gk9DB0SnOJJK9IriphzVol99MIMwDyOGzB3F9Xml1lGJXlHclKMemFp98AwPNz6EkDZoPcgBkSmOphK9orgpR7Toj589x+EzRq7XbQVDCIR1dlB0iiOpRK8obsoR4+jXHDqDDguRWeuhVRxoVEqpjdR3RVHckE3asEiL3Z2xqw9mEGc4jNaUB61vdFB0iqOpRK8obqhsYXA7Hpiy2iRrD2Vyd8Du4tkqo/o7JjjF4VSiVxQ3VLYwuB0t+u2p2eQUmOlalAjNrwUvg6PCUxzMrqUEhRB3AcOAa6SUzSrYPwG4H/AAvpFSzrTnfs5gkzaWHVvG/APzCTeEc22Ta+kR1gMfDx9Xh6YoTlPaorenRv/3vtNEa9Ix5B+Ba8c5KDLFGexdMzYDGAvsunCHEKI3cA/Qu2TTciHECinlJjvv6TBLjyzls+2fcSj7EGG+YWw9vZWfDvyEp8aTBzs8yNjOYzEXmVm4cCHJyclER0cTHx+PXq93deiKYhez1QzYl+iX7zvNA0H7IA9oHeegyBRnsCvRSylXAoiKJzAaDHwppTSVHDMHuA2oFYn+z6N/MmXlFKIDoplx7QwGNR+ETdrYfHoziw4t4vOdn7M6eTXLJy/HlGXCaDTi6+vLuHHjSEhIIDY21tX/BUWpttLSTXXH0Z/KLWR3Wi4DQ7dCcDto0NyB0SmO5swafRBwstzX6UDjig4UQowWQmwSQmzKyMhwYkjFjGYjbyW+RZsGbZg3ZB43R92MVqPFQ+vBNWHX8Na1b/Fy95fZk72H4KeCsYZYkVKSn59PdnY2cXFxFBYWOj1ORXEWe0s3K/afxh8jTXK3QRs12qa2c2aiP8X5iT20ZNtFpJSzpZTdpJTdgoODnRhSsX9t+xcZ5zJ4uefL6DQV/1Fj3momfWY6NpON5lOa49Pqn5q9xWJhwYIFTo9TUZzF3s7Yv/dlcIdhF8JmgdY3OTI0xQmcmegXAw8IITyEEFrgQeBnJ96vUvad3ce3e79laOuhdArudMnjkpOTyT6YzeE3D2PJthA5ObIs2RuNRlJSUmoqZEVxOHtq9CaLjTWHznCX73YwhEKEKmPWdvZ2xl5ECLECGC6l3CSE+BnYCFiB713dEWuTNqavn06gVyATuky47LHR0dH4+vqSn53P4bcO0+LZFkROjuToe0fRpGmIioqq3E2lhNwTkLEfclLBUgSWQkCCbzD4Ngb/MGjUGhy0CISiXIk9pZukI2cxF52jff5GuPoe9TRsHeCQRC+lDC33ef9yn88Eas2QyjUn1rDjzA5e7/M6AV4Blz02Pj6eceOKh4xZciz/JPtJkWR+lkl8fPylTz5zCA4mwMGlyONJCLPxirFZNV6YgjvgGRmLtnUcNO8LOsct3Kwo5dnTGfv3vtNcp9uF1loAbQc7OjTFCRzeoq/N/jr6FwYPAzc1v3JNUa/Xk5CQQFxcHBaLBWOukdOfnCZsUhjNJzfnsPEw7fTt/jnBUgS7FiA3fopI3w7AUU1Tlpv6cFBGkGwL54wuBA+9Lx56bzy0GjwLM9EXnSHQdJIO4jCd0lPodPJLvBNnUaQ1UNhiIP49H0a06KdaTYpD2dOiX77/NNP8d4A1oPhBKaXWc5tEb7FZWHF8BddGXFvpx75jY2NJS0tj4cKFpKSkEBUVRc9BPRnz9xhG/zmaOYPm0MqvGWz8DLnuE4TxNEc1EXxtvp9ltq6ENm9Lv9bB3BDuz4RQf0L8vSocilpksZKSYeTAqTz+PnaKc/uW0z53NXEHlyEOLSbbOxJtj5H49RwFXn6OfmkUN1TdztijmUaOZuTS3S8R2t2o/uqsI9wm0W89vZWsoiyub3Z9lc7z9vZmxIgR5237Iu4LHvrjIUb9fj+fZRXS/sxh1hHDp6ZR5Ib15r6ezZnQLoQGvpX7IfDSaWkX5k+7MH9u69wEhnThZM4TLN19jNMbfqR39mK6rZiKcdW75HcbS8jA8epxc8Uu1e2M/XPPKbpr9qE3Z6uyTR3iNol+2bFleGo86dOkj93XaqYzMMcSyKOF6Yz00RKueYSGkffwZL8oukU2uNQDZFUSGqDnnl6todeLJGdMZM7yP4je8wn9Et8id9On5PaYTMT140DrNt9CxYGqW7pJ2H2Kew3bwaZXi4DXIW5R+JVSsvzYcnqF97J/Dpuj67H+uzdNDqwi9tg1FBHMsRarGB1nI7Z5Q4ck+QtFBxsYefdddP6/P5l39VfstzUlYv3LpL7dnVO7/nb4/ZT6rzqdsWfyi9h0NJPrSCpeMtDT11nhKQ7mFol+z9k9pBvTGRhpRwtESljzPvKrWziRb2Oo5VVaxb3M70O/p6l/BGP+HMPcvXORUjou8AsE+Hhw12130O7ZFfzc+k00hdmEzLudnf+6j8K8LKfdV6l/qtOiX773NFeRjL/pFLRTZZu6xC0S/bKjy9AKLf0j+lfvAjYr8rfJ8Nc0frXEMt7/A2Y8cT8P925BmF8IX9/0NX2a9OHNxDd5Yc0LFFgKHBr/hQx6D4aMGItmfCLLGt5D+9O/kvNeN/asWezU+yr1h9lWXKOvSos+Yc9J7vbZjNR6QpubnRWa4gTukeiPLaNrSFcC9YFVP9lciPXHBxGb/sOnlltZ0+ltvn8ijjah/4x+8ff058MBHzKu8zh+TfmVe369h6STSQ78H1QstFEjBk74jJ03/kQhXrT/6wHWfTKKgnPnnH5vpW6raoveWGRh9cHT3KLZgIgeCN7V+FlSXKbe9+QdzjlMSk4Kd7e5u+onmwuwfDMU3dHVvGq+n+AbJvFWv6gK6/AaoeGxmMe4qtFVvLr+VUYuHcmg5oOY3HUyYYawi44vKChw2PTHnXveQEGnRDZ+/RS9Tv/AgZlbWNn4YU5m5KiplZUKmawmdEKHRlSurbf6YAYdrAcIMJ+CDnc4OTrF0ep9i37TqeJZF65tUsUHO6xmTN/dj+boGqZYxtLprud4vH/0FTtbezfpzeLbFzO281hWHF/BzQtu5snlT7Li+AosNgsASUlJhIeHM2bMGKZOncqYMWMICwsjKan6fwV4+xroMXY2f7Z8mcaWkwxPf50DSUsdcm2l/jHZTFVaRjBh9ynu9NqI1HpBGzWJWV1T71v0ezL34O/pT4RfROVPstkwLXgMz5Q/edk6itsefIprW1V+Vk29Ts/jMY9zW/RtfLfvO35O/pnlx5cT4BVA+wbtWfr1Umwtbch8idc5L0xFJsweZgY/Oph5i+dhtBnJLMwksyDzn38LMsk15ZJvzifflI8NGwKBRmjw9/QnyDuIBp4NSFiegMdJmNE1kC+77KRzk+48M2c9cXFxpKenq5a9AhS36CtbtjFbbSzfe5KpukREyxtA7+/k6BRHq/eJfm/mXtoFtav8sEcpMf/+f3junse71ru57t5nq5Tkyws3hDO522QmdJnAqtRVrDy+kjWH1uB3gx/+gyr+YRm7YmzZ51qhpaG+IUHeQQTpg2jq1xQ/Tz98PX3RCi02acMmbeSacsksyGT/if34XuOLxsuPqcAb5qYMCD7May+359Pv8liwYMFFD38p7slsM1f6qdjEw2dpXbSLADJV2aaOqteJ3mw1cyDrAPe1u6/S51gS5+CxaTb/sdxEu2HTuK5thWulVImHxoOBzQYysNlApi+fzrTXp+EZ4onWR4vGR4PGS4M0S6RZ8tC9DzHhkQkEeQcR4BVQ6RoqwPTp05k6bSoejT3wbu6Nob2Bv2IDMEcUETzZg/+enUu70+3oHNzZKYSDUkIAACAASURBVOP9lbqjKi36X3ekc7vnRqTOG9FaLTJSF9XrRJ+ck4zZZqZ9UPtKHS+PbYA/nuFvawwBt8/g5k7hDo8pOjoaHw8f8o/lX7TPYDBwTZNraNmgZbWv7evjS/7JfEwnTeRsyOHElyfoN6AxfYcYWOp3hAeWPECbBm0YEzOGgc0GVukXiVJ/mKymSg2ttFht/Lkzled0SYjWg9TUG3VUvf4p35O5B4B2Qe2ucCSQd5KCb+4l1RrEjh4zuatbpFNiio+PR6er+PerTqe7/PTH1bm2hJXLTvPnv3KZf6KI5zNyOH32FE+teIq7frmLv47+5dSHvJTayWSrXIt+fUombYq242/NUmWbOqzeJ3qDh4Gmfk0vf6DVTO5/70EW5TGn6euMv9l5K+aUTn8cGBiIwWBACIHBYCAwMJCEhAS7Oksvd+2Pvvmd8PGrGCBDSTi8m7iCXpitFiatmMSohFEcyDrgwP+lUtuZrZWr0f+2I52hHuuQXn7QelANRKY4Q70u3ezN3Evbhm2vWJ7IXfoG/hlbeMPnGZ554A40GufWryua/thRY92vdO2QCcs4OesO3j35PZ/mP4ZX3N3M2fMpQ38ZyvA2w3myy5P2zwek1HqVadGbrTZW7DrCK5qNiPZDwcO7hqJTHK3eJnqLzcL+rP1XfFDKciwR38QPWCz7cu8jEzF41cxLUtH0xzVybS8/Qh//lVNfjuDxtM/48td7+GLUT8w7/B++2/cdK1NX8kqvV+gR1sMpsSm1g8lqQq+7fMNiXXImPYrW4+VZCDHDaygyxRnsKt0IIYYJIRKFEJuFEO9WsH/FBR/d7blfVaTkpFBkLbp8fd5kJG/uKNJlQ7S3vENkkJvMxuehJ2TUj5yJvpOHTd+RNPs57o2eyNc3fY1Oo+ORhEd4bcNrTp+zR3Edk9V0xdLNbzvSGOqxFukfAc161VBkijNUO9ELISKB6cANQDcgQghx5wWHeUkp+5f7SLQj1irZm7kX4LIjbk7Pf4aAguMsjnyRwd3b1lRotYNWR6N7vyCz3X3cb13I+n+PwdsaxU+3/sQD7R/gx/0/MuK3ERzKOuTqSBUnMNvMly3dmCw2Nu/aRy+xExFzt1rKso6z57t3IzBfSpkji4dtzAJuL90phNABAUKIH4UQq4QQ04UQWjvjrbQ9mXvw1nkT6Vfx6Bnj/uU03v8NP3ncygMjKj/Ovl7RaAga9gnZnUYxQv7K9lmPkHyyiKdjn+azGz7jbOFZ7vntHuYfmK9G5tQzV2rRrz10hv7mlWiwQSdVtqnr7En0QcDJcl+nA+WfLjIAK4HRQH8gDHikogsJIUYLITYJITZlZGTYEdI/9p7dS7uG7dBqKvjdYjFhXDCRYzKYNiPexk9f+Tk/6h0hCLzjXXK7juNuEtj1xaPsOJ5Fr/BezB8yn5jGMUxbP41X1r9CTn4Oc+fOZfr06cydO5fCwkJXR69U05Xmulmw9QRDPdZiC7saglvXYGSKM9iT6E9xfmIPLdkGgJQyW0r5eMm/NmABUGGNXko5W0rZTUrZLTi4etMNlGe1Wdl3dt8l6/PHf3+HxkVHWdvqWTpHXTyzpNsRAv/Br5PbZSzDSWDnfx5j69GzNPJuxKzrZ/HoVY8y/+B8YmfGMvbpsQ6biE1xHbP10qWbvEIzh3cn0ZYjaFQnbL1gT6L/HbhDCFE6MftIoGzlCyFEqBDiefHPs/Y3AlvsuF+lHc09SoGlgHYNL070hWeOELzlA1ZqenDbsIdqIpy6QQj8b32D/KvHcC9/sGvOOLYdy0Kr0fJou0fJ/DITj3APQp8OxauZF/n5+WRnZxMXF6da9nWQyXbp0s2SXSe5neXYNB7Q8cJuN6Uuqnail1KmA28Aq4QQG4FTUsr5JaNrSlv3BmCLEGI1IIDZjgj6SvaeLe6IrahFnzp3PDYp0N/6Dj6e9XZ0afUIgWHIDIxXP8r94nc2zZnIrhM5LFy4kLzNeSRPT0ZaJS2ea4GhU/Gj8BaLhQULFrg4cKWqLtei/2XzYYbq1iDa3gwG+//CVlzPrkwnpfwW+PaCbf3Lffl8yUeNOpp7FIGguX/z87anbfqZlmdX8UvIGG69Oqamw6obhMB3yDvkmwt5ZNf/+OQLPcm0wmg0IvMlKdNTiJwUSeSTkaT9N43sVdmkpKS4Omqliky2iue6ScsuIODYnwR45EGXB1wQmeIM9XLM1PG844T6hp7XYpFWC5alL3OcEHrd+5ILo6sDhMAQ/xHGNnfyhPyexpbD+Ee0AsCSY+Hwm4fJ35VPk4ebEH5nOC1atHBxwEpVWGwWbNJWYYt+0bYTDNP8jcWvCURd54LoFGeot4n+woVG9iV8QTPzYQ52fIqgAL9LnKmU0WjwHTYbY/QtPKf9hkeHDUAXEAKArcjG0Q+PkrUmiwaDG3A8+rgaflmHXGq9WCkl6zdtpq92J7quD0BFI9aUOqneJvryE5mZC40EJb7NPk1L+txW4QhPpSJaHb73fIWxaT/e8v2OUQ/fjX9I0+LJ0nwMGOcbGdhgIN/u/5ZX1r+C1WZ1dcRKJZhtZoCLOmN3ncilW/YSJAI63+uK0BQnqXe9kUazkbOFZ89L9NvmzSBWZpLa/308Perdf9m5dJ743v8dxi9u5WP+h3bMZAJ1WjpENyM+Ph4vLy8+3voxn+/8HIvNwqu9X1Vz3Ndyl2rRz9t0hMe1K7G0GIBH4BVmfFXqlHr3E5malwpQVrrJPnOKNoc+Z5u+O1f3HeLK0OouT198H56PqWEr3uFDCn0bcWv8UPR6PUIIJnSZwNiYsSxOXsyr61/FJm2ujli5DJOtONGX74wtMFnJ2PY7oeIsHrEPuSgyxVnqbaIvbdHvnv86BllAwK2vq+Xz7OHdAN+RP4NfCC/mTGXafxZSaP6nVPNYzGNlD1a9sfENVbOvxSpq0f++M52h1iWYvINBLRdY79S7RH887zhQnOgzTp8kJu1Hdvj3pUWHGps4s/7yC8Fn5M946/VMPv1/vPy/pVisxa13IQTjrx7Pwx0f5of9P/De5vdcHKxyKRUl+hXrN3Cddjse3UeCrnJrySp1R71M9AFeAfh7+rNzwdsYRAGNb3nR1WHVHw1boH94EY08TIw+MpnXflpT1noXQjCpyySGtxnOV7u/4uvdX7s4WKUiF3bGHjqdR8zJeViFDtFtpCtDU5ykXib6poampJ06TZf079nj34fwtqo171ChV+F53480155hyJ5JvP/7trJdQgie7f4sg5oPYuammfyS/IsLA1UqUtqiL53UbP76/QzTrsTc+lbwC3VlaIqT1M9E79eUHQtnEiiMBKvWvHM074126H/orEkhZsMk5qz6Z81ZrUbLG33eoEdoD15e+zLrTqxzYaDKhUo7Yz01nhRZrJi3/YC/OIe+92MujkxxlnqV6M02M+nGdPw1DYlNn8tB/2sIbtPT1WHVW6L9ELjlXQZqt2JImMLirall+zy1nnxw3QdEB0YzeeVkUrLVNAm1RfkafcKuk9xlXUJeg3bQVC0fWV/Vq0R/Mv8kVmnFvH8PQSKPoJtVa97ZNLEjsVz7DMN0Kzmx4AVWH/xnPQGDp4GPB3yMl9aLJ5Y/QXZhtgsjVUqZrSU1eq0nm1b9SlvNcXz7jAU1Kq3eqleJ/nh+8YibHhkbOOrbiYZtr3VxRO5BN+B5TJ0fYKx2ESv+9wY7U3PK9oUZwvhwwIecMp5i0opJZUlGcZ3S0s3RM0X0yfiBQo9ANFfd5eKoFGeqV4m+dAx9F8sZfPqOd3E0bkQIPG99n8LoQbyg+ZL/zvmIo5nGst0xwTG80vsVNp3axIykGS4MVIF/SjdrN27hBu1miH0EPH1cHJXiTPUq0R86ewSdDbSaYIJj1YIJNUqrQ3/3V5hCu/Ca7UNmfv4lZ/KLynYPjhrMwx2Kx9irkTiuVdqij0yZj1l4ou/9uIsjUpytXiX6LYc308xixtp1tJp5zxU8fdA/MA8Z0JTXCt5g6hfzMRZZynZP6DKBriFdeXX9qxzMOujCQN1baYt+MBsxth8Ovo1cHJHibPUm0ReareQaDxJukYT2f9TV4bgvn4boH1qE3tuHF7Je5IWvl2IueXpWp9HxTt938PXw5akVT5FvyndxsO6noKCADZsSAfDGgnefsS6OSKkJ9SLRFxQU8Nq//kO2rgg9jSlEPcLtUg0i8XpwAcEehTyW+n9M+3Fd2dOzwT7BvNPvHY7nHefV9a+qOXFqUFJSEuHh4fyxdgMAf6b6Edq+l1rg3Q3YleiFEMOEEIlCiM1CiHcr2D9BCJEkhNgmhJhiz70upfTN67nxdQo0Gv5clkxYWJh687paWCc8RsyllTadW/dO4f0/dpTtig2NZWznsSw5soRfU351YZDuo6CggLi4OLKzs+kc6Q3Am0vS1QLvbqLaiV4IEQlMB24AugERQog7y+3vDdwD9Aa6A7cLIbrZF+75yr95P9xaPH776ME89eatLaL6o7njM67R7KXNuin8d21y2a5RHUfRpXEXXt/4etlEdIrzLFy4EIvFQoOoq+jsk4bOJtl8orj/RC3wXv/Z06K/EZgvpcyRxX9/zwJuL7d/MPCllNIkpTQBc4Db7LjfRUrfvADWhsXlGlNGcUeTevPWDqLTUKw3vMYt2kTkH8+yZEcaUDxNwpvXvokGDc+tfg6LzXKFKyn2SE5Oxmg08kRcFEKYsBb9s2aA0WhUC7zXc/Yk+iDgZLmv04HGVdhfRggxWgixSQixKSMjo6JDKlT65gXwaOiBtEnMGcUP5Kg3b+2h7T0ec49xPKhNYM9Pr7AhJROAcEM4L/V8ie0Z2/n3ln8zd+5cpk+fzty5c9VfYw4WHR1NSMsOjG+8hWSzniLjP2sJ+Pr6EhUV5cLoFGezJ9Gf4vzEHVqyrbL7y0gpZ0spu0kpuwUHB1c6gOjoaHx9fQE489sZ9o7bi7QUd+6pN2/t4jHoNUzt7mSy9nt+++877DuZC8BNLW7imoBrmL1jNuNfHc/UqVMZM2aM6mdxsPj4eB4b0JxgkcPWDBO2gn9a9Dqdjvj4eBdGpzibPYn+d+AOIYRfydcjgcXl9i8GHhBCeAghtMCDwM923O8i8fHx6HT/rAGr3ry1mEaD552fUdisP1OZxewv/k1q1jkKCgqYP24+lnwLDUY0QGok+fn5qp/FwU5k5jEuZBurshuTKzTYCm0YDAYCAwNJSEhAr9e7OkTFiaqd6KWU6cAbwCohxEbglJRyvhBihRAiVEq5ieLEvhHYAPxSss1h9Ho9CQkJBAYGYjAYEEKoN29tpvNEf++3mIM78rrlXWZ8/jXf/LQIc66ZtK/T8I70Jvjmf/6iU/0sjrPr5/doJHJpN/JfRLWLIioiilmzZpGenk5sbKyrw1OcTHflQy5NSvkt8O0F2/qX+3wmMNOee1xJbGwsaWlpLFy4kJSUFKKiooiPj1dJvrbyMuD94AIKZl3P9NzpPLb/ac6ZLNi2FJK9IZvg24LJ3ZpLUWqR6mdxkJTjqfQ9+V9SAroT1SkOfcontGrWihH9R7g6NKWG2JXoawtvb29GjFBv2jrDEIz3yJ8Rs67ng4IPSRk2nqS575H+TTqG9gaajGxCyvQU1c/iIMkLXmUgRjS3vwWA0WTE4GlwcVRKTaoXT8YqdVCDSPQPL6aBh5UfWiyizZAxWPNtpH+bjk+UDw0HNFT9LA6wf99u+p5dwN7GNxEQ1RWAfHM+vh6+Lo5MqUkq0SuuE9Ierwfm0USbxfyrVtNy8CPkJuZSsLeA0KGh/PDbD6oEZ6fMX15GCmh615sA2KSNc5ZzKtG7GZXoFddq1gOPEXNpqz3B3Ku3MuzFT5h41UT0PnqWmpa6Oro6bc/m1fQy/sXupvfiH9IcgHPmcwAYPFTpxp2oRK+4nGh1A5o7v6Cr5hCPy+/wbxbH6E6jSTiawOrU1a4Or06SNhty6XNk40e7oVPLtuebi2cMVS1696ISvVIriI53IAd/QD/tDholjCOwcAAtAlrw+sbXKbSosfRVtX3JF3Qw7WR/h4n4+Dcs2240Fz9Jrlr07kUleqXW0HZ7EPP107lZm4jnrxO5IXgMJ/JP8OXuL10dWp1SmHeWpkmvs0/bmm53TDxvX2mL3sdDLR3oTlSiV2oVjz4TMPV9jju0awhe+gWdG/blPzv/w4n8E64Orc7Y/92zNJA5FA16G63u/BHUqkXvnlSiV2odzwHPUthzEsM1y+mxNR0pBTOTnPrcXb2ReSiJjid+ZFXAEGK6X3fR/tJEr2r07kUleqVW0sdNpaDb4zxhW0aPDH/+OvYX69LWuTqs2s1qIX/eE2ThT/TwGRUeUrp8o3pgyr2oRK/UTkLgfcubnOsymg9yNxFo9mTa2tcx28yujqzWOvzz60QW7mNDm2doGh5W4TFlLXqdatG7E5XoldpLCHxufRvz1Y/yWmYq6eeOMXOd6pityLnj24nY/hErdL25fujjlzxOlW7ck0r0Su0mBL5D3qFr63vpfa6ABQf+xYqDyVc+rw7IKcrBarNe+cArsZjImTuKbOlDwF0foffQXvJQo9mIl9YLD62H/fdV6gyV6JXaTwgMt7/LuLCbMGusfL3kAZJSKr8SWW1zznyOl9a+RJ/v+xD7bSy3LbqNKSuncNJ48sonVyD91+mEFRzkzxbPcXXblpc9Vs1z455UolfqBiG46raPiPdpxRb/HLZ9dw/rDqS7Oqoq23VmF0N/GcriQ4u5t9293N/+floEtGB16momLJ9Q5YfDig6soPG2T1ii6cetwx+94vEq0bsnleiVukMInrztKwwaLzYEHaXom+Es33HE1VFV2t/H/ub+3++nyFrEnEFzeLb7s0zqOokPrvuAt/u+zb6z+3hl/StIKSt3wbxTmH58mCO2EALu+hA//ZXLMefM59QYejekEr1SpwR4BfBE9ykkeuuxGA4QMG8oS5L2uDqsKzqed5wX1rxAm4ZtmD9kPt1Cu523v1/TfozrPI5fU37lm73fXPmCNiuZ/70PnTmfv2PeoVf7FpWKQ7Xo3VO1E70o9qYQYqMQYpsQ4t4KjtEJIc6ULC9Y+uFpX8iKuxvaeigtA1vybtNWtNUcpsUvw/hp+QZXh3VJRdYiJq+YjBCCd/u/S4BXQIXHPdrpUQY2G8i7m95lZ8bOy14z949XCcpIZLbfWB647ZZKx2I0G1WL3g3Z06IfAbQCrgH6Ai8IIS4cvNsUSJBS9i/3YbLjnoqCTqPj6dinOWHKYm6/MTTTnuXalcP5av7PlS971KAZiTPYe3Yvb/R5gyaGJpc8TiM0vN7ndXw9fPnfnv9d8jjLth/xT/yABfI6bn/4GTx1lf8xNpqNap4bN2RPoh8MzJbFcoF5wM0XHNMcaCyEWCKEWC2EGG7H/RSlTK/wXvSP6M9/0peR98CP6D09uGvHo3wxZxYmi83V4ZVZemQpPx34iZEdR9Kvab8rHu/r4cuQ6CH8eexPPv/2c6ZPn87cuXMpLCzupJVH1sLisWy0tcXztg+IDKpaGUa16N3TFRO9EGLABaWXFUKIFUAQUH48WDrQ+ILTzwErKP6lMBh4WgjR3iGRK25vSuwUiqxF/Dv9TwLGr8RoaM7IY8/y/UfPkm0scnV45JnyeCvxLToEdWD81eMrfV5bU1ssNgvT5k1j6tSpjBkzhrCwMHb8vZCib+7hqLURSd0/ZnCX5lWOKd+Uj6+nqtG7mysmeinl8gtKL/2llP2BU5yf2ENLtpU/d6OU8jUppVVKmQMsA7peeA8hxGghxCYhxKaMjLo7PlqpWZH+kdzb9l4WHlzIHlMWIROWcTJ8IA/kziLx/WEcTnfte+mTrZ+QWZDJSz1fQqfRXfkEoKCggIdufQjjPiOGXgYkkvz8fLwtOfj9Nhqj2cac5m8z9ubYKsdjtpox2UyqRe+G7CndLAZGAQghfIB4YEn5A4QQvUvLNUIIL6A/sPXCC0kpZ0spu0kpuwUHB9sRkuJuxsSMoaG+IW8kvoHN04cmj/5E6tWTiLOswDhrEBu2XPR2qxF7Mvfw/f7vubvN3XQI6lDp8xYuXIjFYuHs32fxbOyJob2BMINgxahAgn0Fz4ineOG+m9FoRJVjUtMfuC97Ev18IE0IsQlYCbwlpUwXQnQWQnxfcsxeIF4IkURxCWe2lHKXXRErSjl+nn5M7DqRHRk7+CX5F9BoiLhtGhmDv6IF6bRbfDO//fA5NlvNddJabVamr59OA68GjO9S+ZINQHJyMkajkdzNuVhyLYTd0JC/RwYQHqDj3rOjaawx4+NZub8OLqSWEXRf1U70JZ2wk0ta4rFSym9Ltm+TUg4v+fyslHJYyf6eUsovHBW4opQaEj2ETsGdeH/z++SZ8gAI7nYH2sdXk+MdwS17p7Ds/ZFk5+bVSDzzD85nV+YupsROwd/Tv0rnRkdH4+vri7RIrInZeMf44RXkxX3ZY1gxfy5XtWxa7bjUoiPuSz0wpdR5GqHh+e7Pc7bwLJ9t/6xsuz6kJU0nr2ZvsxHckLeAzPd7sSNxpVNjySnK4aOtH9EtpBu3tKj8+PZS8fHx6HQ6YsM1/NDMhE0IHtJex2//m4OmIIv4+Phqx6Za9O5LJXqlXujQqAPxreKZu3cuh7IOlW0XHnrajfyUI4O+IoA82v12B2s+n4ypyDkLjv9r27/IM+XxbPdnEaLqdXS9Xk/S1y+ycqQfQdpAtOcCOVG0A4M8R0JCAnq9vtqxqRq9+1KJXqk3nuzyJAZPA6+sfwWbPH8sffOed+AzMYldDQbS58QXpM/oxoENvzn0/geyDvDD/h8Y2noobRq2qfoFLEWw9AVabnmVvaIlozWvEGkJwzfag8PHDxMbW/WRNuWp0o37UoleqTca6BswpdsUtmVsY96BeRft9wkI5uqJP7G97yx0NhOt/xjBzg/vJP/0EbvvLaVkRuIM/Dz9eKLzE1W/wOl92GYPgPWf8LXlBj5p9j4/PXs3z8Q/iRUru3LsH8OgSjfuq3rd94pSSw2JHsIvyb/w/ub36d+0P419LnyGD2IGDCe/+y38/c1UeqX/F/HvruyLHEbL+KnoAkIrfa+CggIWLlxIcnIy5hZmEq2JvNjjRQL1gZUP2HQO1n6Ibc375Nj0TDFPoVWfocyKa42HVkPXkK54ajxZe2ItfZr0qfx1K2A0lbTo1Xqxbke16JV6RQjBSz1fwmQ18VbiW5c8zmDw47rH3iN5+EpWew+k5ZHvsbzfiSPfTsCWefiK90lKSiI8PJwxY8bwypuv8FPmT5hOmGie27xygdpssHMetk+6wcq3+MN8NSO07zLy4cd59qa2eGiLfzT1Oj1dQ7qyPm195a57GUZLcaL31nnbfS2lblGJXql3Iv0jeSzmMf48+id/Hv3zsse2b9eBAc/8wLobf2O19hqaHPgG+XEXTnwWj2V/AlgvXoy8oKCAuLg4srOzyc/Pp/GdjdH6azn+xXFuHHRj2bw0FTIZIekL5L9iYf4oDuR6MqzoJf7sMINvJg6hd8tGF53SK7wXyTnJ1V6BqlS+qXiKYo1QP/buRpVulHrpoY4PsfzYcqatm0YrQyvWLV1HcnIy0dHRxMfHnzd6RQhB3569sHRfxLLEbZxd8W8GpS9B990yzukCMbe5lYDOt0OzHuDlV/b0KoB3tDcNBzQk869MCg4XoDVoWbBgASNGjPgnGHMhHF4F+37FtudnNIVZ7BMt+dT0BKnhg3hxyFV0adbgkv+XnuE9YTOsT1vPHa3uqPZrYjQbVX3eTalEr9RLHhoP3ur7FncuupMb3ruBkx+fxJhvxNfXl3HjxpGQkHDRKBadVsOgnl2Q13zOyj3H2bVqIc3TljBw1w+w+3/Y0HKu0VVEnxE83N7EviwtaSObIHMsyD8yaOwraORdgDl5FezQQfp2OLkDmboZYTZSoPFhubUzX5quR9OsJyOvbUFc+9ArTmfQukFrGnk3Yl3aOrsSfb45X424cVMq0Sv1VmOPxqTPTafhPQ3R99GTvySf/PzikSdxcXGkp6dXOC5dCEH/Ds3o3+FJMvIe47tNhzixcwUNMxLpfnoP7cUxPrpJz6xAfz5poOeTkxn0H1+upWz9DhZ8h1l4kCwiSTL3ZJm1Cwd8utCvYwTTejSjY5OKFx+piBCCXuG9WJm6EqvNilajrdbrcc58TrXo3ZRK9Eq9tXDhQnLX5qJtqSXkzhCMB4wUJBcAYLFYLi6xVCDYz4uR13WA6zqQWziatQfP8OHhM/z018fYmq8nODeCX3Ju5i9RPC1yjvQlCz/OEIi1QUuiQgNpHxbApDbBXNUkoFqTkUFx+ebn5J/Zd3YfHRpVfpK08tQygu5LJXql3iqdIKzgqwL0zfREPhlJyvQUTBkmjEYjKSkpVbqev96Dm64Ko1u0jiW5u8lMM7Np5gZWnduAb4PG6Dz1fPXFZ1zTrQv+3jq8dNVreVekZ1hPANanr692ojeajQR7q9lh3ZFK9Eq9VTpBWH5+PkffO0rUS1FETo4k5bUUvPEmKiqqytc028xMWTkFszAz74F57IjYQUpKClFRURd18jpSkHcQUQFRbD1d/WmXVYvefalEr9Rb8fHxjBs3DgDTKRPHPjhG8/9rTrMnm5E1u+oThNmkjRmJM9hyegtvXfsWHUM70nFER2eEXqGY4BiWH1+OlLJa8+ioUTfuSw2oVeotvV5PQkICgYGBGAwGCpILOPPfM/i28qXvJ33Js1V+2mKzzcxLa1/ih/0/8FCHh7glquozU9orJjiGnKIcjuQeqfK5UkqV6N2YatEr9VpsbCxpaWksXLiwrMQS2D2QaRunMfzX4Xw44EM6Nrp8q7zAUsCUlVNYlbqKcZ3HMabTmBqK/nydG3cGYHvGdloEtKjSuQWWAmzSpqY/cFMq0Sv1nre390Wja6IbRvPk30/y4JIHeajjQwxrPYwQ35DzjrHYLCQcSWD2jtkce/NgEwAABeZJREFUzj3MS9e8xLA2w2oy9PO0CGiBn6cf2zO2c3vL26t0rpq50r2pRK+4pTYN2/DdLd/x6vpX+XzH58zZOYeBkQNp3aA1VmnFZDWx5PASTuSfICogio8HfEzfiL4ujVkjNHRq1Iltp7dV+dzSRO/j4ePosJQ6oNqJvmSx7zHAXcAJKeU9FRzjCXwKtAP0wDNSyr+qe09FcaQG+ga8f937HM87zo/7f2TBwQUsPbK0bH9McAz/F/t/9Gvar9bMDxMTHMOn2z8lz5SHn6dfpc9TLXr3Zk+L3gLsA94EHrzEMU8D2VLKXkKIJsAKIURHKWWRHfdVFIdq6teUyd0mM7HLRGzShkZo0AhNtUa2OFtM4xgkkp1ndtIrvFelz1Nz0bs3exYHt0opE4CCyxw2GJhVcvwJYD1g36TaiuIkWo0WD60HWs3/t3d/oVnVcRzH35+UOVNnf7YSmtOQwot8HqsFRSUpRV0IFUIJ0Y2JCN1KVJRQEV1EoBFCu4jqKsrICiosbCQSRWEb1k1JNiPJSfVsKjnJbxfPM126fB6de35n53xeVzvPztn5PL+LD4fzO2e/aZkseYBSewkh+gb7zuk4F32x1b2il7QC2DjOr1ZHRL3/m3o5MHafA8AZK0FIWgesA+jq6qoXyaywZrfMZtEli+g7eG5Ff/T40erxvnVTSHWLPiJ2ADvO8+//TrXYh2rb82qfnX6OHqAHoLu7O87zXGaFUO4os33f9pO3mRrhK/pim+wZpveBtQCSrgRuBnZN8jnNcm3pFUsZPj7Mz5X6K2GNOjkZ6+foC+mCF72kpZLeqm2+DFwl6SvgQ+BRT8SaTUy5owxwTo9ZHh45zHRNp+WilsmKZRk24efoI6IX6B2z/R2wuvbzCPDwRM9hZqcsbFvI3Blz6RvsY9W1qxo65sjxI8xqmZXZSWabXNl4ONjMGiaJUnuJ/sH+ho+pHKvQ1tI2iaksy1z0ZlNQuaPM3spehkaG6u8M7B/eT+fszklOZVnlojebgkodJQD2DO5paP+B4QG62vzoclG56M2moCXtSxp+capyrMLQyBDz58xvQjLLIhe92RR08sWpQ/WLfmBoAICuOb6iLyoXvdkUVe4o0z/Yz4k4cdb9BoarRe8r+uJSRLZeRJU0CPxynoe3A4cuYJypqOhjUPTvDx4DKOYYLIiIcVd/z1zRT4SkbyKiO3WOlIo+BkX//uAxAI/B6Xzrxsws51z0ZmY5l7ei70kdIAOKPgZF//7gMQCPwX/k6h69mZmdKW9X9GZmdprcFL2kByR9LelbSS+lztNste//paSdkt6WdHHqTKlIelpSb+ocKUiaL+kDSZ9L+lTSDakzNZOkJ2s9sEvSO5IaX0E9x3JR9JIWAM8BdwHdQKekxv5/aw5Iugx4DFgREbdTfQ9hbdpUaUjqBq5OnSOhHuCpiFgOPAjsT5ynaSQtAe4FbomIW4FfgfVpU2VDLooeuAd4NyIqUZ10eBW4L3GmpomIP4DbImJ0ofbpnH3R9lySNBPYBDyeOksKkuYBrcAaSV8AzwNH0qZqqkPAMU6tszENaHx1lhzLS9E3tAh5nkXE35JaJW0GZgKvpc6UwIvApog4mDpIIl3A9cAbEbEM+A3YmDZS80TEAeAVYIukJ4A/gc/SpsqGvBT96CLko8ZdhDzPJHUC7wGfRMT6iPgndaZmknQ3cGlEbE2dJaG/gB8iYndteytwU8I8TSVpObAsIh6JiBeA74FnEsfKhLwU/UfA/WMmXtZQXZi8ECS1Aq8D6yLi48RxUlkJdEjaJmkbcJ2kN1OHarKfgFZJi2vbdwK7z7J/3iwGZozZbgGuSZQlU3LzHL2kh4ANwAiwMyI2JI7UNJJWUp2X+HHMxzsi4tlEkZKT1BsRd6TO0WySSsBmqvepDwJrIqKSNlVzSJoFbAFuBCpU56nWRsS+lLmyIDdFb2Zm48vLrRszM/sfLnozs5xz0ZuZ5ZyL3sws51z0ZmY556I3M8s5F72ZWc656M3Mcu5f/5pCRLgsbEQAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# 高次のべき多項式による近似\n", "plt.plot(x_tr, y , 'ok', ms=7) # データの描画\n", "for deg in [3,4, 10]: # 複数の次数で近似\n", " lrp.fit(np.vander(x_tr, deg +1), y)\n", " y_lrp = lrp.predict(np.vander(x_lrp, deg+1))\n", " plt.plot(x_lrp, y_lrp,\n", " label='degree ' + str(deg))\n", " plt.legend(loc=2)\n", " plt.ylim(-1.2, 3.0)\n", " # モデルの係数表示\n", " #print(' '. join(['%.2f' % c for c in lrp.coef_]))\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "自然科学では、対象となる系のふるまいの裏にはあるシンプルな原理が存在していると考える。今の場合、その原理に基づけば系は$\\sin x$のようにふるまうと想定されるとする。\n", "\n", "自然科学の場合は、その原理に基づいて$\\sin x$に振幅、位相を未定係数としておいて、その係数をデータから推定することを行う。\n", "\n", "一方、原理がまったくわからない、あるいは、背後にある要素・要因が複雑で本質的に単純な原理で説明できないような対象の場合はどうであろうか。**適用範囲を適切に設定すれば**、べき関数であっても十分近似でき「予測」には有用であるといえる。\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 補足 (過学習について)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# もっと高次に\n", "plt.plot(x_tr, y , 'ok', ms=7) # データの描画\n", "for deg in [8,n_tr-1]: # 複数の次数で近似\n", " lrp.fit(np.vander(x_tr, deg +1), y)\n", " y_lrp = lrp.predict(np.vander(x_lrp, deg+1))\n", " plt.plot(x_lrp, y_lrp,\n", " label='degree ' + str(deg))\n", " plt.legend()\n", " plt.ylim(-1.2, 1.2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "べき関数の次数をデータの数と同じにすれば、原理的には全部のデータ点を通るようにフィッティングできる。が、それでよいか?\n", "\n", "このようなフィッティングを「過学習」と呼ぶ。\n", "\n", "過学習を防ぐために、高次の項を不必要に重視しないよう重みをつけたり次数を削減したりする方法が考えられている。Ridge回帰、Lasso回帰について次回学習する。\n", "\n", "[関数フィッティングその2](function_fitting2.html)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 演習課題1\n", "\n", "- データを$\\sin x$にノイズを加えたものから、別のもの($\\sin$以外の関数など)に変えて、フィッティングを試してみなさい。\n", "- データの個数やフィッティング関数のべきを変えて試し、考察しなさい。\n", "- (補足)本来パラメータの数とフィッティング関数のべきとが同じになるとフィッティング関数はデータ点上を通るはずであるが、上記の例では少しずれている。その原因を考察してみよう。\n", "\n", "各自の経験に応じてでよいので、Jupyter Notebookで行ったことを記録し、html形式あるいはPDF形式にしてmoodleのページへ提出してください。\n", "\n", "初めての人は、次のようなことをレポートしてもよい。\n", "\n", "- markdown書式の練習\n", " - 数式の書法(LaTeXの数式文法)など\n", "- 上記のプログラム例に即したpythonの基本文法学習(プログラムソースの読み解き)\n", " - pythonの変数、配列(リスト)、numpyの変数(データ構造)、関数定義\n", " - scikit-learnのlinear_modelについて など\n", "- 関数フィッティングについての学習\n", "\n", "など\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 補足:linear_modelへのデータの与え方(計画行列)\n", "\n", "上でデータをmodelにあたえるときvanderという関数を使った。\n", "\n", "中身を見ればわかるが、あるデータ値$x$に対して、べき関数フィッティングの場合、$x$, $x^2$, $\\cdots$, $x^M$の値を横に並べ、各データを1行として、$N$個のデータを行として並べたものを与える。\n", "\n", "\n", "このような行列を一般に、機械学習では計画行列(design matrix)とよぶ。\n", "\n", "$$\n", " y(x, {\\bf w}) = w_1 \\phi_1(x) + w_2 \\phi_2(x) + \\cdots + w_M \\phi_M(x)\n", "$$\n", "のように$\\phi_1(x)$~$\\phi_M(x)$を用意して、その線形結合で目的変数を説明したいとき、\n", "データが$\\{x_1, x_2, \\cdots, x_N\\}$に対して計画行列は\n", "\n", "$$\n", "\\Phi = \\left(\n", "\\begin{array}{cccc}\n", " \\phi_1(x_1) & \\phi_2(x_1) & \\cdots & \\phi_M (x_1) \\\\\n", " \\phi_1(x_2) & \\phi_2(x_2) & \\cdots & \\phi_M (x_2) \\\\\n", " \\vdots & \\vdots & & \\vdots \\\\\n", " \\phi_1(x_N) & \\phi_2(x_N) & \\cdots & \\phi_M (x_N) \n", "\\end{array}\n", "\\right)\n", "$$\n", "\n", "と定義される。\n", "\n", "numpy.vander()はデータリストを与えると、これを一気に作ってくれる。(もちろんべきの基底の時のみだが。)" ] }, { "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.10" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": true, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 4 }