From 0364982de64a60eeb9363eedde005f83f742b483 Mon Sep 17 00:00:00 2001 From: nahoando Date: Fri, 16 Apr 2021 19:34:02 +0900 Subject: [PATCH] add Linear Regression training --- .../Linear_Regression_training_ando.ipynb | 341 ++++++++++++++++++ 1 file changed, 341 insertions(+) create mode 100644 LinearRegression/Linear_Regression_training_ando.ipynb diff --git a/LinearRegression/Linear_Regression_training_ando.ipynb b/LinearRegression/Linear_Regression_training_ando.ipynb new file mode 100644 index 0000000..98732c8 --- /dev/null +++ b/LinearRegression/Linear_Regression_training_ando.ipynb @@ -0,0 +1,341 @@ +{ + "nbformat": 4, + "nbformat_minor": 5, + "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.5" + }, + "colab": { + "name": "Linear_Regression_training_ando.ipynb", + "provenance": [], + "collapsed_sections": [] + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "nXgQ49RjsHtl" + }, + "source": [ + "## 使うライブラリをインポートして,乱数のseedを固定" + ], + "id": "nXgQ49RjsHtl" + }, + { + "cell_type": "code", + "metadata": { + "scrolled": true, + "id": "KKTyPqX_sHtp" + }, + "source": [ + "%matplotlib inline\n", + "\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "\n", + "seed = 11\n", + "np.random.seed(seed)" + ], + "id": "KKTyPqX_sHtp", + "execution_count": 1, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "0FHGIUFVsHtq" + }, + "source": [ + "### フィッティングしたいデータセット$\\mathcal{D}$を生成\n", + "$$\\mathcal{D} = \\{ (x_1,y_1),(x_2,y_2), \\cdots , (x_N, y_N)\\}$$" + ], + "id": "0FHGIUFVsHtq" + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 350 + }, + "id": "vh2Ib7GWsHtq", + "outputId": "40e767cc-0080-498a-afa4-4132a281a857" + }, + "source": [ + "N = 30\n", + "x = 20 * (np.random.rand(N)) - 10\n", + "y = np.sin(x) + x + np.random.normal(x, 5, N)\n", + "\n", + "# 2次元 * N個の観測データ\n", + "D = np.concatenate([x[:, np.newaxis], y[:, np.newaxis]], axis=1)\n", + "print(D[:5])\n", + "\n", + "plt.scatter(x,y)\n", + "plt.show()" + ], + "id": "vh2Ib7GWsHtq", + "execution_count": 4, + "outputs": [ + { + "output_type": "stream", + "text": [ + "[[-0.05007295 8.14582518]\n", + " [ 2.97444397 8.00846281]\n", + " [-1.04457679 -5.27669595]\n", + " [ 1.01278942 3.64309719]\n", + " [ 9.42350407 22.67908514]]\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Y8IG3okpsHtr" + }, + "source": [ + "## モデルのパラメータ$\\boldsymbol{a}$を推定する準備(変数をおく)\n", + "$$ \\boldsymbol{x}_i = \\begin{pmatrix}\n", + " 1\\\\\n", + " x_i\n", + " \\end{pmatrix}\n", + "$$\n", + "\n", + "$$ \\boldsymbol{X} = \\begin{pmatrix}\n", + " \\boldsymbol{x_1}^T\\\\\n", + " \\boldsymbol{x_2}^T\\\\\n", + " \\vdots \\\\\n", + " \\boldsymbol{x_N}^T\n", + " \\end{pmatrix}\n", + "$$\n", + "\n", + "$$\\boldsymbol{y} = \\begin{pmatrix}\n", + " y_1\\\\\n", + " y_2\\\\\n", + " \\vdots \\\\\n", + " y_N\n", + " \\end{pmatrix}\n", + "$$" + ], + "id": "Y8IG3okpsHtr" + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "YqPypMuEsHts", + "outputId": "5de5f7c9-4167-4b07-d9db-3ce2f1d3b9cc" + }, + "source": [ + "#detaset D で用いた変数を使って,欲しい行列・ベクトルを新しく定義する\n", + "# x(shape: (2, N)...これは(1,x_i)を並べた行列)\n", + "one = np.ones(N)\n", + "print(one)\n", + "print(one.shape)\n", + "print((one[:,np.newaxis].shape))\n", + "X = np.concatenate([one[:,np.newaxis],x[:,np.newaxis]],axis=1)\n", + "print(X[0:5])\n", + "# y(shape: (N,1))になるようにshapeを整える)\n", + "y_reshaped = y " + ], + "id": "YqPypMuEsHts", + "execution_count": 13, + "outputs": [ + { + "output_type": "stream", + "text": [ + "[1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.\n", + " 1. 1. 1. 1. 1. 1.]\n", + "(30,)\n", + "(30, 1)\n", + "[[ 1. -0.05007295]\n", + " [ 1. 2.97444397]\n", + " [ 1. -1.04457679]\n", + " [ 1. 1.01278942]\n", + " [ 1. 9.42350407]]\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "2Yvz3hGlsHts" + }, + "source": [ + "## モデルのパラメータ$\\boldsymbol{a}$を推定する\n", + "$$\\boldsymbol{a}\n", + "= \\begin{pmatrix}a_0\\\\a_1\\end{pmatrix}\n", + "= (\\boldsymbol{X}^T\\boldsymbol{X})^{-1}\\boldsymbol{X}^T\\boldsymbol{y}$$" + ], + "id": "2Yvz3hGlsHts" + }, + { + "cell_type": "code", + "metadata": { + "scrolled": true, + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "pN7okGYOsHtt", + "outputId": "31869a14-d1ce-4427-dff9-844a86d6f249" + }, + "source": [ + "# @は内積の演算子, np.linalg.invは逆行列を計算してくれるライブラリ\n", + "a = np.linalg.inv(X.T@X)@X.T@y\n", + "print(a.shape)\n", + "print(a)" + ], + "id": "pN7okGYOsHtt", + "execution_count": 28, + "outputs": [ + { + "output_type": "stream", + "text": [ + "(2,)\n", + "[0.6236742 1.79968636]\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Q--bx75isHtt" + }, + "source": [ + "## 推定したモデル$\\hat{y}$を描画する" + ], + "id": "Q--bx75isHtt" + }, + { + "cell_type": "code", + "metadata": { + "scrolled": true, + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "4N0xqSULsHtu", + "outputId": "2ecd75c3-9d46-437a-b949-4b3fae65ddf1" + }, + "source": [ + "# (1, x_{new})が縦に並ぶ行列Xnewをつくる\n", + "Nnew = 100\n", + "x_new = np.linspace(-10,10,Nnew)\n", + "ones = np.ones(Nnew)\n", + "Xnew = np.concatenate([ones[:,np.newaxis],x_new[:,np.newaxis]],axis=1)\n", + "print(Xnew.shape)\n", + "print(Xnew[0:5])\n", + "Y_hat = Xnew@a\n", + "print(Y_hat.shape)" + ], + "id": "4N0xqSULsHtu", + "execution_count": 41, + "outputs": [ + { + "output_type": "stream", + "text": [ + "(100, 2)\n", + "[[ 1. -10. ]\n", + " [ 1. -9.7979798 ]\n", + " [ 1. -9.5959596 ]\n", + " [ 1. -9.39393939]\n", + " [ 1. -9.19191919]]\n", + "(100,)\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "4ZudlFS8sHtu" + }, + "source": [ + "## 観測データの分布上に学習したモデルをプロットする" + ], + "id": "4ZudlFS8sHtu" + }, + { + "cell_type": "code", + "metadata": { + "scrolled": false, + "colab": { + "base_uri": "https://localhost:8080/", + "height": 265 + }, + "id": "g3S8oCMGsHtu", + "outputId": "f806076b-2f0d-4cfd-eeeb-de2a0e2778d6" + }, + "source": [ + "plt.scatter(x,y)\n", + "plt.plot(x_new, Y_hat, linewidth=3, color='orange')\n", + "plt.show()" + ], + "id": "g3S8oCMGsHtu", + "execution_count": 42, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "gZZaQOLuKsO9" + }, + "source": [ + "" + ], + "id": "gZZaQOLuKsO9", + "execution_count": null, + "outputs": [] + } + ] +} \ No newline at end of file