{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# パーセプトロンの限界" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "XORゲート\n", "\n", "| $x_1$ | $x_2$ | $y$ |\n", "| ----- | ----- | --- |\n", "| $0$ | $0$ | $0$ |\n", "| $1$ | $0$ | $1$ |\n", "| $0$ | $1$ | $1$ |\n", "| $1$ | $1$ | $0$ |\n", "\n", "XORゲートは、単体のパーセプトロンでは実現できない。その理由をグラフで見てみよう。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## ANDのグラフ" ] }, { "cell_type": "code", "execution_count": 1, "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", "from matplotlib import pyplot as plt\n", "import itertools\n", "\n", "def AND(x1, x2):\n", " \"\"\"\n", " AND関数\n", " \n", " Parameters\n", " ----------\n", " x1 : float\n", " 入力1\n", " x2 : float\n", " 入力2\n", " \"\"\"\n", " x = np.array([x1, x2])\n", " w = np.array([0.5, 0.5])\n", " b = -0.7\n", " tmp = np.sum(w * x) + b\n", " if tmp <= 0:\n", " return 0\n", " else:\n", " return 1\n", "\n", "if __name__ == \"__main__\":\n", " xs = np.array([[0, 0],\n", " [1, 0],\n", " [0, 1],\n", " [1, 1]], dtype=np.float32) # データ\n", "\n", "\n", "\n", " w = np.array([0, 0], dtype=np.float32) # 重み\n", " b = 0 # バイアス\n", " lr = 0.01 # 学習率\n", "\n", " def predict(x):\n", " u = np.dot(x, w) - b\n", " return np.where(u > 0, 1, 0)\n", "\n", " # グラフの描画 from https://teratail.com/questions/177319\n", " fig, ax = plt.subplots()\n", " ax.set_xticks([0, 1]), ax.set_yticks([0, 1])\n", " ax.set_xlim(-0.5, 1.5), ax.set_ylim(-0.5, 1.5)\n", "\n", " # サンプルを描画する。\n", " ax.scatter(xs[:, 0], xs[:, 1], s=30)\n", "\n", " # 各点の推論結果を得る。\n", " X, Y = np.meshgrid(np.linspace(*ax.get_xlim(), 100),\n", " np.linspace(*ax.get_ylim(), 100))\n", " XY = np.column_stack([X.ravel(), Y.ravel()])\n", " Z = np.array([AND(x[0], x[1]) for x in XY]).reshape(X.shape)\n", "\n", " # 等高線を描画する。\n", " ax.contourf(X, Y, Z, alpha=0.4, cmap='RdBu')\n", "\n", " plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## NANDのグラフ" ] }, { "cell_type": "code", "execution_count": 2, "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", "from matplotlib import pyplot as plt\n", "import itertools\n", "\n", "def NAND(x1, x2):\n", " \"\"\"\n", " NAND関数\n", " \n", " Parameters\n", " ----------\n", " x1 : float\n", " 入力1\n", " x2 : float\n", " 入力2\n", " \"\"\"\n", " x = np.array([x1, x2])\n", " w = np.array([-0.5, -0.5])\n", " b = 0.7\n", " tmp = np.sum(w * x) + b\n", " if tmp <= 0:\n", " return 0\n", " else:\n", " return 1\n", "\n", "if __name__ == \"__main__\":\n", " xs = np.array([[0, 0],\n", " [1, 0],\n", " [0, 1],\n", " [1, 1]], dtype=np.float32) # データ\n", "\n", "\n", "\n", " w = np.array([0, 0], dtype=np.float32) # 重み\n", " b = 0 # バイアス\n", " lr = 0.01 # 学習率\n", "\n", " def predict(x):\n", " u = np.dot(x, w) - b\n", " return np.where(u > 0, 1, 0)\n", "\n", " # グラフの描画 from https://teratail.com/questions/177319\n", " fig, ax = plt.subplots()\n", " ax.set_xticks([0, 1]), ax.set_yticks([0, 1])\n", " ax.set_xlim(-0.5, 1.5), ax.set_ylim(-0.5, 1.5)\n", "\n", " # サンプルを描画する。\n", " ax.scatter(xs[:, 0], xs[:, 1], s=30)\n", "\n", " # 各点の推論結果を得る。\n", " X, Y = np.meshgrid(np.linspace(*ax.get_xlim(), 100),\n", " np.linspace(*ax.get_ylim(), 100))\n", " XY = np.column_stack([X.ravel(), Y.ravel()])\n", " Z = np.array([NAND(x[0], x[1]) for x in XY]).reshape(X.shape)\n", "\n", " # 等高線を描画する。\n", " ax.contourf(X, Y, Z, alpha=0.4, cmap='RdBu')\n", "\n", " plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## ORのグラフ" ] }, { "cell_type": "code", "execution_count": 3, "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", "from matplotlib import pyplot as plt\n", "import itertools\n", "\n", "def OR(x1, x2):\n", " \"\"\"\n", " OR関数\n", " \n", " Parameters\n", " ----------\n", " x1 : float\n", " 入力1\n", " x2 : float\n", " 入力2\n", " \"\"\"\n", " x = np.array([x1, x2])\n", " w = np.array([0.5, 0.5])\n", " b = -0.2\n", " tmp = np.sum(w * x) + b\n", " if tmp <= 0:\n", " return 0\n", " else:\n", " return 1\n", "\n", "if __name__ == \"__main__\":\n", " xs = np.array([[0, 0],\n", " [1, 0],\n", " [0, 1],\n", " [1, 1]], dtype=np.float32) # データ\n", "\n", "\n", "\n", " w = np.array([0, 0], dtype=np.float32) # 重み\n", " b = 0 # バイアス\n", " lr = 0.01 # 学習率\n", "\n", " def predict(x):\n", " u = np.dot(x, w) - b\n", " return np.where(u > 0, 1, 0)\n", "\n", " # グラフの描画 from https://teratail.com/questions/177319\n", " fig, ax = plt.subplots()\n", " ax.set_xticks([0, 1]), ax.set_yticks([0, 1])\n", " ax.set_xlim(-0.5, 1.5), ax.set_ylim(-0.5, 1.5)\n", "\n", " # サンプルを描画する。\n", " ax.scatter(xs[:, 0], xs[:, 1], s=30)\n", "\n", " # 各点の推論結果を得る。\n", " X, Y = np.meshgrid(np.linspace(*ax.get_xlim(), 100),\n", " np.linspace(*ax.get_ylim(), 100))\n", " XY = np.column_stack([X.ravel(), Y.ravel()])\n", " Z = np.array([OR(x[0], x[1]) for x in XY]).reshape(X.shape)\n", "\n", " # 等高線を描画する。\n", " ax.contourf(X, Y, Z, alpha=0.4, cmap='RdBu')\n", "\n", " plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 何が言いたいのか\n", "\n", "単体のパーセプトロンは、1本の直線として表現が可能なものしか分けることができない。 \n", "`XOR` は曲線になる。" ] } ], "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.3" } }, "nbformat": 4, "nbformat_minor": 4 }