{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# パーセプトロンの実装\n", "\n", "## 数学ノート\n", "\n", "[ノートはこちらからダウンロード](http://kikagaku-blog.azurewebsites.net/notes/perceptron.pdf)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 数値例用のデータセット作成" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# シードを固定して再現性の確保\n", "np.random.seed(0)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "x1 = np.random.randn(100, 2)\n", "x1 = x1 - 3\n", "x2 = np.random.randn(100, 2)\n", "x2 = x2 + 3" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "データはプロットして確認するとミスを防げます。" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.scatter(x1[:, 0], x1[:, 1], label='x1')\n", "plt.scatter(x2[:, 0], x2[:, 1], label='x2')\n", "plt.legend()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 教師データ作成" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "# 1 0r -1 のラベルを付ける\n", "t1 = [1] * len(x1)\n", "t2 = [-1] * len(x2)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "# 縦向きに連結\n", "x = np.r_[x1, x2]\n", "t = np.r_[t1, t2]" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(200, 2)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x.shape" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(200,)" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "t.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## CSVファイルにデータセットを保存" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "# バイアス項も考慮して、すべてが1の列x0も追加\n", "df = pd.DataFrame({\n", " 'x0': [1] * len(x),\n", " 'x1': x[:, 0],\n", " 'x2': x[:, 1],\n", " 't': t\n", "})" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
tx0x1x2
011-1.235948-2.599843
111-2.021262-0.759107
211-1.132442-3.977278
\n", "
" ], "text/plain": [ " t x0 x1 x2\n", "0 1 1 -1.235948 -2.599843\n", "1 1 1 -2.021262 -0.759107\n", "2 1 1 -1.132442 -3.977278" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 先頭3件\n", "df.head(3)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
tx0x1x2
197-112.7081632.238508
198-113.8579244.141102
199-114.4665793.852552
\n", "
" ], "text/plain": [ " t x0 x1 x2\n", "197 -1 1 2.708163 2.238508\n", "198 -1 1 3.857924 4.141102\n", "199 -1 1 4.466579 3.852552" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 末尾3件\n", "df.tail(3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pandasでは簡単にCSVファイルへ保存することができます。引数で`index_label`を`False`にしておかないと、一番左の行番号まで入ってしまうので注意です。" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "df.to_csv('sample_perceptron.csv', index_label=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## データの読み込み\n", "\n", "今回は必要ありませんが、データの受け渡しがあった前提で読み込みも行いましょう。" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "df = pd.read_csv('sample_perceptron.csv')" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
tx0x1x2
011-1.235948-2.599843
111-2.021262-0.759107
211-1.132442-3.977278
311-2.049912-3.151357
411-3.103219-2.589401
\n", "
" ], "text/plain": [ " t x0 x1 x2\n", "0 1 1 -1.235948 -2.599843\n", "1 1 1 -2.021262 -0.759107\n", "2 1 1 -1.132442 -3.977278\n", "3 1 1 -2.049912 -3.151357\n", "4 1 1 -3.103219 -2.589401" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "t = df.iloc[:, 0].values\n", "X = df.iloc[:, 1:].values" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "プロット用に各カテゴリのデータも抽出しておきましょう。" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "x_1 = df[df['t'] == 1].iloc[:, 2:].values\n", "x_2 = df[df['t'] == -1].iloc[:, 2:].values" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## データの可視化\n", "\n", "パラメータ$w$の調整に入る前に、現状どの程度の識別の結果が得られているのか確認できるような可視化の関数を作成しておきましょう。\n", "\n", "パーセプトロンでは識別の境界線を入力が二次元の場合、以下のように定式化しています。\n", "\n", "$w_{1}x_{1} + w_{2}x_{2} + w{0} = 0$\n", "\n", "縦軸$x2$に関して整理すると以下のようになります。\n", "\n", "$x_{2} = - \\dfrac{w_{1}x_{1} + w_{0}}{w_{2}}$" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 0]\n", " [-1]\n", " [ 1]]\n" ] } ], "source": [ "w = np.array([[0], [-1], [1]])\n", "print(w)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "x1 = np.linspace(-4, 4)\n", "x2 = - (w[1] * x1 + w[0]) / w[2]" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([-4. , -3.83673469, -3.67346939, -3.51020408, -3.34693878,\n", " -3.18367347, -3.02040816, -2.85714286, -2.69387755, -2.53061224])" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x1[:10]" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([-4. , -3.83673469, -3.67346939, -3.51020408, -3.34693878,\n", " -3.18367347, -3.02040816, -2.85714286, -2.69387755, -2.53061224])" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x2[:10]" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(-5, 5)" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(x1, x2, label='wx+b=0')\n", "plt.scatter(x_1[:, 0], x_1[:, 1], label='x1')\n", "plt.scatter(x_2[:, 0], x_2[:, 1], label='x2')\n", "plt.legend()\n", "# 最大値と最小値の領域も追加\n", "plt.xlim([-5, 5])\n", "plt.ylim([-5, 5])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "こちらのように可視化ができました。今の重みだと全然分類がうまくできていないことがわかります。そのため、パラメータを調整していくことで、うまく識別ができるかをこの後に確認していきましょう。\n", "\n", "また、最後にプロットを行う関数にひとまとめにしておきましょう。" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "def plot_result(w, x_1, x_2):\n", "\n", " x1 = np.linspace(-4, 4)\n", " x2 = - (w[1] * x1 + w[0]) / w[2]\n", "\n", " plt.plot(x1, x2, label='wx+b=0')\n", " plt.scatter(x_1[:, 0], x_1[:, 1], label='x1')\n", " plt.scatter(x_2[:, 0], x_2[:, 1], label='x2')\n", " plt.legend()\n", " plt.xlim([-5, 5])\n", " plt.ylim([-5, 5])" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_result(w, x_1, x_2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 損失関数の計算\n", "\n", "まずは**損失関数**の定義から行いましょう。\n", "\n", "**ヒンジ損失関数**\n", "\n", "$\\displaystyle \\mathcal{L} = \\sum_{n=1}^{N} \\max (0, -t_{n}y_{n})$\n", "\n", "ポイントとしては、各サンプルごとに計算できるようにしておきましょう。ここで気を付ける点として、$x$が数学上は縦向きのベクトルで扱いますが実装上は`X`の各行に格納されているため、横向きのベクトルになります。無理やり縦向きにしても良いのですが、$x^{T}w$のような計算のケースだと横向きのまま扱って、`np.dot(x, w)`としてしまう方が楽です。" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "def hinge(t, x, w):\n", " y = np.dot(x, w)\n", " return max(0, -t * y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "関数の定義ができれば、まず動作するかの確認を行いましょう。" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 1. -1.23594765 -2.59984279]\n" ] } ], "source": [ "x = X[0]\n", "print(x)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n" ] } ], "source": [ "_t = t[0]\n", "print(_t)" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([1.36389514])" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hinge(_t, x, w)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "このように動作できることを確認しました。\n", "\n", "## 損失関数の勾配を計算\n", "\n", "次は損失関数の勾配 $\\dfrac{\\partial}{\\partial w} \\mathcal{L}$ を計算する関数を定義していきましょう。" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "def grad_loss(t, X, w):\n", " \n", " # 勾配を格納するゼロベクトルを初期化\n", " grad = np.zeros((1, len(w)))\n", " \n", " for (_t, x) in zip(t, X):\n", " loss = hinge(_t, x, w)\n", " # 不正解の時は足し合わせる\n", " if loss > 0:\n", " grad += - _t * x\n", " \n", " return grad.T" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "損失関数の勾配も同様に確認していきます。" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 5. ]\n", " [225.81531709]\n", " [332.56056004]]\n" ] } ], "source": [ "grad = grad_loss(t, X, w)\n", "print(grad)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 最急降下法を実装\n", "\n", "最急降下法に基づきパラメータを更新する関数 `update` を作成しましょう。`alpha`はハイパーパラメータとしてデフォルトの値を設定しておくと便利です。\n", "\n", "$w \\leftarrow w - \\alpha \\dfrac{\\partial}{\\partial w} \\mathcal{L}$" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "def update(w, grad, alpha=0.001):\n", " w = w - alpha * grad\n", " return w" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## パラメータ更新の様子を確認\n", "\n", "まずは初期値を設定します。" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "np.random.seed(100)" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 0]\n", " [-1]\n", " [ 1]]\n" ] } ], "source": [ "w = np.array([[0], [-1], [1]])\n", "print(w)" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_result(w, x_1, x_2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "初期値では全然うまく分類できておらず、下記の3手順を繰り返しながらパラメータの更新を行っていきましょう。\n", "\n", "- 損失関数の勾配を計算\n", "- パラメータのアップデート\n", "- 結果の可視化\n", "\n", "### 更新1回目" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "grad:\n", " [[ 5. ]\n", " [225.81531709]\n", " [332.56056004]]\n", "w:\n", " [[-0.005 ]\n", " [-1.22581532]\n", " [ 0.66743944]]\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "grad = grad_loss(t, X, w)\n", "w = update(w, grad)\n", "print('grad:\\n', grad)\n", "print('w:\\n', w)\n", "plot_result(w, x_1, x_2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 更新2回目" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "grad:\n", " [[ 4. ]\n", " [37.07200501]\n", " [94.28825842]]\n", "w:\n", " [[-0.009 ]\n", " [-1.26288732]\n", " [ 0.57315118]]\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "grad = grad_loss(t, X, w)\n", "w = update(w, grad)\n", "print('grad:\\n', grad)\n", "print('w:\\n', w)\n", "plot_result(w, x_1, x_2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 100回更新する" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [], "source": [ "for i in range(100):\n", " grad = grad_loss(t, X, w)\n", " w = update(w, grad)" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[-0.039 ],\n", " [-1.34672437],\n", " [ 0.13553265]])" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "w" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[0.],\n", " [0.],\n", " [0.]])" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grad" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_result(w, x_1, x_2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "実際にパーセプトロンのアルゴリズムによって境界を決める識別線を求めることができました。" ] }, { "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.4" } }, "nbformat": 4, "nbformat_minor": 2 }