{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 主成分分析 (1)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import matplotlib.animation\n", "from IPython.display import HTML" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$\\def\\bm{\\boldsymbol}$以下は、[教育用標準データセット(SSDSE: Standardized Statistical Data Set for Education)](https://www.nstac.go.jp/SSDSE/)の「C. 都道府県庁所在市別、家計消費データ」から麺類に関する部分を抜き出したものである(多いので冒頭の15行だけを表示した)。SSDSE-Cは、[総務省統計局「家計調査」](https://www.stat.go.jp/data/kakei/index.html)から、二人以上の世帯の1世帯当たりの年間支出金額を都道府県庁所在市別・品目別に表形式で収録したものである。" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "tags": [ "hide-input" ] }, "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", " \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", " \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", " \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", "
都道府県生うどん・そば乾うどん・そばパスタ中華麺カップ麺即席麺他の麺類
1北海道316220821266415251891609726
2青森県296422241114527160882039554
3岩手県334924751305599159851889898
4宮城県306824071339501752951709842
5秋田県323134091019517250131680554
6山形県447830841288523658751745754
7福島県296327051064439758621687919
8茨城県335324771248403445621440653
9栃木県390822181391453449451860742
10群馬県456319481203415350491544546
11埼玉県401622561487451245841568949
12千葉県338922771441458245131840835
13東京都308823851595459239531734974
14神奈川県3410268414724484403517411049
15新潟県269734091308419260952201612
\n", "
" ], "text/plain": [ " 都道府県 生うどん・そば 乾うどん・そば パスタ 中華麺 カップ麺 即席麺 他の麺類\n", "1 北海道 3162 2082 1266 4152 5189 1609 726\n", "2 青森県 2964 2224 1114 5271 6088 2039 554\n", "3 岩手県 3349 2475 1305 5991 5985 1889 898\n", "4 宮城県 3068 2407 1339 5017 5295 1709 842\n", "5 秋田県 3231 3409 1019 5172 5013 1680 554\n", "6 山形県 4478 3084 1288 5236 5875 1745 754\n", "7 福島県 2963 2705 1064 4397 5862 1687 919\n", "8 茨城県 3353 2477 1248 4034 4562 1440 653\n", "9 栃木県 3908 2218 1391 4534 4945 1860 742\n", "10 群馬県 4563 1948 1203 4153 5049 1544 546\n", "11 埼玉県 4016 2256 1487 4512 4584 1568 949\n", "12 千葉県 3389 2277 1441 4582 4513 1840 835\n", "13 東京都 3088 2385 1595 4592 3953 1734 974\n", "14 神奈川県 3410 2684 1472 4484 4035 1741 1049\n", "15 新潟県 2697 3409 1308 4192 6095 2201 612" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.read_excel('https://www.nstac.go.jp/SSDSE/data/2021/SSDSE-C-2021.xlsx', skiprows=1)\n", "df = df[['都道府県', '生うどん・そば', \"乾うどん・そば\", \"パスタ\", \"中華麺\", \"カップ麺\", \"即席麺\", \"他の麺類\"]]\n", "df = df.iloc[1:]\n", "df[:15]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "このデータを分析することで、日本における麺類の消費行動の全体的な傾向や、地域における特徴が明らかになるかもしれない。また、カップ麺と即席麺は消費行動が似ているかもしれないのでどちらか一方だけ調査すれば十分である、ということがデータから明らかになるかもしれない。\n", "\n", "そこで、麺類の消費行動の傾向を掴むために、このデータを可視化することを考える。仮に、このデータが2次元(2種類の麺類によるデータ)であるならば、2次元平面上に各都道府県庁所在地をプロットすればよい。ところが、このデータは各都道府県庁所在地が7次元のベクトルで表されているため、2次元平面上にプロットすることができない。そこで、このデータの特徴空間を7次元から2次元に**圧縮**することを考えたい。\n", "\n", "本章では、このような分析に役立つ手法として、**主成分分析**(principal component analysis)を紹介する。主成分分析は、データの情報をできるだけ豊富に表現できるように配慮しながら、もとの特徴量の線形結合で表現される新しい「軸」を導き出す手法である。元データの情報量を最も豊富に表現できる軸は**第1主成分**(first principal component)と呼ばれる。その第1主成分と直交し、かつ2番目に情報量が豊富な軸を第2主成分、第1主成分と第2主成分に直交し、かつ3番目に情報量が豊富な軸を第3主成分、・・・という形で、元データを表現する情報量の多い順にお互いに直交する複数の軸を求めることができる。\n", "\n", "元のデータの各事例は、主成分分析で求められた新しい軸に射影される。主成分分析で求められた全ての軸を用いることで、元のデータを完全に再現することができる。また、元データを第1主成分、第2主成分といった主要な軸だけで表現することで、元データよりも少ない軸に要約することができる。このため、主成分分析はデータの次元圧縮やノイズ除去、可視化等に用いられる。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2次元データの例\n", "\n", "いきなり3次元以上のデータで考えるのは難しいので、まずは2次元のデータの場合を考える。簡単な例として、以下のグラフで示されたデータ$\\mathcal{D}_s$を考える。このデータは$xy$平面上の$4$点$(-7,-2),(-3,-3),(4,1),(6,4)$で構成されている。" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "D = np.array([[-7, -2], [-3, -3], [4, 1], [6, 4]])\n", "C = ['red', 'blue', 'green', 'orange']\n", "\n", "fig = plt.figure(dpi=100, figsize=(6, 6))\n", "ax = fig.add_subplot(1,1,1)\n", "ax.scatter(D[:,0], D[:,1], marker='o', color=C)\n", "ax.set_xlabel('$x$')\n", "ax.set_ylabel('$y$')\n", "ax.set_aspect('equal')\n", "ax.set_xlim(-8, 8)\n", "ax.set_ylim(-8, 8)\n", "ax.grid()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "このデータ$\\mathcal{D}_s$を次のように表すことにする($i \\in \\{1, 2, 3, 4\\}$は事例に対するインデックスである)。\n", "\\begin{align}\n", "\\mathcal{D}_s = \\{(x_i, y_i)\\}_{i=1}^{4} = \\{(-7,-2),(-3,-3),(4,1),(6,4)\\}\n", "\\end{align}\n", "\n", "なお、\n", "\\begin{align}\n", "\\frac{1}{4}\\left(-7 -3 + 4 + 6\\right) = 0,\\; \\frac{1}{4}\\left(-2 -3 + 1 + 4\\right) = 0 \\\\\n", "\\end{align}\n", "であるから、この4点の重心は原点$(0,0)$である(データの重心が原点にない場合の取り扱いは次章で説明する)。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## データ点を直線へ射影\n", "\n", "さて、各点$(x_i, y_i) \\in \\mathbb{R}^2$を$xy$平面上で原点を通る直線に射影し、その直線上の点$(\\hat{x}_i, \\hat{y}_i)$で近似的に表現したい。原点を通る直線は、長さ$1$の方向ベクトル$\\bm{u} \\in \\mathbb{R}^2$と媒介変数$a \\in \\mathbb{R}$を用いて、$a \\bm{u}$で表される。したがって、点$(x_i, y_i)$を射影した点$(\\hat{x}_i, \\hat{y}_i)$は、$a_i \\in \\mathbb{R}$を用いて次式で表される。\n", "\n", "\\begin{align}\n", "\\begin{pmatrix}\\hat{x}_i \\\\ \\hat{y}_i\\end{pmatrix} = a_i \\bm{u}\n", "\\end{align}\n", "\n", "なお、$|a_i|$は射影された点$(\\hat{x}_i, \\hat{y}_i)$の原点からの距離を表す。射影された点が方向ベクトルと同じ向きにあるときは$a_i$は正の値、反対の向きにあるときは$a_i$は負の値をとることとし、$a_i$を直線上の位置と呼ぶ。以上の定式化により、元のデータ点$(x_i, y_i)$は$\\bm{u}$が定める(1次元の)数直線上の位置$a_i$として近似的に表現される。\n", "\n", "例えば、直線$y=\\frac{1}{2}x$を考えると、元のデータ点(丸印)は射影された点(データ点から降ろした垂線の足、四角印)で近似的に表現される。" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "def draw_projections(ax, q, fill=False, show_a = False, show_e = False, show_xy=False):\n", " artist = []\n", " ya = ['bottom', 'top', 'top', 'bottom']\n", " yoffs = np.array([0.2, -0.2, -0.2, 0.2])\n", " axoffs = np.array([-0.2, -0.3, -0.4, -0.2])\n", " ayoffs = np.array([-0.7, 0.5, 0.5, -0.7])\n", " exoffs = np.array([-0.8, -0.3, 0.3, -0.1])\n", " eyoffs = np.array([0.35, -0.8, -0.4, 0.35])\n", " \n", " P = []\n", " for i in range(D.shape[0]):\n", " x, y = D[i,0], D[i,1]\n", " # Project (x, y) onto the line q.\n", " d = np.dot(np.array([x, y]), q)\n", " p = d * q\n", " artist.append(ax.scatter(p[0], p[1], marker='s', color=C[i]))\n", " if show_a:\n", " artist.append(ax.text(p[0] + axoffs[i], p[1] + ayoffs[i], '$a_{}$'.format(i+1)))\n", " if show_e:\n", " artist.append(ax.text(p[0] + exoffs[i], p[1] + eyoffs[i], '$\\epsilon_{}$'.format(i+1))) \n", " if show_xy:\n", " artist.append(ax.text(x, y + yoffs[i], '$(x_{0}, y_{0})$'.format(i+1), ha='center', va=ya[i]))\n", " artist += ax.plot([x, p[0]], [y, p[1]], ls='--', color=C[i])\n", " P.append((i, p)) \n", "\n", " # Sort the projected points so that we can draw lines in an appropriate order.\n", " P.sort(key=lambda x: np.dot(x[1], x[1]), reverse=True)\n", " for i, p in P:\n", " artist += ax.plot([0, p[0]], [0, p[1]], ls='-', color=C[i])\n", " if fill:\n", " tri = plt.Polygon(((0, 0), D[i], p), fc=C[i], alpha=0.2)\n", " artist.append(ax.add_patch(tri))\n", "\n", " return artist\n", "\n", "u = np.array([2, 1])\n", "uy = 8 * u[1] / u[0]\n", "\n", "fig = plt.figure(dpi=100, figsize=(6, 6))\n", "ax = fig.add_subplot(1,1,1)\n", "ax.scatter(D[:,0], D[:,1], marker='o', color=C)\n", "ax.plot([-8, 8], [-uy, uy], ls='-', color='black', lw=1)\n", "draw_projections(ax, u / np.linalg.norm(u), show_a=True, show_xy=True)\n", "ax.set_xlabel('$x$')\n", "ax.set_ylabel('$y$')\n", "ax.set_aspect('equal')\n", "ax.set_xlim(-8, 8)\n", "ax.set_ylim(-8, 8)\n", "ax.grid()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$a_i$を求めるため、直線$y=\\frac{1}{2}x$に対応する長さ$1$の方向ベクトル$\\bm{u}$を求める。\n", "\n", "\\begin{align}\n", "\\bm{u} = \\frac{1}{\\sqrt{2^2 + 1^2}}\\begin{pmatrix}2 \\\\ 1\\end{pmatrix} = \\begin{pmatrix}\\frac{2}{\\sqrt{5}} \\\\ \\frac{1}{\\sqrt{5}}\\end{pmatrix}\n", "\\end{align}\n", "\n", "ある点$(x_i, y_i)$を方向ベクトル$\\bm{u}$上に射影したとき、その位置$a_i$は、\n", "\n", "$$\n", "\\begin{align}\n", "a_i = \\left\\|\\begin{pmatrix}x_i \\\\ y_i\\end{pmatrix}\\right\\| \\cos \\theta = \\left\\|\\begin{pmatrix}x_i \\\\ y_i\\end{pmatrix}\\right\\| \\frac{\\begin{pmatrix}x_i \\\\ y_i\\end{pmatrix}^\\top \\bm{u}}{\\left\\|\\begin{pmatrix}x_i \\\\ y_i\\end{pmatrix}\\right\\| \\|\\bm{u}\\|} = \\begin{pmatrix}x_i \\\\ y_i\\end{pmatrix}^\\top \\bm{u}\n", "\\end{align}\n", "$$ (eq:definition-of-a)\n", "\n", "と求めることができる。ここで、$\\theta$は位置ベクトル$(x_i, y_i)$と方向ベクトル$\\bm{u}$のなす角である。ゆえに、\n", "\n", "\\begin{align}\n", "a_1 &= \\begin{pmatrix}-7 & -2\\end{pmatrix} \\begin{pmatrix}\\frac{2}{\\sqrt{5}} \\\\ \\frac{1}{\\sqrt{5}}\\end{pmatrix} \\approx -7.16 \\\\\n", "a_2 &= \\begin{pmatrix}-3 & -3\\end{pmatrix} \\begin{pmatrix}\\frac{2}{\\sqrt{5}} \\\\ \\frac{1}{\\sqrt{5}}\\end{pmatrix} \\approx -4.02 \\\\\n", "a_3 &= \\begin{pmatrix}4 & 1\\end{pmatrix} \\begin{pmatrix}\\frac{2}{\\sqrt{5}} \\\\ \\frac{1}{\\sqrt{5}}\\end{pmatrix} \\approx 4.02 \\\\\n", "a_4 &= \\begin{pmatrix}6 & 4\\end{pmatrix} \\begin{pmatrix}\\frac{2}{\\sqrt{5}} \\\\ \\frac{1}{\\sqrt{5}}\\end{pmatrix} \\approx 7.16 \\\\\n", "\\end{align}\n", "\n", "以上により、データ$\\mathcal{D}_s$の各事例$(x_i, y_i)$を方向ベクトル$\\bm{u}$と、位置$a_i$で近似的に表現したことになる。各事例$(x_i, y_i)$を射影した点$(\\hat{x}_i, \\hat{y}_i)$は、\n", "\n", "\\begin{align}\n", "\\begin{pmatrix}\\hat{x}_1 \\\\ \\hat{y}_1\\end{pmatrix} &= -7.16 \\begin{pmatrix}\\frac{2}{\\sqrt{5}} \\\\ \\frac{1}{\\sqrt{5}}\\end{pmatrix} = \\begin{pmatrix}-6.4 \\\\ -3.2 \\end{pmatrix}\\\\\n", "\\begin{pmatrix}\\hat{x}_2 \\\\ \\hat{y}_2\\end{pmatrix} &= -4.02 \\begin{pmatrix}\\frac{2}{\\sqrt{5}} \\\\ \\frac{1}{\\sqrt{5}}\\end{pmatrix} = \\begin{pmatrix}-3.6 \\\\ -1.8 \\end{pmatrix}\\\\\n", "\\begin{pmatrix}\\hat{x}_3 \\\\ \\hat{y}_3\\end{pmatrix} &= 4.02 \\begin{pmatrix}\\frac{2}{\\sqrt{5}} \\\\ \\frac{1}{\\sqrt{5}}\\end{pmatrix} = \\begin{pmatrix}3.6 \\\\ 1.8 \\end{pmatrix} \\\\\n", "\\begin{pmatrix}\\hat{x}_4 \\\\ \\hat{y}_4\\end{pmatrix} &= 7.16 \\begin{pmatrix}\\frac{2}{\\sqrt{5}} \\\\ \\frac{1}{\\sqrt{5}}\\end{pmatrix} = \\begin{pmatrix}6.4 \\\\ 3.2 \\end{pmatrix} \\\\\n", "\\end{align}\n", "\n", "## 近似の良さの定量化\n", "\n", "直線への射影による近似の良さを定量化するため、元データの各点$(x_i, y_i)$から直線上に垂線を降ろしたときの長さを$\\epsilon_i$とし、これを残差と呼ぶ。三平方の定理(ピタゴラスの定理)より、\n", "\n", "\\begin{align}\n", "x_i^2 + y_i^2 = a_i^2 + \\epsilon_i^2\n", "\\end{align}\n", "\n", "が成り立つ。以下のグラフでは、各事例に関して直角三角形を色付けして描いている。直線$y=\\frac{1}{2}x$上の面を底辺、垂線を高さとすると、\n", "\n", "+ $x_i^2 + y_i^2$: 斜面の長さの二乗(原点から丸印までの距離の二乗)\n", "+ $a_i^2$: 底辺の長さの二乗(原点から四角印までの距離の二乗)\n", "+ $\\epsilon_i^2$: 高さ(点線)の二乗(残差の二乗)\n", "\n", "と整理できる。" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhAAAAIJCAYAAAD02QTaAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAA9hAAAPYQGoP6dpAABOwUlEQVR4nO3de3hU1dn+8e8KCSERCEI4o4AiKhCOgtFaTREQREv1pxSpJwqx8qoVq1RIFZQa8PVcUSsCFUUFpQhqBRTeqqGihRqxjYhgJRGQIIRwDCSTZP3+mCROQk47mcmemdyf68oFs4/PkmBunr323sZai4iIiIgTEW4XICIiIqFHAUJEREQcU4AQERERxxQgRERExDEFCBEREXFMAUJEREQcU4AQERERxxQgRERExDEFCBEREXFMAUJEREQcC6kAYYxpYoz5ozFmhzHmuDHmv8aY+40xxu3aREREGpNItwtw6F5gMnAT8CVwHvAicAh42sW6REREGpVQCxAXAm9Za98t+ZxpjLkOGOJiTSIiIo1OqAWIDcAtxpie1tptxph+wEXA76rawRgTDURXWNwaOBC4MkVEREJGC+B76/D13KEWIB4GWgJbjTFFQBPgD9baV6vZZzowsyGKExERCVFdgN1OdjAOA4erjDHjgEeBqXjnQPQHngJ+Z619qYp9KnYgWgC7tm3bRuvWrQNarxs8Hg8ffPABP/vZz4iKinK7nIDQGENfuI8PNMZwEO7jAzhw4AA9e/YEiLPWHnayb6h1IB4FHrbWLi35/B9jTFe8XYZKA4S1Nh/IL/1cesNG69atadOmTWCrdYHH4yE2NpY2bdqE7Te8xhj6wn18oDGGg3AfX32F1G2cQCxQXGFZEaE3DhERkZAWah2Id4A/GGO+w3sJYwDeCZR/cbUqERGRRibUAsQdwB+B54B2wPfAPGCWm0WJiIg0NiEVIKy1R4ApJV8iIiLiEs0dEBEREccUIERERMQxBQgRERFxTAFCREREHFOAEBEREccUIERERMQxBQgRERFxTAFCREREHFOAEBEREccUIERERMQxBQgRERFxTAFCREREHFOAEBEREccUIERERMQxBQgRERFxTAFCREREHFOAEBEREccUIERERMQxBQgRERFxTAFCREREHFOAEBEREccUIERERMQxBQgRERFxTAFCREREHFOAEBEREccUIERERMQxBQgRERFxTAFCREREHFOAEBEREccUIERERMQxBQgRERFxTAFCREREHFOAEBEREccUIERERMQxBQgRERFxTAFCREREHFOAEBEREccUIERERMQxBQgRERFxTAFCREREHFOAEBEREccUIERERMQxBQgRERFxTAFCREREHFOAEBEREccUIERERMSxkAsQxpjOxphXjDE5xpjjxpj/GGPOc7suERGRxiTS7QKcMMacCnwMfACMAvYBZwG5btYlIiLS2IRUgADuBXZaayf4LNtR3Q7GmGgg2mdRCwCPx4PH4/F/hS4rHVM4jq2Uxhj6wn18oDGGg3AfH9RvbMZa68dSAssYswV4D+gCXALsBp6z1s6vZp8HgJkVl7/22mvExsYGqFIREZHgl5eXx/jx4wHirLWHnewbagHiRMlvnwCWAYOBPwG3WmtfqmKfyjoQu/bs2UObNm0CWa4rPB4Pa9euZfjw4URFRbldTkBojKEv3McHGmM4CPfxAeTk5NCxY0eoQ4AItUsYEcC/rLUpJZ8/N8b0AW4FKg0Q1tp8IL/0szEGgKioqLD9hoDwHx9ojOEg3McHGmM4COfx1WdcoXYXxh5gS4VlXwGnu1CLiIhIoxVqAeJj4OwKy3oCWS7UIiIi0miFWoB4Ekg0xqQYY3oYY8YDtwDPulyXiIhIoxJSAcJauwm4CrgOyADuB6ZYa191tTAREZFGJtQmUWKt/RvwN7frEBERacxCqgMhIiIiwUEBQkRERBxTgBARERHHFCBERETEMQUIERERcUwBQkRERBxTgBARERHHFCBERETEMQUIERERcUwBQkRERBxTgBARERHHFCBERETEMQUIERERcUwBQkRERBxTgBARERHHFCBERETEMQUIERERcUwBQkRERBxTgBARERHHFCBERETEMQUIERERcUwBQkRERBxTgBARERHHFCBERETEMQUIERERcUwBQkRERBxTgBARERHHFCBERETEMQUIEREJCzk5ObRr147MzEy3S6nSuHHjePzxx90uwy8UIEREJCykpqYyZswYunXr5nYpVbrvvvtITU3l0KFDbpdSbwoQIiIS8vLy8li4cCETJ050u5Rq9enThzPPPJNXXnnF7VLqTQFCRERC3qpVq4iOjiYxMbFs2ZIlS4iJiWHPnj1lyyZMmEDfvn3r1QHo0qULzz33XLllGzZsIDY2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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "u = np.array([2, 1])\n", "uy = 8 * u[1] / u[0]\n", "\n", "fig = plt.figure(dpi=100, figsize=(6, 6))\n", "ax = fig.add_subplot(1,1,1)\n", "ax.scatter(D[:,0], D[:,1], marker='o', color=C)\n", "ax.plot([-8, 8], [-uy, uy], ls='-', color='black', lw=1)\n", "draw_projections(ax, u / np.linalg.norm(u), True, show_a=True, show_e=True, show_xy=True)\n", "ax.set_xlabel('$x$')\n", "ax.set_ylabel('$y$')\n", "ax.set_aspect('equal')\n", "ax.set_xlim(-8, 8)\n", "ax.set_ylim(-8, 8)\n", "ax.grid()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "これまでの議論では、データ点を射影する直線(方向ベクトル$\\bm{u}$)を固定していたが、以降は射影された点の良さを考慮しながら様々な直線を検討したい。今回のデータ$\\mathcal{D}_s$の重心は原点であるため、直線の切片は$0$に固定し、直線の傾きだけを変更する。回帰分析と同様に、方向ベクトル$\\bm{u}$で元のデータ点を射影したときの「良さ」を、全てのデータ点の残差の二乗和で定量化する。\n", "\n", "\\begin{align}\n", "\\sum_{i=1}^{N} \\epsilon_i^2\n", "\\end{align}\n", "\n", "なお、2次元のデータにおいて、線形回帰では$y$軸に関する実際の値と近似値の値の差$\\epsilon = y - \\hat{y}$を残差として定義したのに対し、主成分分析では事例を直線に射影したときの垂線の長さ$\\epsilon = \\sqrt{(x - \\hat{x})^2 + (y - \\hat{y})^2}$を残差として定義する所が異なる。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "さて、直線の傾きを変えながら射影された点をプロットするアニメーションを示す。" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "tags": [ "hide-input" ] }, "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" ], "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "K = 50\n", "X = np.hstack([np.linspace(-8, 8, K, endpoint=False), np.full(K-1, 8)])\n", "Y = np.hstack([np.full(K-1, -8), np.linspace(-8, 8, K, endpoint=False)])\n", "\n", "fig = plt.figure(dpi=100, figsize=(6, 6))\n", "ax = fig.add_subplot(1,1,1)\n", "ax.scatter(D[:,0], D[:,1], marker='o', color=C)\n", "ax.set_xlabel('$x$')\n", "ax.set_ylabel('$y$')\n", "ax.set_aspect('equal')\n", "ax.set_xlim(-8, 8)\n", "ax.set_ylim(-8, 8)\n", "ax.grid()\n", "\n", "artists = []\n", "for x, y in zip(X, Y):\n", " q = np.array([-x, -y]) - np.array([x, y])\n", " artist = []\n", " artist += ax.plot([x, -x], [y, -y], ls='-', color='black', lw=1)\n", " artist += draw_projections(ax, q / np.linalg.norm(q), True)\n", " artists.append(artist)\n", "\n", "ani = matplotlib.animation.ArtistAnimation(fig, artists, interval=100)\n", "#ani.save('pca.mp4', writer=\"ffmpeg\")\n", "html = ani.to_jshtml()\n", "plt.close(fig)\n", "HTML(html)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "このアニメーションを注意深く観察すると、残差の二乗和が小さくなる、すなわち各三角形の高さ$\\epsilon_i$が短くなるとき、各三角形の底辺の長さ$a_i$が大きくなり、三角形が直線方向に大きく広がることが分かる。各点について三平方の定理を適用すると、\n", "\n", "\\begin{align}\n", "a_1^2 + \\epsilon_1^2 &= x_1^2 + y_1^2 \\\\\n", "a_2^2 + \\epsilon_2^2 &= x_2^2 + y_2^2 \\\\\n", "a_3^2 + \\epsilon_3^2 &= x_3^2 + y_3^2 \\\\\n", "a_4^2 + \\epsilon_4^2 &= x_4^2 + y_4^2 \\\\\n", "\\end{align}\n", "\n", "この4つの式の両辺を足すと、\n", "\n", "\\begin{align}\n", "a_1^2 + \\epsilon_1^2 + a_2^2 + \\epsilon_2^2 + a_3^2 + \\epsilon_3^2 + a_4^2 + \\epsilon_4^2 &= x_1^2 + y_1^2 + x_2^2 + y_2^2 + x_3^2 + y_3^2 + x_4^2 + y_4^2 \\\\\n", "\\left(a_1^2 + a_2^2 + a_3^2 + a_4^2\\right) + \\left(\\epsilon_1^2 + \\epsilon_2^2 + \\epsilon_3^2 + \\epsilon_4^2\\right) &= x_1^2 + y_1^2 + x_2^2 + y_2^2 + x_3^2 + y_3^2 + x_4^2 + y_4^2\n", "\\end{align}\n", "\n", "左辺の$\\left(a_1^2 + a_2^2 + a_3^2 + a_4^2\\right)$は「直線に射影した各点の原点からの距離の二乗和」、$\\left(\\epsilon_1^2 + \\epsilon_2^2 + \\epsilon_3^2 + \\epsilon_4^2\\right)$は「直線に射影した各点の残差の二乗和」である。右辺はデータが与えられると直線の傾きに依らず計算できる定数であり、今回のデータ$\\mathcal{D}_s$では$140$である。\n", "\n", "一般に、以下の関係が成り立つ。\n", "\n", "\\begin{align}\n", "\\sum_{i=1}^N a_i^2 + \\sum_{i=1}^N \\epsilon_i^2 &= \\sum_{i=1}^N \\left(x_i^2 + y_i^2\\right)\n", "\\end{align}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "ゆえに、残差の二乗和を最小にする方向ベクトル$\\bm{u}^*$を求めることは、$a_i$の二乗和を最大にする単位ベクトル$\\bm{u}^*$を求めることと等価である。\n", "\n", "\\begin{align}\n", "\\bm{u}^* &= \\mathop{\\rm argmin}\\limits_{\\|\\bm{u}\\|=1} \\sum_{i=1}^N \\epsilon_i^2 \\\\\n", "&= \\mathop{\\rm argmin}\\limits_{\\|\\bm{u}\\|=1} \\left\\{ \\sum_{i=1}^N \\left(x_i^2 + y_i^2\\right) - \\sum_{i=1}^N a_i^2 \\right\\} \\\\\n", "&= \\mathop{\\rm argmin}\\limits_{\\|\\bm{u}\\|=1} \\left\\{ (\\mbox{$\\bm{u}$によらない定数}) - \\sum_{i=1}^N a_i^2 \\right\\} \\\\\n", "&= \\mathop{\\rm argmax}\\limits_{\\|\\bm{u}\\|=1} \\sum_{i=1}^N a_i^2\n", "\\end{align}\n", "\n", "ところで、元のデータの重心が原点にあるとき、$a_i$の和も$0$になる。\n", "\n", "\\begin{align}\n", "\\sum_{i=1}^N a_i = \\sum_{i=1}^N \\begin{pmatrix}x_i \\\\ y_i\\end{pmatrix}^\\top \\bm{u}\n", "= \\begin{pmatrix}\\sum_{i=1}^N x_i \\\\ \\sum_{i=1}^N y_i\\end{pmatrix}^\\top \\bm{u}\n", "= \\begin{pmatrix}0 \\\\ 0\\end{pmatrix}^\\top \\bm{u}\n", "= 0\n", "\\end{align}\n", "\n", "これは、$a_i$の平均$\\bar{a}$が$0$であることを意味する。すると、\n", "\n", "\\begin{align}\n", "\\mathrm{Var}[\\bm{a}] = \\frac{1}{N}\\sum_{i=1}^N (a_i - \\bar{a})^2 = \\frac{1}{N}\\sum_{i=1}^N a_i^2\n", "\\end{align}\n", "\n", "であるから、\n", "\n", "\\begin{align}\n", "\\bm{u}^* = \\mathop{\\rm argmax}\\limits_{\\|\\bm{u}\\|=1} \\sum_{i=1}^N a_i^2 = \\mathop{\\rm argmax}\\limits_{\\|\\bm{u}\\|=1} N \\cdot \\mathrm{Var}[\\bm{a}] = \\mathop{\\rm argmax}\\limits_{\\|\\bm{u}\\|=1} \\mathrm{Var}[\\bm{a}]\n", "\\end{align}\n", "\n", "したがって、データ点を直線に射影し、近似的に表現するとき、その**残差の二乗和を最小化する**ようにベクトル$\\bm{u}$を選ぶことと、**射影された点の分散を最大化する**ようにベクトル$\\bm{u}$を選ぶことは**等価**である。後者は射影された点の分散を大きくとることで、元のデータ点の情報をできるだけ保存しようとしていると解釈できる。主成分分析は「元データを写像したときの分散が大きくなるような軸を見つける」と説明されることがあるが、これは「元データの情報をできるだけ豊富に表現できるような軸を見つける」や「元データを射影したときの残差ができるだけ小さくなるような軸を見つける」という動機に基づいている。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 第1主成分を求める\n", "\n", "これまでの議論により、データ$\\mathcal{D}_s$を「よく」射影するベクトル$\\bm{u}$を求めることは、$\\|\\bm{u}\\|=1$の制約下で、以下の目的関数$J$を最大化する問題に帰着した。\n", "\n", "\\begin{align}\n", "J = \\sum_{i=1}^4 a_i^2\n", "\\end{align}\n", "\n", "ここで、$\\bm{a} = \\begin{pmatrix}a_1 & a_2 & a_3 & a_4\\end{pmatrix}^\\top$と表すことにすると、\n", "\n", "\\begin{align}\n", "J = \\sum_{i=1}^4 a_i^2\n", " = \\begin{pmatrix}a_1 & a_2 & a_3 & a_4\\end{pmatrix} \\begin{pmatrix}a_1 \\\\ a_2 \\\\ a_3 \\\\ a_4\\end{pmatrix}\n", " = \\bm{a}^\\top \\bm{a}\n", "\\end{align}\n", "\n", "そこで、式{eq}`eq:definition-of-a`の$\\bm{a}$の定義に立ち返って整理してみる。\n", "\n", "$$\n", "\\begin{align}\n", "\\bm{a} = \\begin{pmatrix}a_1 \\\\ a_2 \\\\ a_3 \\\\ a_4\\end{pmatrix}\n", "= \\begin{pmatrix}\\begin{pmatrix}x_1 & y_1\\end{pmatrix} \\bm{u} \\\\ \\begin{pmatrix}x_2 & y_2\\end{pmatrix} \\bm{u} \\\\ \\begin{pmatrix}x_3 & y_3\\end{pmatrix} \\bm{u} \\\\ \\begin{pmatrix}x_4 & y_4\\end{pmatrix} \\bm{u}\\end{pmatrix}\n", "= \\begin{pmatrix}x_1 & y_1 \\\\ x_2 & y_2 \\\\ x_3 & y_3 \\\\ x_4 & y_4\\end{pmatrix} \\bm{u}\n", "= \\bm{X} \\bm{u}\n", "\\end{align}\n", "$$ (eq:definition-of-vector-a)\n", "\n", "なお、行列$\\bm{X} = \\mathbb{R}^{4 \\times 2}$はデータ点(事例)のベクトルを並べたものである。\n", "\n", "\\begin{align}\n", "\\bm{X} = \\begin{pmatrix}x_1 & y_1 \\\\ x_2 & y_2 \\\\ x_3 & y_3 \\\\ x_4 & y_4\\end{pmatrix}\n", "\\end{align}\n", "\n", "すると、目的関数$J$は、\n", "\n", "\\begin{align}\n", "J = \\bm{a}^\\top \\bm{a}\n", "= \\left(\\bm{X} \\bm{u}\\right)^\\top \\left(\\bm{X} \\bm{u}\\right)\n", "= \\left(\\bm{u}^\\top \\bm{X}^\\top\\right)\\left(\\bm{X} \\bm{u}\\right)\n", "= \\bm{u}^\\top \\left(\\bm{X}^\\top \\bm{X}\\right) \\bm{u}\n", "= \\bm{u}^\\top \\bm{S} \\bm{u}\n", "\\end{align}\n", "\n", "と整理できる。$\\bm{S} = \\bm{X}^\\top \\bm{X}$は対称行列である。\n", "\n", "\\begin{align}\n", "\\bm{S} = \\bm{X}^\\top \\bm{X} &= \\begin{pmatrix}x_1 & x_2 & x_3 & x_4 \\\\ y_1 & y_2 & y_3 & y_4\\end{pmatrix} \\begin{pmatrix}x_1 & y_1 \\\\ x_2 & y_2 \\\\ x_3 & y_3 \\\\ x_4 & y_4\\end{pmatrix} \\\\\n", "&= \\begin{pmatrix}x_1^2 + x_2^2 + x_3^2 + x_4^2 & x_1 y_1 + x_2 y_2 + x_3 y_3 + x_4 y_4 \\\\ x_1 y_1 + x_2 y_2 + x_3 y_3 + x_4 y_4 & y_1^2 + y_2^2 + y_3^2 + y_4^2\\end{pmatrix} \n", "\\end{align}\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$\\bm{u}$を求めることは、制約$\\|\\bm{u}\\|=1$のもとで目的関数$J$を最大化する問題であるので、ラグランジュの未定乗数法で制約なしの問題に書き換える。すると、$\\lambda$をラグランジュ乗数として、以下のラグランジュ関数$\\mathcal{L}(\\bm{u}, \\lambda)$を最大化する問題に帰着する。\n", "\n", "\\begin{align}\n", "\\mathcal{L}(\\bm{u}, \\lambda) &= \\bm{u}^\\top \\bm{S} \\bm{u} - \\lambda (\\bm{u}^\\top\\bm{u} - 1)\n", "\\end{align}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "ラグランジュ関数$\\mathcal{L}(\\bm{u}, \\lambda)$を$\\bm{u}$で偏微分すると、\n", "\\begin{align}\n", "\\frac{\\partial \\mathcal{L}(\\bm{u}, \\lambda)}{\\partial \\bm{u}} &= \\frac{\\partial}{\\partial \\bm{u}} \\left(\\bm{u}^\\top \\bm{S} \\bm{u}\\right) - \\frac{\\partial}{\\partial \\bm{u}} \\lambda (\\bm{u}^\\top\\bm{u} - 1) \\\\\n", "&= (\\bm{S} + \\bm{S}^\\top)\\bm{u} - 2\\lambda\\bm{u} \\\\\n", "&= 2(\\bm{S} \\bm{u} - \\lambda \\bm{u}) \\\\\n", "\\end{align}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "これを$0$とおくと、\n", "\n", "\\begin{align}\n", "\\frac{\\partial \\mathcal{L}(\\bm{u}, \\lambda)}{\\partial \\bm{u}} = 2(\\bm{S} \\bm{u} - \\lambda\\bm{u}) &= 0 \\\\\n", "\\bm{S} \\bm{u} &= \\lambda\\bm{u} \\\\\n", "(\\bm{S} - \\lambda \\bm{I}) \\bm{u} &= 0\n", "\\end{align}\n", "\n", "ゆえに、$\\bm{S} = \\bm{X}^\\top \\bm{X}$の固有値問題に帰着した。$\\lambda$が$\\bm{S}$の固有値であるので、特性方程式は、\n", "\n", "\\begin{align}\n", "\\mathrm{det}|\\bm{S} - \\lambda \\bm{I}| &= 0 \\\\\n", "\\mathrm{det}\\begin{vmatrix}S_{1,1} - \\lambda & S_{1,2} \\\\ S_{2,1} & S_{2,2} - \\lambda \\end{vmatrix} &= 0 \\\\\n", "(S_{1,1} - \\lambda) (S_{2,2} - \\lambda) - S_{1,2} S_{2,1} &= 0\n", "\\end{align}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "さて、データ$\\mathcal{D}_s$の例で実際に計算を進める。\n", "\n", "\\begin{align}\n", "\\bm{S} &= \\bm{X}^\\top \\bm{X} = \\begin{pmatrix}-7 & -3 & 4 & 6 \\\\-2 & -3 & 1 & 4\\end{pmatrix}\\begin{pmatrix}-7 & -2 \\\\ -3 & -3 \\\\ 4 & 1 \\\\ 6 & 4\\end{pmatrix} = \\begin{pmatrix}110 & 51 \\\\ 51 & 30\\end{pmatrix}\n", "\\end{align}\n", "\n", "であるから、特性方程式は、\n", "\n", "\\begin{align}\n", "(110 - \\lambda)(30 - \\lambda) - 51^2 &= 0 \\\\\n", "\\lambda^2 - 140x + 699 &=0 \\\\\n", "\\lambda &= 70 \\pm \\sqrt{4201} \\\\\n", "\\lambda &\\approx 134.8, 5.185 \n", "\\end{align}\n", "\n", "$J$を最大化する解として、$\\lambda \\approx 134.8$と$\\lambda \\approx 5.185$のどちらを選べばよいのか? $\\bm{S} \\bm{u} = \\lambda\\bm{u}$の両辺に左から$\\bm{u}^\\top$をかけると、左辺は目的関数$J$に一致する。右辺は$\\|\\bm{u}\\|=1$であることに注意すると、\n", "\n", "\\begin{align}\n", "\\bm{u}^\\top\\bm{S} \\bm{u} &= \\bm{u}^\\top \\lambda \\bm{u} \\\\\n", "J &= \\lambda \\bm{u}^\\top \\bm{u} = \\lambda\n", "\\end{align}\n", "\n", "したがって、求めた固有値$\\lambda$が目的関数の値となる。そこで、固有値のうち大きい方を$\\lambda_1$と書くことにして、$\\lambda_1 = 134.8$とする。$\\bm{S}$の固有値問題の等式に$\\lambda = 134.8$を代入すると、\n", "\n", "\\begin{align}\n", "(\\bm{S} - 134.8 \\bm{I}) \\bm{u} &= 0 \\\\\n", "\\begin{pmatrix}-24.8 & 51 \\\\ 51 & -104.8\\end{pmatrix} \\bm{u} &= 0 \\\\\n", "\\end{align}\n", "\n", "であるから、\n", "\n", "\\begin{align}\n", "\\begin{cases}\n", "-24.8 u_1 + 51 u_2 &= 0 \\\\\n", "51 u_1 - 104.8 u_2 &= 0\n", "\\end{cases}\n", "\\Longleftrightarrow\n", "\\begin{cases}\n", "0.486 u_1 - u_2 &= 0 \\\\\n", "0.486 u_1 - u_2 &= 0\n", "\\end{cases}\n", "\\end{align}\n", "\n", "したがって、$c$をスカラー値の定数として、\n", "\n", "\\begin{align}\n", "\\bm{u} = c\\begin{pmatrix}1 \\\\ 0.486\\end{pmatrix}\n", "\\end{align}\n", "\n", "と表される。さらに制約$\\|\\bm{u}\\|=1$を満たすように$\\bm{u}$を求めると、\n", "\n", "\\begin{align}\n", "\\bm{u} = \\begin{pmatrix}0.899 \\\\ 0.437\\end{pmatrix}\n", "\\end{align}\n", "\n", "このように求めた$\\bm{u}$を**第1主成分**(the first principal component)と呼ぶ。$\\lambda_1$は目的関数の値そのものであるから、データを第1主成分の軸に写像したときの分散は$\\lambda_1 = 134.8$である。各データ点$(x_i, y_i)$を第1主成分の直線上に写像したときの位置$a_i$を**第1主成分得点**(the first principal component score)と呼ぶ。式{eq}`eq:definition-of-vector-a`を用いて実際に主成分得点を求めてみると、\n", "\n", "\\begin{align}\n", "\\bm{a} = \\bm{X}\\bm{u} = \\begin{pmatrix}-7 & -2 \\\\ -3 & -3 \\\\ 4 & 1 \\\\ 6 & 4\\end{pmatrix} \\begin{pmatrix}0.899 \\\\ 0.437\\end{pmatrix} \\approx \\begin{pmatrix}-7.17 \\\\ -4.01 \\\\ 4.03 \\\\ 7.15\\end{pmatrix}\n", "\\end{align}\n", "\n", "実際に求めた$\\bm{u}$を可視化した(おおよそ、これまで例に用いていた$y=\\frac{1}{2}x$に近いが、それよりも少しずれた直線が解であった)。" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhAAAAIJCAYAAAD02QTaAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAA9hAAAPYQGoP6dpAABcm0lEQVR4nO3de3zP5f/H8ce1g9mY82xOUSRncmpKSA75SjpKvhTfolR+9I1CDqWGklKkJKUI5StUpKhEKUQUwiqWNKfNeWyfbdfvj88sZ3uz7b3PZ8/77babfa7P+/C6bLOn6329r7ex1iIiIiLiRIDbBYiIiIjvUYAQERERxxQgRERExDEFCBEREXFMAUJEREQcU4AQERERxxQgRERExDEFCBEREXFMAUJEREQcU4AQERERx3wqQBhjAo0xzxpjthljjhljfjfGDDXGGLdrExERyU+C3C7AoSeB3sB9wEagIfAOcBB41cW6RERE8hVfCxDXAvOttQsyXm83xtwDNHaxJhERkXzH1wLECqCXMaaqtXarMaYu0BT477l2MMaEACGnNZcAEnOuTBEREZ8RDvxtHT6e29cCxGigCLDZGJMGBAJPWWvfP88+g4DhuVGciIiIjyoP7HSyg3EYOFxljOkMjAEG4J0DUQ8YB/zXWvvuOfY5fQQiHPhr69atlChRIkfrdYPH4+Hrr7/mhhtuIDg42O1ycoT66Pv8vX+gPvoDf+8fQGJiIlWrVgUoaq095GRfXxuBGAOMttbOynj9izGmIt5RhrMGCGttMpB84vWJGzZKlChByZIlc7ZaF3g8HsLCwihZsqTffsOrj77P3/sH6qM/8Pf+XSqfuo0TCAPST2tLw/f6ISIi4tN8bQTiE+ApY8yfeC9hXI13AuXbrlYlIiKSz/hagOgDPAtMBEoDfwOTgBFuFiUiIpLf+FSAsNYeBvplfIiIiIhLNHdAREREHFOAEBEREccUIERERMQxBQgRERFxTAFCREREHFOAEBEREccUIERERMQxBQgRERFxTAFCREREHFOAEBEREccUIERERMQxBQgRERFxTAFCREREHFOAEBEREccUIERERMQxBQgRERFxTAFCREREHFOAEBEREccUIERERMQxBQgRERFxTAFCREREHFOAEBEREccUIERERMQxBQgRERFxTAFCREREHFOAEBEREccUIERERMQxBQgRERFxTAFCREREHFOAEBEREccUIERERMQxBQgRERFxTAFCREREHFOAEBEREccUIERERMQxBQgRERFxTAFCREREHFOAEBEREccUIERERMQxBQgRERFxTAFCREREHFOAEBEREccUIERERMQxBQgRERFxTAFCREREHFOAEBEREcd8LkAYY8oZY6YbYxKMMceMMb8YYxq6XZeIiEh+EuR2AU4YY4oD3wFfA+2AvcCVwH436xIREclvfCpAAE8CO6y1PU5q23a+HYwxIUDISU3hAB6PB4/Hk/0VuuxEn/yxbyeoj77P3/sH6qM/8Pf+waX1zVhrs7GUnGWM2QR8DpQHmgM7gYnW2snn2edpYPjp7TNmzCAsLCyHKhUREcn7kpKS6NKlC0BRa+0hJ/v6WoA4nvHpS8BsoBHwCvCQtfbdc+xzthGIv+Lj4ylZsmROlusKj8fD4sWLad26NcHBwW6XkyPUR9/n7/0D9dEf+Hv/ABISEihTpgxcRIDwtUsYAcCP1trBGa9/MsbUAh4CzhogrLXJQPKJ18YYAIKDg/32GwL8v3+gPvoDf+8fqI/+wJ/7dyn98rW7MOKBTae1/Qpc5kItIiIi+ZavBYjvgKtOa6sKxLlQi4iISL7lawHiZSDaGDPYGFPFGNMF6AW85nJdIiIi+YpPBQhr7WrgNuAeYAMwFOhnrX3f1cJERETyGV+bRIm19lPgU7frEBERyc98agRCRERE8gYFCBEREXFMAUJEREQcU4AQERERxxQgRERExDEFCBEREXFMAUJEREQcU4AQERERxxQgRERExDEFCBEREXFMAUJEREQcU4AQERERxxQgRERExDEFCBEREXFMAUJEREQcU4AQERERxxQgRERExDEFCBEREXFMAUJEREQcU4AQERERxxQgRERExDEFCBEREXFMAUJEREQcU4AQERERxxQgRERExDEFCBEREXFMAUJEREQcU4AQERERxxQgRETELyQkJFC6dGm2b9/udinn1LlzZ8aOHet2GdlCAUJERPxCTEwMHTt2pFKlSm6Xck5DhgwhJiaGgwcPul3KJVOAEBERn5eUlMSUKVO4//773S7lvGrVqkXlypWZPn2626VcMgUIERHxeQsXLiQkJITo6OjMtpkzZxIaGkp8fHxmW48ePahTp84ljQCUL1+eiRMnntK2YsUKwsLCiIuLu+D+HTp0YNasWRd9/rxCAUJERHze8uXLadCgwSltnTt3pmrVqowcORKA4cOHs2TJEj777DOKFi160ee65pprWL16deZray39+vXjscceo2LFihfcv3HjxqxatYrk5OSLriEvUIAQERGfFxcXR9myZU9pM8YQExPD5MmTiYmJYfz48SxatIhy5cplbpOUlETFihXp379/ls8VHR19SoCYNm0aO3bsYNCgQVk6btmyZUlJSWHXrl1OupjnKECIiIjPO3bsGAULFjyj/eabb6ZGjRqMGDGCuXPnUrNmzVPej4mJOeWyR1ZER0fz66+/cuTIEY4ePcrgwYN57rnnKFy4cJaOGxoaCnhDhi9TgBAREZ9XqlQp9u/ff0b7okWL2Lx5M2lpaURGRp7yXmxsLJs3b6Zdu3aOztWgQQMCAgJYu3Ytzz//PBEREfTo0SPLx01MTAQgIiLC0XnzGgUIERHxeVdffTWbNm06pW3t2rV06tSJKVOmcOONNzJ06NBT3u/fvz+jRo1yfK6wsDBq167NnDlzePHFF3n55ZcJCPjn1+mFjrthwwbKly9PqVKlHJ87L1GAEBERn9e2bVs2btyYOQqxfft22rdvz+DBg7nnnnsYMWIEc+bMYe3atQDMnz+fqlWrUrVq1Ys6X3R0NOPHj6dt27a0aNEisz0rx12+fDlt2rS5qPPmJQoQIiLi82rXrk39+vX58MMPSUxM5KabbqJjx44MHDgQ8N450a5dOwYPHgzADz/8wKxZs6hUqRL9+/dn8uTJjBgxIvN4U6dOpUCBAuc8X926dQkODmbMmDGntF/ouMePH2fevHn07NkzO7vviiC3CxAREckOw4YNY8CAAfTs2ZPNmzef8f6CBQsyPx81alTmZYapU6eyYcMGhg0blvn+tm3baNas2TnPNWvWLB599FGqVKlySvuFjvvOO+/QuHFjxxM38yIFCBER8Qvt27cnNjaWnTt3UqFChUs61meffca4cePYu3dvZlt6ejp79+5lypQpxMbGMn/+fMfHDQ4OZvz48ZdUW16hACEiIn6jX79+jvfp3r37GW2rVq3C4/GwcOHCzLZly5bRsmVLqlWrxpw5cyhSpIjj4z7wwAOO68urFCBERESyoEWLFqSnp7tdRp6hSZQiIiLimAKEiIjIyY78AWsfh4V1va9XdIXdX7tbUx7k0wHCGDPQGGONMePcrkVERPzA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z194AZKTz799XnboEAcHDeJwqVIUefppih49yoEiRTgyejRF9u2jyNNP51p4AOjZsyfWWkqUKEHhwoXZtm0bAEFBQYwbN45NmzbxxRdf0K9fP46eNHPygw+galXNhRARcUIBwg3du0O5cvD33/DOO25X49z+/ezv14+jpUtTdPRowo8dI7F4cY6OG0exvXsp/OSTULBgrpbk8Xjo3Lkz1157LatXr2bdunVUyniqVpkyZahXrx4AUVFRlCpVisTEf57B9vff3mU7Ro0690NURUTkVAoQbggJgSee8H4+enTefzTkCXv3kvDQQxyLjKT4K69QKDmZhIgIjk2aRIk9eyjUty8UKOBKaXPnzuW3335j4sSJNGjQgCpVqmQuW36yNWvWkJaWRoUKFTLbevXyzun84w+YMSM3qxYR8V0KEDkgS3cC9OwJpUtDXBxMn577RToRH8++7t05XqYMJSdNItTjYW+ZMiS/9x4l4+MJ7dXLe1uDi1JSUoiPj2fatGls376dDRs2MGnSJFJPGlJITEzk3nvv5c033zxl30KFvPNZAUaOPOURJiIicg4KENnsxJ0AQ4cOZcuWLaxYsYLHH3/8zA1DQ6F/f+/nefW31o4d7O3cmZTy5Sn17rsUTEtjz2WXkfLhh0T89Rch3brlmWdid+7cmUcffZTBgwdTtWpVWrVqxbJlywjKCDbJycnceuutDBw4kGuvvfaM/R95BIoXhy1b4H//y+3qRUR8jwJENjv5ToDLLruMmjVr0r59ewBuu+02ihcvzp133unduHdviIqCFi3y1nKIf/zBnltvxVOxIhEffECB9HR2V6mC5+OPKb19OwXuuuvMh4S5LCgoiLFjx7Jjxw5SUlLYtWsX77//PgDWWrp3707Lli3p1q3bWfcPD4d+/byfP/ccpOe9x7SJiOQpeeu3gB84150AAH379uW99977Z+PChb0X3idPhhxeIyFLtmxh9003kValCqXnzyfYWnbVqEHaF18QuXUrwR06eO8i8THfffcdH3zwAfPmzaNevXrUq1ePX3755Yzt+vTxBokNG7wLhoqIyLlpHYhsdPKdAFOmTKFo0aKZdwIAtGjRgqVLl566U2hortZ4Nvbnn9n9f/9H6W++ITKjbVe9epR+9VWirr/e1dqyQ9OmTUnPwpBC8eIwYQJccQU0bZoLhYmI+DAFiGx04k6A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IiMjeeGFF+jVqxeFChVypZ6SJUty6NAhPv74Y2rUqMEnn3zCqFGjKFeunGbrO9CvX78sbde0aVPS09PP+f6qVavOaFu2bBktW7akWrVqzJkz56wh80LHfeCBB7JUn4hIXpVvA8TPP//Ma6+9xkcffUT58uUZP348//nPf866hkBu6tChA/fffz/dunUjNDSUrl270qlTpywtjSy5o0WLFucNByIi+UG+DRAtW7bkiiuu4M033+Tee++lQIECbpcEQEBAAG+88QZvvPGG26WIiIick08GCGNMCLASqAtcba1d5/QYr732Gr169SIoyPf+Clq1asX69es5evQo5cuXZ/bs2TRp0sTtskREJB/xvd+eXi8Af+MNEBfl7rvv9snwALBkyRK3SxARkXzO536DGmPaAW2AO4B2Wdg+BAg5qSkcvI/d9seloU/0yR/7doL66Pv8vX+gPvoDf+8fXFrfjLU2G0vJWcaYSGANcCuwD9jGBS5hGGOeBoaf3j5jxgzCwsJypE4RERFfkJSURJcuXQCKWmsPOdnXZwKE8S6KsBD4zlr7nDGmElkLEGcbgfgrPj6ekiVL5mDF7vB4PCxevJjWrVsTHBzsdjk5Qn30ff7eP1Af/YG/9w+8z3nKWF3ZcYBw/RKGMWY08OQFNquO97JFODDKyfGttclA8knnA7wL+fjrNwT4f/9AffQH/t4/UB/9gT/371L65XqAAMYCUy+wzR9AS6AJkHzaswl+NMa8b629L2fKExERkdO5HiCstXuBvRfazhjzf8CQk5rKAp8Dd+O9pVNERERyiesBIqustX+e/NoYcyTj09+ttX+5UJKIiEi+pcd5i4iIiGM+MwJxOmvtdsBcaDsRERHJfhqBEBEREccUIERERMQxBQgRERFxTAFCREREHFOAEBEREccUIERERMQxBQgRERFxTAFCREREHFOAEBEREccUIERERMQxBQgRERFxTAFCREREHFOAEBEREccUIERERMQxBQgRERFxTAFCREREHFOAEBEREccUIERERMQxBQgRERFxTAFCREREHFOAEBEREccUIERERMQxBQgRERFxTAFCREREHFOAEBEREccUIERERMQxBQgRERFxTAFCREREHFOAEBEREccUIERERMQxBQgRERFxTAFCREREHFOAEBEREccUIERERMQxBQgRERFxTAFCREREHFOA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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "u = np.array([0.89920519, 0.43752718])\n", "uy = 8 * u[1] / u[0]\n", "\n", "fig = plt.figure(dpi=100, figsize=(6, 6))\n", "ax = fig.add_subplot(1,1,1)\n", "ax.scatter(D[:,0], D[:,1], marker='o', color=C)\n", "ax.plot([-8, 8], [-uy, uy], ls='-', color='black', lw=1)\n", "draw_projections(ax, u / np.linalg.norm(u), show_a=True, show_e=True, show_xy=True)\n", "ax.set_xlabel('$x$')\n", "ax.set_ylabel('$y$')\n", "ax.set_aspect('equal')\n", "ax.set_xlim(-8, 8)\n", "ax.set_ylim(-8, 8)\n", "ax.grid()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 第2主成分を求める\n", "\n", "先ほど求めた第1主成分の軸は元データを近似的によく表現しているが、残差$\\epsilon_i$が残っている。残差は各データ点から第1主成分の直線に降ろした垂線の長さであるから、この残差を表現するには第1主成分のベクトルと直交するベクトルを求めればよい。すなわち、残差を表現する直線の方向ベクトルを$\\bm{v}$とおき、$\\|\\bm{v}\\|=1$かつ$\\bm{u}^\\top\\bm{v}=0$を満たすベクトル$\\bm{v}$を求めればよい。$u_1 v_1 + u_2 v_2 = 0$であるから、\n", "\n", "$$\n", "\\begin{align}\n", "\\bm{v} = \\begin{pmatrix}-0.437 \\\\ 0.899\\end{pmatrix}\n", "\\end{align}\n", "$$ (eq:second-pc)\n", "\n", "と求めることができる。この$\\bm{v}$が**第2主成分**(the second principal component)である。例として用いている$\\mathcal{D}_s$は2次元のデータであるので、第3成分以降の軸を求める必要はない。\n", "\n", "ただ、この求め方では2次元以上のデータに対応できないので、目的関数$J$を最大化しても$\\bm{v}$が求まることを説明する。データ$\\mathcal{D}_s$を2番目に「よく」射影するベクトル$\\bm{v}$を求めることは、$\\|\\bm{v}\\|=1$および$\\bm{u}^\\top \\bm{v}=0$の制約下で、以下の目的関数$J$を最大化すればよい。\n", "\n", "\\begin{align}\n", "J = \\bm{v}^\\top \\bm{S} \\bm{v}\n", "\\end{align}\n", "\n", "これは、以下のラグランジュ関数$\\mathcal{L}(\\bm{v}, \\lambda, \\alpha)$を最大化する問題に帰着する。\n", "\n", "\\begin{align}\n", "\\mathcal{L}(\\bm{v}, \\lambda, \\alpha) &= \\bm{v}^\\top \\bm{S} \\bm{v} - \\lambda (\\bm{v}^\\top\\bm{v} - 1) - \\alpha \\bm{u}^\\top \\bm{v}\n", "\\end{align}\n", "\n", "ただし、$\\lambda$と$\\alpha$はラグランジュ乗数である。ラグランジュ関数$\\mathcal{L}(\\bm{v}, \\lambda, \\alpha)$を$\\bm{v}$で偏微分すると、\n", "\n", "\\begin{align}\n", "\\frac{\\partial \\mathcal{L}(\\bm{v}, \\lambda, \\alpha)}{\\partial \\bm{v}} &= \\frac{\\partial}{\\partial \\bm{v}} \\left(\\bm{v}^\\top \\bm{S} \\bm{v}\\right) - \\frac{\\partial}{\\partial \\bm{v}} \\left(\\lambda (\\bm{v}^\\top\\bm{v} - 1)\\right) - \\frac{\\partial}{\\partial \\bm{v}} \\left(\\alpha \\bm{u}^\\top \\bm{v}\\right) \\\\\n", "&= (\\bm{S} + \\bm{S}^\\top)\\bm{v} - 2\\bm{v} - \\alpha \\bm{u} \\\\\n", "&= 2\\bm{S} \\bm{v} - 2\\lambda\\bm{v} - \\alpha \\bm{u} \\\\\n", "\\end{align}\n", "\n", "これを$0$とおくと、\n", "\n", "\\begin{align}\n", "2\\bm{S} \\bm{v} - 2\\lambda\\bm{v} - \\alpha \\bm{u} &= 0\n", "\\end{align}\n", "\n", "ここで、左から$\\bm{u}^\\top$をかけ、$\\bm{u}^\\top\\bm{v}=0$と$\\bm{u}^\\top\\bm{u}=1$であることに注意すると、\n", "\n", "\\begin{align}\n", "2\\bm{u}^\\top \\bm{S} \\bm{v} - 2\\lambda\\bm{u}^\\top\\bm{v} - \\alpha \\bm{u}^\\top\\bm{u} &= 0 \\\\\n", "2\\bm{u}^\\top\\bm{S} \\bm{v} - \\alpha &= 0 \\\\\n", "\\alpha &= 2\\bm{u}^\\top\\bm{S} \\bm{v} = 2\\bm{v}^\\top\\bm{S} \\bm{u} \\\\\n", "\\end{align}\n", "\n", "なお、最終行の式変形では、$\\bm{u}^\\top\\bm{S} \\bm{v}$がスカラーであるから、$(\\bm{u}^\\top\\bm{S} \\bm{v})^\\top = \\bm{v}^\\top\\bm{S} \\bm{u}$が成り立つことを用いた。ここで、第1主成分を求めたときの固有値問題により、$\\bm{S} \\bm{u} = \\lambda_1 \\bm{u}$であるから、\n", "\n", "\\begin{align}\n", "\\alpha &= 2\\bm{v}^\\top (\\bm{S} \\bm{u}) = 2\\bm{v}^\\top (\\lambda_1 \\bm{u}) = 2 \\lambda_1 \\bm{v}^\\top \\bm{u} = 0\n", "\\end{align}\n", "\n", "したがって、$\\alpha = 0$であるから、ラグランジュ関数$\\mathcal{L}(\\bm{v}, \\lambda, \\alpha)$を$\\bm{v}$で偏微分して$0$とおいた式は、\n", "\n", "\\begin{align}\n", "2\\bm{S} \\bm{v} - 2\\lambda\\bm{v} &= 0 \\\\\n", "\\bm{S} \\bm{v} &= \\lambda\\bm{v}\n", "\\end{align}\n", "\n", "となり、再び$\\bm{S}$の固有値問題に帰着した。そこで、先ほど求めた固有値のうち小さい方を$\\lambda_2$と書くことにして、$\\lambda_2 = 5.185$とする。$\\bm{S}$の固有値問題の等式に$\\lambda = 5.185$を代入すると、\n", "\n", "\\begin{align}\n", "(\\bm{S} - 5.185 \\bm{I}) \\bm{v} &= 0 \\\\\n", "\\begin{pmatrix}104.8 & 51 \\\\ 51 & 24.82\\end{pmatrix} \\bm{v} &= 0 \\\\\n", "\\end{align}\n", "\n", "であるから、\n", "\n", "\\begin{align}\n", "\\begin{cases}\n", "104.8 v_1 + 51 v_2 &= 0 \\\\\n", "51 v_1 + 24.82 v_2 &= 0\n", "\\end{cases}\n", "\\Longleftrightarrow\n", "\\begin{cases}\n", "2.055 v_1 + v_2 &= 0 \\\\\n", "2.055 v_1 + v_2 &= 0\n", "\\end{cases}\n", "\\end{align}\n", "\n", "したがって、$c$をスカラー値の定数として、\n", "\n", "\\begin{align}\n", "\\bm{v} = c\\begin{pmatrix}1 \\\\ -2.055\\end{pmatrix}\n", "\\end{align}\n", "\n", "と表される。さらに制約$\\|\\bm{v}\\|=1$を満たすように$\\bm{v}$を求めると、\n", "\n", "\\begin{align}\n", "\\bm{v} = \\begin{pmatrix}0.438 \\\\ -0.899\\end{pmatrix} \n", "\\end{align}\n", "\n", "このように求めた$\\bm{v}$を第2主成分と呼ぶ。式{eq}`eq:second-pc`で求めた$\\bm{v}$と逆向きであるが、固有値問題の解から同じ第2主成分が求まった。$\\lambda_2$も目的関数の値そのものであるから、データを第2主成分の軸に写像したときの分散は$\\lambda_2 = 5.185$である。式{eq}`eq:definition-of-vector-a`を用いて第2主成分得点を求めてみると、\n", "\n", "\\begin{align}\n", "\\bm{a} = \\bm{X}\\bm{v} = \\begin{pmatrix}-7 & -2 \\\\ -3 & -3 \\\\ 4 & 1 \\\\ 6 & 4\\end{pmatrix} \\begin{pmatrix}0.438 \\\\ -0.899\\end{pmatrix} \\approx \\begin{pmatrix}1.26 \\\\ -1.39 \\\\ -0.85 \\\\ 0.97\\end{pmatrix}\n", "\\end{align}\n", "\n", "このデータに対する主成分分析の締めくくりとして、データ$\\mathcal{D}_s$の第1主成分$\\bm{u}$と第2主成分$\\bm{v}$を可視化した。" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "u = np.array([0.89920519, 0.43752718])\n", "uy = 8 * u[1] / u[0]\n", "\n", "v = np.array([-0.43752718, 0.89920519])\n", "vy = 8 * v[1] / v[0]\n", "\n", "fig = plt.figure(dpi=100, figsize=(6, 6))\n", "ax = fig.add_subplot(1,1,1)\n", "ax.scatter(D[:,0], D[:,1], marker='o', color=C)\n", "ax.plot([-8, 8], [-uy, uy], ls='-', color='black', lw=1, label='PC1')\n", "ax.plot([-8, 8], [-vy, vy], ls=':', color='black', lw=1, label='PC2')\n", "draw_projections(ax, u / np.linalg.norm(u), show_xy=True)\n", "draw_projections(ax, v / np.linalg.norm(v))\n", "ax.set_xlabel('$x$')\n", "ax.set_ylabel('$y$')\n", "ax.set_aspect('equal')\n", "ax.set_xlim(-8, 8)\n", "ax.set_ylim(-8, 8)\n", "ax.legend()\n", "ax.grid()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 実装" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "例として用いてきたデータ$\\bm{X}$に対して、主成分分析を行う。\n", "\n", "\\begin{align*}\n", "\\bm{X} = \\begin{pmatrix}-7 & -2 \\\\ -3 & -3 \\\\ 4 & 1 \\\\ 6 & 4\\end{pmatrix}\n", "\\end{align*}" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "X = np.array([[-7, -2], [-3, -3], [4, 1], [6, 4]])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[sklearn.decomposition.PCA](https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html)で$X$の主成分分析を行う。" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "PCA(n_components=2)" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.decomposition import PCA\n", "pca = PCA(n_components=2)\n", "pca.fit(X)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "第1主成分と第2主成分。先ほど求めた主成分と符号が異なっているが、実質的に同じものである。" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[-0.89920519, -0.43752718],\n", " [ 0.43752718, -0.89920519]])" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pca.components_" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "第1主成分と第2主成分に対応する固有値。" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([134.81512169, 5.18487831])" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pca.singular_values_ ** 2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "主成分得点を求める。" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 7.16949066, -1.26427988],\n", " [ 4.0101971 , 1.38503402],\n", " [-4.03434793, 0.85090353],\n", " [-7.14533984, -0.97165767]])" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pca.transform(X)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 確認問題\n", "\n", "先ほどの実装では、[sklearn.decomposition.PCA](https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html)を用いて主成分分析を行ったが、行列$\\bm{S} = \\bm{X}^\\top \\bm{X}$に対して固有値問題を解くことで、主成分分析が得られることを確認したい。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**(1) $\\bm{S}$の計算**\n", "\n", "$\\bm{X}$に対して、行列$\\bm{S} = \\bm{X}^\\top \\bm{X}$を求めよ。\n", "\n", "\\begin{align*}\n", "\\bm{X} = \\begin{pmatrix}-7 & -2 \\\\ -3 & -3 \\\\ 4 & 1 \\\\ 6 & 4\\end{pmatrix}\n", "\\end{align*}" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**(2) 固有値問題の解**\n", "\n", "[numpy.linalg.eig](https://numpy.org/doc/stable/reference/generated/numpy.linalg.eig.html)等で$\\bm{S}$の固有値問題を解き、固有値と固有ベクトルを求めよ。" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**(3) 第1主成分と第2主成分**\n", "\n", "第1主成分と第1主成分軸における分散、第2主成分と第2主成分軸における分散を求めよ。" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**(4) 第1主成分得点と第2主成分得点**\n", "\n", "第1主成分得点と第2主成分得点を求めよ。" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "tags": [ "remove-cell" ] }, "source": [ "---\n", "\n", "[機械学習帳](https://chokkan.github.io/mlnote/) © Copyright 2020-2022 by [岡崎 直観 (Naoaki Okazaki)](https://www.chokkan.org/). この作品はクリエイティブ・コモンズ 表示 - 非営利 - 改変禁止 4.0 国際 ライセンスの下に提供されています。 \"クリエイティブ・コモンズ・ライセンス\" ただし、作品中のコードセル部分はMITライセンスの下に提供されています。" ] } ], "metadata": { "@context": { "CreativeWork": "http://schema.org/CreativeWork", "Organization": "http://schema.org/Organization", "Person": "http://schema.org/Person", "author": "http://schema.org/author", "copyrightHolder": "http://schema.org/copyrightHolder", "copyrightYear": "http://schema.org/copyrightYear", "license": "http://schema.org/license", "name": "http://schema.org/name", "title": "http://schema.org/name", "url": "http://schema.org/url" }, "@type": "CreativeWork", "author": [ { "@type": "Person", "name": "Naoaki Okazaki", "url": "https://www.chokkan.org/" } ], "copyrightHolder": [ { "@type": "Person", "name": "Naoaki Okazaki", "url": "https://www.chokkan.org/" } ], "copyrightYear": 2022, "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.8.10" }, "license": "https://creativecommons.org/licenses/by-nc-nd/4.0/deed.ja", "title": "機械学習帳" }, "nbformat": 4, "nbformat_minor": 4 }