{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "view-in-github"
},
"source": [
"
"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Oy4cp14Yxt9i"
},
"source": [
"# 主成分分析 (主成分解析、Principal component analysis : PCA)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "FRvRDhfoxt9w"
},
"source": [
"## 概要\n",
"\n",
"- 主成分分析は、教師なし線形変換法の1つ\n",
" - データセットの座標軸を、データの分散が最大になる方向に変換し、元の次元と同じもしくは、元の次元数より低い新しい特徴部分空間を作成する手法\n",
"- 主なタスク\n",
" - 次元削減\n",
"- 次元削減を行うことで以下の目的を達成できる\n",
" - 特徴抽出\n",
" - データの可視化\n",
"- 次元削減を行うメリット\n",
" - 計算コスト(計算時間、メモリ使用量)を削減できる\n",
" - 特徴量を削減したことによる情報の喪失をできるだけ小さくする\n",
" - モデルを簡素化できる(パラメータが減る)ため、オーバーフィッティングを防げる\n",
" - 人間が理解可能な空間にデータを投影することができる(非常に高次元な空間を、身近な3次元、2次元に落とし込むことができる)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "vXsQZ8aVBw9x"
},
"source": [
"## 応用例\n",
"\n",
"- タンパク質分子の立体構造モデルの構造空間の次元削減と可視化\n",
"- タンパク質の全原子モデルの立体構造は、分子内に含まれる原子の座標情報で表すことができる (原子数 × 3 (x, y, z) 次元のベクトル)\n",
"\n",
"以下は、タンパク質の分子シミュレーションで使われるモデルの1例。 \n",
"(紫色とオレンジ色で表されたリボンモデルがタンパク質で、周りに水とイオンが表示されている) \n",
"(この場合、3547 個の原子 --> 10641 次元)\n",
"\n",
"
\n",
"\n",
"主成分分析により、この立体構造空間を、2次元空間に投影することができる。 \n",
"以下は、その投影に対して自由エネルギーを計算した図。\n",
"\n",
"\n",
"\n",
"2次元空間上の1点が、1つの立体構造を表している。 \n",
"つまり、この例では、もともと10641次元あった空間を2次元にまで削減している。\n",
"\n",
"Ref) [Nishigami, H., Kamiya, N., & Nakamura, H. (2016). Revisiting antibody modeling assessment for CDR-H3 loop. Protein Engineering, Design and Selection, 29(11), 477-484.](https://academic.oup.com/peds/article/29/11/477/2462452)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "leHV9cUixt9x"
},
"source": [
"## 主成分分析 (PCA) が行う座標変換のイメージ\n",
"\n",
"以下は、PCAが行う座標変換の例\n",
"\n",
"$x_1$ , $x_2$ は、データセットの元々の座標軸であり、 \n",
"PC1, PC2 は座標変換後に得られる新しい座標軸、主成分1、主成分2 である (Principal Components)。 \n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "qwwB0trAxv3n"
},
"source": [
"
"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "W6Ht0VniKJFj"
},
"source": [
"\n",
"- PCA は、高次元データにおいて分散が最大となる方向を見つけ出し、座標を変換する (これはつまり、すべての主成分が、他の主成分と相関がない(直交する) ように座標変換している)\n",
"- 最初の主成分 (PC1) の分散が最大となる"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "mZ5tZLKQxt91"
},
"source": [
"## 主成分分析の主要な手順\n",
"\n",
"d 次元のデータを k 次元に削減する場合\n",
"\n",
"1. d 次元のデータの標準化(特徴量間のスケールが異なる場合のみ)\n",
"1. 分散共分散行列の作成\n",
"1. 分散共分散行列の固有値と固有ベクトルを求める\n",
"1. 固有値を降順にソートして、固有ベクトルをランク付けする\n",
"1. 最も大きい k 個の固有値に対応する k 個の固有ベクトルを選択 (k ≦ d)\n",
"1. k 個の固有ベクトルから射影(変換)行列 W を作成\n",
"1. 射影(変換)行列を使って d 次元の入力データセットを新しい k 次元の特徴部分空間を取得する\n",
"\n",
"---\n",
"\n",
"固有値問題を解くことで、線形独立な基底ベクトルを得ることができる。 \n",
"詳細は、線形代数の書籍等を参考にする(ここでは詳細な解説をしない)。\n",
"\n",
"参考) \n",
"\n",
"https://dora.bk.tsukuba.ac.jp/~takeuchi/?%E7%B7%9A%E5%BD%A2%E4%BB%A3%E6%95%B0II%2F%E5%9B%BA%E6%9C%89%E5%80%A4%E5%95%8F%E9%A1%8C%E3%83%BB%E5%9B%BA%E6%9C%89%E7%A9%BA%E9%96%93%E3%83%BB%E3%82%B9%E3%83%9A%E3%82%AF%E3%83%88%E3%83%AB%E5%88%86%E8%A7%A3"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "cGB2Wx_GMUrK"
},
"source": [
"## python による PCA の実行\n",
"\n",
"以下、Python を使った PCA の実行を順番に見ていく。 \n",
"その後、scikit-learn ライブラリを使った PCA の簡単で効率のよい実装を見る。 \n",
"\n",
"### データセット\n",
"\n",
"- データセットは、 [Wine](https://archive.ics.uci.edu/ml/datasets/Wine) というオープンソースのデータセットを使う。 \n",
"- 178 行のワインサンプルと、それらの化学的性質を表す 13 列の特徴量で構成されている。\n",
"- それぞれのサンプルに、クラス 1, 2, 3 のいずれかがラベルされており、 \n",
"イタリアの同じ地域で栽培されている異なる品種のブドウを表している \n",
"(PCA は教師なし学習なので、学習時にラベルは使わない)。\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "y-cEu_epxt9t"
},
"outputs": [],
"source": [
"from IPython.display import Image\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 258
},
"id": "x0XoyvCoxt92",
"outputId": "856600d0-90cb-43e8-c07b-3c10123a337d"
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Class label | \n",
" Alcohol | \n",
" Malic acid | \n",
" Ash | \n",
" Alcalinity of ash | \n",
" Magnesium | \n",
" Total phenols | \n",
" Flavanoids | \n",
" Nonflavanoid phenols | \n",
" Proanthocyanins | \n",
" Color intensity | \n",
" Hue | \n",
" OD280/OD315 of diluted wines | \n",
" Proline | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 1 | \n",
" 14.23 | \n",
" 1.71 | \n",
" 2.43 | \n",
" 15.6 | \n",
" 127 | \n",
" 2.80 | \n",
" 3.06 | \n",
" 0.28 | \n",
" 2.29 | \n",
" 5.64 | \n",
" 1.04 | \n",
" 3.92 | \n",
" 1065 | \n",
"
\n",
" \n",
" 1 | \n",
" 1 | \n",
" 13.20 | \n",
" 1.78 | \n",
" 2.14 | \n",
" 11.2 | \n",
" 100 | \n",
" 2.65 | \n",
" 2.76 | \n",
" 0.26 | \n",
" 1.28 | \n",
" 4.38 | \n",
" 1.05 | \n",
" 3.40 | \n",
" 1050 | \n",
"
\n",
" \n",
" 2 | \n",
" 1 | \n",
" 13.16 | \n",
" 2.36 | \n",
" 2.67 | \n",
" 18.6 | \n",
" 101 | \n",
" 2.80 | \n",
" 3.24 | \n",
" 0.30 | \n",
" 2.81 | \n",
" 5.68 | \n",
" 1.03 | \n",
" 3.17 | \n",
" 1185 | \n",
"
\n",
" \n",
" 3 | \n",
" 1 | \n",
" 14.37 | \n",
" 1.95 | \n",
" 2.50 | \n",
" 16.8 | \n",
" 113 | \n",
" 3.85 | \n",
" 3.49 | \n",
" 0.24 | \n",
" 2.18 | \n",
" 7.80 | \n",
" 0.86 | \n",
" 3.45 | \n",
" 1480 | \n",
"
\n",
" \n",
" 4 | \n",
" 1 | \n",
" 13.24 | \n",
" 2.59 | \n",
" 2.87 | \n",
" 21.0 | \n",
" 118 | \n",
" 2.80 | \n",
" 2.69 | \n",
" 0.39 | \n",
" 1.82 | \n",
" 4.32 | \n",
" 1.04 | \n",
" 2.93 | \n",
" 735 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Class label Alcohol ... OD280/OD315 of diluted wines Proline\n",
"0 1 14.23 ... 3.92 1065\n",
"1 1 13.20 ... 3.40 1050\n",
"2 1 13.16 ... 3.17 1185\n",
"3 1 14.37 ... 3.45 1480\n",
"4 1 13.24 ... 2.93 735\n",
"\n",
"[5 rows x 14 columns]"
]
},
"execution_count": 2,
"metadata": {
"tags": []
},
"output_type": "execute_result"
}
],
"source": [
"import pandas as pd\n",
"\n",
"# df_wine = pd.read_csv('https://archive.ics.uci.edu/ml/'\n",
"# 'machine-learning-databases/wine/wine.data',\n",
"# header=None)\n",
"\n",
"# if the Wine dataset is temporarily unavailable from the\n",
"# UCI machine learning repository, un-comment the following line\n",
"# of code to load the dataset from a local path:\n",
"\n",
"df_wine = pd.read_csv('https://github.com/rasbt/python-machine-learning-book-2nd-edition'\n",
" '/raw/master/code/ch05/wine.data',\n",
" header=None)\n",
"\n",
"df_wine.columns = ['Class label', 'Alcohol', 'Malic acid', 'Ash',\n",
" 'Alcalinity of ash', 'Magnesium', 'Total phenols',\n",
" 'Flavanoids', 'Nonflavanoid phenols', 'Proanthocyanins',\n",
" 'Color intensity', 'Hue',\n",
" 'OD280/OD315 of diluted wines', 'Proline']\n",
"\n",
"df_wine.head()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "2Qb836giN0Op"
},
"source": [
"Wine データセットの先頭 5 行のデータは上記。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 119
},
"id": "UGx6Kp-lW-ot",
"outputId": "6ae150ba-563a-4366-8092-98c3e05bc386"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"label: 1\n",
"shape: (59, 14)\n",
"label: 2\n",
"shape: (71, 14)\n",
"label: 3\n",
"shape: (48, 14)\n"
]
}
],
"source": [
"for i_label in df_wine['Class label'].unique():\n",
" print('label:', i_label)\n",
" print('shape:', df_wine[df_wine['Class label'] == i_label].shape)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "0t5O7OXTXAHT"
},
"source": [
"ラベルの数はおおよそ揃っている。 \n",
"次に、ラベルごとにデータの分布を見てみる。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 1000
},
"id": "TdLb1mUkUiZS",
"outputId": "1ba60a43-a10a-41f6-8f9b-411e36a61288"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"feature: Alcohol\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light",
"tags": []
},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"feature: Malic acid\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light",
"tags": []
},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"feature: Ash\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light",
"tags": []
},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"feature: Alcalinity of ash\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light",
"tags": []
},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"feature: Magnesium\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light",
"tags": []
},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"feature: Total phenols\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light",
"tags": []
},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"feature: Flavanoids\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXAAAAD4CAYAAAD1jb0+AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAPKklEQVR4nO3df2xd5X3H8c/HdkzBTQgsDsQJnhOJHypFLMjqxjIqCGSwljT9A6EUES2oihGwLWVDhYo/yvgD7Y8pdIhpKOLHWgJEgjAVd1EhBEKFxOgcCCuQhlYQUicp+YEgxAI5ib/7w1eQXJzYvuf4nPv4vl+S5XvOPfc833MtffzoOT8eR4QAAOlpKrsAAEBtCHAASBQBDgCJIsABIFEEOAAkqqXIxmbMmBFdXV1FNgkAydu8efO+iGivXl9ogHd1damvr6/IJgEgebbfH2k9QygAkCgCHAASRYADQKIIcABIFAEOAIkq9CqU4xkaGtK+ffv00Ucf6ciRI2WXk5vm5mZNnz5dM2bMUFMT/ysB5KsuAry/v1+21dXVpSlTpsh22SVlFhE6dOiQPvjgA/X396uzs7PskgBMMnXRLRwYGNDs2bPV2to6KcJbkmyrtbVVs2fP1sDAQNnlAJiE6iLAJU3aIYbJelwAylcXQyjISW9vbZ9bvDitNgFIqqMeOABgfOq6B37vhncKaefWRecU0g4A5Ike+DitXbtWl1xyiaZNm6aWlrr+/wdgkiOBxum0007TzTffrE8//VQ9PT1llwOggRHg43TllVdKkjZt2lRuIQAaHkMoAJAoAhwAEkWAA0CiCHAASBQnMcfpyJEjOnTokAYHByVJn332mSTppJNOmjTPcQGQhroO8Hq8webRRx/VDTfc8PnyySefLEl677331NXVVVJVABoRQyjjtHz5ckXEl34IbwBFI8ABIFEEOAAkatQAt/2w7T223zxq3em2N9j+XeX3aRNbJgCg2lh64P8p6aqqdXdI2hgRZ0vaWFkGABRo1ACPiF9J+rBq9RJJP628/qmk7+ZcFwBgFLWOgZ8REbsrr/8o6Yyc6gEAjFHm68AjImzH8d633SOpRxIzs+MLtU7FJjEdG1BRaw/8A9uzJKnye8/xNoyI1RHRHRHd7e3tNTYHAKhWaw/8GUl/K+lfKr9/nltFR8vSSxsPenQAEjSWywifkPSKpHNt99v+voaDe5Ht30m6orLcEG6//Xadf/75mjZtmjo6OrRixQp9+GH1OV4AmHhjuQrlexExKyKmRMSciHgoIvZHxOURcXZEXBERDZNgzc3NWrNmjfbv36833nhD/f39Wr58edllAWhAdf0wq3p0zz33fP66vb1dK1eu1LXXXltiRQAaFbfSZ7Rx40ZdeOGFZZcBoAHRA89g3bp1euCBB/TSSy+VXQqABkQPvEZPPvmkVqxYoWeeeUYXXXRR2eUAaEAEeA0eeeQR3Xjjjert7dVll11WdjkAGhQBPk733XefbrvtNj377LNasGBB2eUAaGCMgY/TypUr1dLS8qWe98GDB0uqCECjqu8Ar8M7JCOO+9gXACgUQygAkCgCHAASRYADQKIIcABIFAEOAIkiwAEgUQQ4ACSKAAeARBHgAJCour4Tc9cnuwppp2NqRyHtAECe6IHX4M4779TcuXM1bdo0zZw5U9dcc4127NhRdlkAGgwBXoNly5Zpy5YtOnDggLZv367Ozk4tXbq07LIANJi6HkKpV+edd97nryNCTU1N2rZtW4kVAWhEBHiNHn/8cd100006cOCAWlpatGrVqrJLAtBgGEKp0XXXXaePP/5Yu3fv1l133aULLrig7JIANBh64BmdeeaZWrFihebNm6cdO3bo9NNPL7skAA2CHngODh8+rIGBAe3aVcxljwAgEeDjNjQ0pPvvv1979uyRJPX39+uWW25RV1fXMSc3AWCi1fUQSr3eYLN+/XrdfffdGhgY0PTp03XppZfq+eefV0tLXX+dACYZEmecmpqatH79+rLLAACGUAAgVZkC3Pattt+y/abtJ2x/Ja/CAAAnVnOA254t6R8kdUfE1yU1S+J+cgAoSNYhlBZJJ9tukXSKJK6jA4CC1HwSMyJ22v5XSTskfSrpuYh4rno72z2SeiSps7PzuPsbGhpSU1Pt/08Gjwwes9za3Jrr9rUaGhoa3wd6eyekjrprs0T3bnjnS+tuXXROCZUA2WQZQjlN0hJJcyV1SGqzfX31dhGxOiK6I6K7vb19xH21tbVp586dGhwcVETUWlJdiQgNDg5q586damtrK7scAJNQlssIr5D0XkTslSTbT0v6S0lrxrujOXPmaN++fXr//fd1+PDhmoo5MnTkmOXmpuZct69FS0uLTj31VM2YMSP3fQNA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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light",
"tags": []
},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"feature: Nonflavanoid phenols\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light",
"tags": []
},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"feature: Proanthocyanins\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light",
"tags": []
},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"feature: Color intensity\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light",
"tags": []
},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"feature: Hue\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light",
"tags": []
},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"feature: OD280/OD315 of diluted wines\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light",
"tags": []
},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"feature: Proline\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light",
"tags": []
},
"output_type": "display_data"
}
],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"for i_feature in df_wine.columns:\n",
" if i_feature == 'Class label': continue\n",
" print('feature: ' + str(i_feature))\n",
" # ヒストグラムの描画\n",
" plt.hist(df_wine[df_wine['Class label'] == 1][i_feature], alpha=0.5, bins=20, label=\"1\") \n",
" plt.hist(df_wine[df_wine['Class label'] == 2][i_feature], alpha=0.3, bins=20, label=\"2\", color='r')\n",
" plt.hist(df_wine[df_wine['Class label'] == 3][i_feature], alpha=0.1, bins=20, label=\"3\", color='g') \n",
" plt.legend(loc=\"upper left\", fontsize=13) # 凡例表示\n",
" plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "N-SPqmZIxt96"
},
"source": [
"データを70%のトレーニングと30%のテストサブセットに分割する。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "3j14ZqBbxt96"
},
"outputs": [],
"source": [
"from sklearn.model_selection import train_test_split\n",
"\n",
"X, y = df_wine.iloc[:, 1:].values, df_wine.iloc[:, 0].values\n",
"\n",
"X_train, X_test, y_train, y_test = \\\n",
" train_test_split(X, y, test_size=0.3, \n",
" stratify=y,\n",
" random_state=0)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "3__QM-G6xt99"
},
"source": [
"データの標準化を行う。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 221
},
"id": "f_70zjfWxt9-",
"outputId": "afc88041-0b6a-4710-bda4-b8a47b71fb40"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"standardize train [[ 0.71225893 2.22048673 -0.13025864 0.05962872 -0.50432733 -0.52831584\n",
" -1.24000033 0.84118003 -1.05215112 -0.29218864 -0.20017028 -0.82164144\n",
" -0.62946362]\n",
" [ 0.88229214 -0.70457155 1.17533605 -0.09065504 2.34147876 1.01675879\n",
" 0.66299475 1.0887425 -0.49293533 0.13152077 1.33982592 0.54931269\n",
" 1.47568796]]\n",
"standardize test [[ 0.89443737 -0.38811788 1.10073064 -0.81201711 1.13201117 1.09807851\n",
" 0.71204102 0.18101342 0.06628046 0.51285923 0.79629785 0.44829502\n",
" 1.90593792]\n",
" [-1.04879931 -0.77299397 0.54119006 -0.24093881 0.3494145 -0.70721922\n",
" -0.30812129 0.67613838 -1.03520519 -0.90656727 2.24570604 -0.56188171\n",
" -1.22874035]]\n"
]
}
],
"source": [
"from sklearn.preprocessing import StandardScaler\n",
"\n",
"sc = StandardScaler()\n",
"X_train_std = sc.fit_transform(X_train) # トレーニングセットの標準偏差と平均値を使って、標準化を行う\n",
"X_test_std = sc.transform(X_test) # \"トレーニングセット\"の標準偏差と平均値を使って、標準化を行う\n",
"\n",
"# いずれの特徴量も、値がおおよそ、-1 から +1 の範囲にあることを確認する。\n",
"print('standardize train', X_train_std[0:2])\n",
"print('standardize test', X_test_std[0:2])"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "nAxFZry3xt-A"
},
"source": [
"---\n",
"\n",
"**注意**\n",
"\n",
"テストデータの標準化の際に、テストデータの標準偏差と平均値を用いてはいけない(トレーニングデータの標準偏差と平均値を用いること)。 \n",
"また、ここで求めた標準偏差と平均値は、未知のデータを標準化する際にも再使用するので、記録しておくこと。 \n",
"(今回は、ノートブックだけで完結するので、外部ファイル等に記録しなくても問題ない) "
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "M9upsVJxxt-B"
},
"source": [
"- 分散共分散行列を作成\n",
"- 固有値問題を解いて、固有値と固有ベクトルを求める\n",
"\n",
"固有値問題とは、以下の条件を満たす、固有ベクトル $v$ と、スカラー値である固有値 $\\lambda$ を求める問題のことである \n",
"(詳細は線形代数の書籍等を参考)。\n",
"\n",
"$$\\Sigma v=\\lambda v$$\n",
"\n",
"$\\Sigma$ は分散共分散行列である(総和記号ではないことに注意)。 \n",
" \n",
"分散共分散行列に関しては、 [前回の資料](https://github.com/hnishi/hnishi_da_handson/blob/master/da_handson_basic_statistic_values.ipynb) を参照。\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 467
},
"id": "2veaLULZxt-C",
"outputId": "da0b3fbb-a3d1-4340-bd4a-0b583ff4ae24"
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/usr/local/lib/python3.6/dist-packages/statsmodels/tools/_testing.py:19: FutureWarning: pandas.util.testing is deprecated. Use the functions in the public API at pandas.testing instead.\n",
" import pandas.util.testing as tm\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light",
"tags": []
},
"output_type": "display_data"
}
],
"source": [
"import numpy as np\n",
"import seaborn as sns\n",
"\n",
"cov_mat = np.cov(X_train_std.T)\n",
"\n",
"# 共分散行列のヒートマップ\n",
"df = pd.DataFrame(cov_mat, index=df_wine.columns[1:], columns=df_wine.columns[1:])\n",
"ax = sns.heatmap(df, cmap=\"YlGnBu\") "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 153
},
"id": "-S4IBjmtcvwi",
"outputId": "786d2664-6c63-4788-b1f4-efb19234b88d"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"Eigenvalues \n",
"[0.10754642 0.15362835 0.1808613 0.21357215 0.3131368 0.34650377\n",
" 0.51828472 0.6620634 0.84166161 0.96120438 1.54845825 2.41602459\n",
" 4.84274532]\n",
"\n",
"Shape of eigen vectors\n",
" (13, 13)\n"
]
}
],
"source": [
"# 固有値問題を解く(固有値分解)\n",
"eigen_vals, eigen_vecs = np.linalg.eigh(cov_mat)\n",
"\n",
"print('\\nEigenvalues \\n%s' % eigen_vals)\n",
"print('\\nShape of eigen vectors\\n', eigen_vecs.shape)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "O6ju2uylxt-F"
},
"source": [
"**注意**: \n",
"\n",
"固有値分解(固有分解とも呼ばれる)する numpy の関数は、\n",
"\n",
"- [`numpy.linalg.eig`](http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html)\n",
"- [`numpy.linalg.eigh`](http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigh.html) \n",
"\n",
"がある。 \n",
"`numpy.linalg.eig` は対称正方行列と非対称正方行列を固有値分解する関数。複素数の固有値を返すことがある。 \n",
"`numpy.linalg.eigh` はエルミート行列(各成分が複素数で、転置させた各成分の虚部の値の正負を反転させたものがもとの行列と等しくなる行列)を固有値分解する関数。常に実数の固有値を返す。 \n",
"\n",
"分散共分散行列は、対称正方行列であり、虚数部が 0 のエルミート行列でもある。 \n",
"対称正方行列の操作では、`numpy.linalg.eigh` の方が数値的に安定しているらしい。\n",
"\n",
"Ref) *Python Machine Learning 2nd Edition* by [Sebastian Raschka](https://sebastianraschka.com), Packt Publishing Ltd. 2017.\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Di8mikW0xt-G"
},
"source": [
"## 全分散と説明分散(Total and explained variance)\n",
"\n",
"- 固有値の大きさは、データに含まれる情報(分散)の大きさに対応している\n",
"- 主成分j (PCj: j-th principal component) に対応する固有値 $\\lambda_j$ の分散説明率(寄与率、contribution ratio/propotion とも呼ばれる)は以下のように定義される。\n",
"\n",
"$$\\dfrac {\\lambda _{j}}{\\sum ^{d}_{j=1}\\lambda j}$$ \n",
"\n",
"$\\lambda_j$ は、j 番目の固有値、d は全固有値の数(元々の特徴量の数/次元数)。 \n",
"\n",
"分散説明率を見ることで、その主成分が特徴量全体がもつ情報のうち、どれぐらいの情報を表すことができているかを確認できる。 \n",
"以下に、分散説明率と、その累積和をプロットする。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "sx09GUfmxt-H"
},
"outputs": [],
"source": [
"# 固有値の合計\n",
"tot = sum(eigen_vals)\n",
"# 分散説明率の配列を作成\n",
"var_exp = [(i / tot) for i in sorted(eigen_vals, reverse=True)]\n",
"# 分散説明率の累積和を作成\n",
"cum_var_exp = np.cumsum(var_exp)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 297
},
"id": "Zgo6kcPzxt-K",
"outputId": "c8be8241-3972-4588-ef26-8a587e1cfc50"
},
"outputs": [
{
"data": {
"image/png": "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wgssXLiwtGa3fv16li1bRtu2bZkyZQpdu3blvPPO48gjjyw9ZsiQITRs2JCGDRvSr18/3nrrLbp3717tMhx33HE0bdoUgE6dOrFixQq++OILFi9eXPp53377LX369OG9996jbdu2tGvXDoDhw4czefLkHc7585//nIEDB3LNNdcwffr00vtJ69ev56yzzmLZsmWYGVu2bCk9ZsCAAeX+G1dWjl69etGmTRsAunfvTlFREU2bNqVly5b07NkTgCZNmlR5jWtaZTWoY4GXgJ+W854DSlBlTH1zJU/OL/uoV81bvGoDnVo2if1zpOZVVtOpbbvtthvbtm0DYNu2bXz77bel7+25556lyw0aNChdb9CgAVu3bq3y+BI33XQT+++/PwsWLGDbtm1kZ2fvsE9Zffr0Yfny5axevZonnniCK6+8svQz5syZU+k53J1bbrmF448/fof3li1bRuPGjfnkk0+22162x1nZ9ahlSL1mWVlZbN26FXdnwIABPPjg9ndF5s+fX2EZUrVu3Zp9992XhQsXMm3aNCZNmgTAVVddRb9+/Xj88ccpKiqib9++pcfstdde5Z6rsnKUF3tFKrvGNa3Ce1DuPs7MGgDPuvuIMq9zYo8sAz05/2MWr6rZ5pvydGrZhCHdy44aJVK+/v378/DDD7N2bfAER0kTX05ODnPnzgVgxowZ2/0VHkWU49evX0/Lli1p0KAB9913H999F4w3vffee/Pll1+We14z46STTuLXv/41HTt2ZN999wVg4MCB3HLLLaX7lfclf/zxx3PbbbeVxrJ06VI2bdrE+vXrueiii3j11VdZu3btdvfOnnzySb7++mvWrl3LrFmzSmsMVZUhit69ezN79myWL18OwKZNm1i6dCkdOnSgqKio9H5e2QSWKj8/nz/96U+sX7+erl27lsbUunXwHTBlypRIsVS3HIcccgirVq2ioCAYN+HLL79k69atFV7jOFR6D8rdt5nZpcD0WD69DurUsgnTzuuT7jBESnXu3JkrrriCY489lqysLHr06MGUKVMYNWoUQ4YMoVu3bgwaNKjCv7wrEuX4888/n6FDh3Lvvfdut0/Xrl3JysqiW7dunH322fTo0WO74/Lz8+nZs+d2X74TJ07kggsuoGvXrmzdupVjjjmmtEZRYuTIkRQVFZGbm4u706JFC5544gkuvvhiLrjgAtq3b8+dd95Jv379OOaYY0pj6devH2vWrOGqq66iVatW2927qagMUbRo0YIpU6Zw2mmn8c033wBw7bXX0r59eyZPnswJJ5xAo0aNOProoytM2MOGDWPs2LFcddVVpdsuvfRSzjrrLK699tod7plVpLrl2GOPPZg2bRoXXnghX331FQ0bNmTmzJkVXuM4WElvjQp3MLseWANMA0rTpLtXfac1Bnl5eV7eDcokyL/9DQAlKNnOkiVL6NixY7rDkHKMHz+exo0b89vf/jbdodQ55f3em9lcd8+r4JAdRBnqqKR7yQUp2xw4OOqHiIiIVFeUbuY13zVDRCQBxo8fn+4QpBJRB4vtAnRi+8Fi740rKBERkSoTlJmNI5ivqRPwDPBj4F+AEpSIiMQmylBHw4DjgP+4+wigG9A01qhERKTeizRYrLtvA7aaWRPgM7afiFBERKTGRUlQheFgsf8A5hIMGPtGrFGJSI064ogjqrV/6vQPM2bM4Prrr690/6uvvpqZM2dWep6dkZOTw5o1a3b6+KqUDL5amZEjR243xNKuiKs8NRljkkTpxXd+uDjJzJ4Dmrj7wnjDEqm7bnqx6vHoquPiAVVPz1YycvXOGDx4MIMHD650nwkTqppgO3Pdcccd6Q6hUt99913iY9xZUWbUnWFmp5vZXu5epOQkknlSp9KoaGqFiqZ/mDJlCmPGjGH9+vUcdNBBpePvbdq0iQMOOIAtW7ZsN/VGRecZP348N9xwQ+l6ly5dSkds+NnPfsZhhx1G586dyx00tazyprBYsWIF7dq1Y82aNWzbto2jjz6aF154gaKiotKyduzYkWHDhrF58+Ydzjl69Gjy8vLo3Lkz48aNK92eWstq3LgxV1xxBd26daN37958+umnABVOBbJ27VoGDhxI586dGTlyJOUNjDBp0iQuueSSHa53ZdelcePG/OY3v6Fbt2688cYb28VYUTlycnIYN24cubm5HHroobz33nsAbNy4kREjRnDooYfStWvX0lHRK5ompDZFaeL7C3AUsNjMHjGzYWZW9YiPIpJIb7/9NjfffDOLFy/mgw8+YPbs2Xz99deMGjWKp556irlz5/Kf//xnh+OaNm1K9+7deeWVVwB4+umnOf7449l9991L94lynvLcddddzJ07l8LCQiZOnFg6bmB51qxZUzqFxbx588jLy+PGG2/koIMO4rLL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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light",
"tags": []
},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"\n",
"plt.bar(range(1, 14), var_exp, alpha=0.5, align='center',\n",
" label='individual explained variance')\n",
"plt.step(range(1, 14), cum_var_exp, where='mid',\n",
" label='cumulative explained variance')\n",
"plt.ylabel('Explained variance ratio')\n",
"plt.xlabel('Principal component index')\n",
"plt.legend(loc='best')\n",
"plt.tight_layout()\n",
"# plt.savefig('images/05_02.png', dpi=300)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "PHRpEe_Fxt-M"
},
"source": [
"グラフから以下のことがわかる。\n",
"\n",
"- 最初の主成分だけで、全体の約 4 割の分散を占めている\n",
"- 2 つの主成分も用いるだけで、もともとあった特徴量全体の約 6 割を説明できている"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "pgR5PpLI2pKr"
},
"source": [
"## 因子負荷量 (Factor loading)\n",
"\n",
"各主成分軸の意味を知るためには、因子負荷量を見れば良い。\n",
"因子負荷量とは、主成分軸における値と、変換前の軸における値との間の相関値のことである。\n",
"\n",
"この相関が大きくなるほど、その特徴量が、その主成分に寄与する程度が大きいということを意味している。\n",
"\n",
"Ref: https://statistics.co.jp/reference/software_R/statR_9_principal.pdf"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "l4mRZdgaxt-N"
},
"source": [
"## 特徴変換 (Feature transformation)\n",
"\n",
"射影(変換)行列を取得し、適用して特徴変換を行う。\n",
"\n",
"---\n",
"\n",
"$X' = XW$ \n",
"\n",
"$X'$ : 射影(変換)後の座標(行列) \n",
"$X$ : もともとの座標(行列) \n",
"$W$ : 射影(変換)行列 \n",
" \n",
"$W$ は、次元削減後の次元数の固有ベクトルから構成される。 \n",
"\n",
"$W = [v_1 v_2 ... v_k] \\in \\mathbb{R} ^{n\\times k}$ "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "rX5cnm54xt-Q"
},
"outputs": [],
"source": [
"# Make a list of (eigenvalue, eigenvector) tuples\n",
"eigen_pairs = [(np.abs(eigen_vals[i]), eigen_vecs[:, i])\n",
" for i in range(len(eigen_vals))]\n",
"\n",
"# Sort the (eigenvalue, eigenvector) tuples from high to low\n",
"eigen_pairs.sort(key=lambda k: k[0], reverse=True)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ujj3Q-eWoZCI"
},
"source": [
"### まずは、次元削減を行わずに、13 次元 --> 13 次元の座標変換を見てみる\n",
"\n",
"$X' = XW$ \n",
"\n",
"$W = [v_1 v_2 ... v_13] \\in \\mathbb{R} ^{13\\times 13}$ \n",
"$x \\in \\mathbb{R} ^{13}$ \n",
"$x' \\in \\mathbb{R} ^{13}$ "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"id": "gJ4eHOqamI04",
"outputId": "b9e29a85-c1e3-4b62-90b5-2c9d8cf8b7c7"
},
"outputs": [
{
"data": {
"text/plain": [
"(13, 13)"
]
},
"execution_count": 12,
"metadata": {
"tags": []
},
"output_type": "execute_result"
}
],
"source": [
"# 変換行列 w の作成\n",
"w = eigen_pairs[0][1][:, np.newaxis]\n",
"for i in range(1, len(eigen_pairs)):\n",
" # print(i)\n",
" w = np.hstack((w, eigen_pairs[i][1][:, np.newaxis]))\n",
"w.shape"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 265
},
"id": "bJ2UufarnbN0",
"outputId": "dd34166a-d679-4599-82e4-2f227284f0a8"
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light",
"tags": []
},
"output_type": "display_data"
}
],
"source": [
"# 座標変換\n",
"X_train_pca = X_train_std.dot(w)\n",
"# print(X_train_pca.shape)\n",
"\n",
"cov_mat = np.cov(X_train_pca.T)\n",
"\n",
"# 共分散行列のヒートマップ\n",
"df = pd.DataFrame(cov_mat)\n",
"ax = sns.heatmap(df, cmap=\"YlGnBu\") "
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "1AE7ps1Qn0US"
},
"source": [
"主成分空間に変換後の各特徴量は、互いに相関が全くないことがわかる(互いに線形独立)。 \n",
"対角成分は分散値であり、第1主成分から大きい順に並んでいることがわかる。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "NGwmx1eBVG_w"
},
"source": [
"### 座標変換された空間から元の空間への復元"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "iCEl48xUTvP1"
},
"source": [
"## 座標変換された空間から元の空間への復元\n",
"\n",
"$X = X'W^T$ \n",
"\n",
"$X'$ : 座標変換後の座標(行列) \n",
"$X$ : もともとの空間に復元された座標(行列) \n",
"$W^T \\in \\mathbb{R} ^{n\\times n}$ : 転置された変)行列 \n",
" \n",
"$x' \\in \\mathbb{R} ^{n}$ \n",
"$x_{approx} \\in \\mathbb{R} ^{n}$ \n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 170
},
"id": "oG2Fur5YVLwV",
"outputId": "e53a2ce7-f423-4aea-ba2c-4463a09a5ab6"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"もともとの特徴量: [ 0.71225893 2.22048673 -0.13025864 0.05962872 -0.50432733 -0.52831584\n",
" -1.24000033 0.84118003 -1.05215112 -0.29218864 -0.20017028 -0.82164144\n",
" -0.62946362]\n",
"変換後の特徴量: [ 2.38299011 0.45458499 0.22703207 0.57988399 -0.57994169 -1.73317476\n",
" -0.70180475 -0.21617248 0.23666876 0.16548767 -0.29726982 -0.23489704\n",
" 0.40161994]\n",
"復元された特徴量: [ 0.71225893 2.22048673 -0.13025864 0.05962872 -0.50432733 -0.52831584\n",
" -1.24000033 0.84118003 -1.05215112 -0.29218864 -0.20017028 -0.82164144\n",
" -0.62946362]\n"
]
}
],
"source": [
"# 1つ目のサンプルに射影行列を適用(内積を作用させる)\n",
"x0 = X_train_std[0]\n",
"print('もともとの特徴量:', x0)\n",
"z0 = x0.dot(w)\n",
"print('変換後の特徴量:', z0)\n",
"x0_reconstructed = z0.dot(w.T)\n",
"print('復元された特徴量:', x0_reconstructed)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "i_868Z5oVRiN"
},
"source": [
"完全に復元できていることがわかる。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "DZcBqGwmob7C"
},
"source": [
"### 13 次元 --> 2 次元に次元削減する\n",
"\n",
"$X' = XW$ \n",
"\n",
"$W = [v_1 v_2] \\in \\mathbb{R} ^{13\\times 2}$ \n",
"$x \\in \\mathbb{R} ^{13}$ \n",
"$x' \\in \\mathbb{R} ^{2}$ "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 255
},
"id": "9bpGEgUCxt-S",
"outputId": "02c6d9a7-3192-446d-fc57-3d84c76c8500"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Matrix W:\n",
" [[-0.13724218 0.50303478]\n",
" [ 0.24724326 0.16487119]\n",
" [-0.02545159 0.24456476]\n",
" [ 0.20694508 -0.11352904]\n",
" [-0.15436582 0.28974518]\n",
" [-0.39376952 0.05080104]\n",
" [-0.41735106 -0.02287338]\n",
" [ 0.30572896 0.09048885]\n",
" [-0.30668347 0.00835233]\n",
" [ 0.07554066 0.54977581]\n",
" [-0.32613263 -0.20716433]\n",
" [-0.36861022 -0.24902536]\n",
" [-0.29669651 0.38022942]]\n"
]
}
],
"source": [
"w = np.hstack((eigen_pairs[0][1][:, np.newaxis],\n",
" eigen_pairs[1][1][:, np.newaxis]))\n",
"print('Matrix W:\\n', w)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "BFKuX8Gsxt-U"
},
"source": [
"**注意**\n",
"\n",
"NumPy と LAPACK のバージョンによっては、上記の例とは符号が反転した射影行列 w が作成されることがあるが、問題はない。 \n",
"以下の式が成り立つからである。 \n",
"\n",
"行列 $\\Sigma$ に対して、 $v$ が固有ベクトル、$\\lambda$ が固有値のとき、 \n",
"$$\\Sigma v = \\lambda v,$$\n",
"\n",
"ここで $-v$ もまた同じ固有値をもつ固有ベクトルとなる。 \n",
"$$\\Sigma \\cdot (-v) = -\\Sigma v = -\\lambda v = \\lambda \\cdot (-v).$$\n",
"\n",
"(主成分軸のベクトルの向きの違い)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"id": "UNXPFpCCxt-U",
"outputId": "a357efb6-22b7-4b0d-bca0-cf6205a7aca1"
},
"outputs": [
{
"data": {
"text/plain": [
"array([2.38299011, 0.45458499])"
]
},
"execution_count": 16,
"metadata": {
"tags": []
},
"output_type": "execute_result"
}
],
"source": [
"# 各サンプルに射影行列を適用(内積を作用)させることで、変換後の座標(特徴量)を得ることができる。\n",
"X_train_std[0].dot(w)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Et6Y5TM7qdX2"
},
"source": [
"### 2次元に射影後の全データを、ラベルごとに色付けしてプロットする"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 297
},
"id": "etVeVNLZxt-X",
"outputId": "7197f713-bd5b-4aba-ea00-ba149729df9a"
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light",
"tags": []
},
"output_type": "display_data"
}
],
"source": [
"X_train_pca = X_train_std.dot(w)\n",
"colors = ['r', 'b', 'g']\n",
"markers = ['s', 'x', 'o']\n",
"\n",
"for l, c, m in zip(np.unique(y_train), colors, markers):\n",
" plt.scatter(X_train_pca[y_train == l, 0], \n",
" X_train_pca[y_train == l, 1], \n",
" c=c, label=l, marker=m)\n",
"\n",
"plt.xlabel('PC 1')\n",
"plt.ylabel('PC 2')\n",
"plt.legend(loc='lower left')\n",
"plt.tight_layout()\n",
"# plt.savefig('images/05_03.png', dpi=300)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "zhBWM9v4xt-Z"
},
"source": [
"PC1 軸方向をみると、PC2 軸方向よりもよりもデータが広く分布しており、データをよりよく区別できていることがわかる。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "crJwv6aoejmT"
},
"source": [
"## 次元削減された空間から元の空間への復元\n",
"\n",
"$X_{approx} = X'W^T$ \n",
"\n",
"$X'$ : 射影後の座標(行列) \n",
"$X_{approx}$ : もともとの空間に、近似的に、復元された座標(行列) \n",
"$W^T \\in \\mathbb{R} ^{n\\times k}$ : 転置された射影(変換)行列 \n",
" \n",
"$x' \\in \\mathbb{R} ^{k}$ \n",
"$x_{approx} \\in \\mathbb{R} ^{n}$ \n",
" \n",
"$k = n$ のとき、$X = X_{approx}$ が成り立つ(上述)。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 136
},
"id": "GRzLW1IvT5PD",
"outputId": "5eab1fad-8839-459b-ae89-e16fced50580"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"もともとの特徴量: [ 0.71225893 2.22048673 -0.13025864 0.05962872 -0.50432733 -0.52831584\n",
" -1.24000033 0.84118003 -1.05215112 -0.29218864 -0.20017028 -0.82164144\n",
" -0.62946362]\n",
"変換後の特徴量: [2.38299011 0.45458499]\n",
"復元された特徴量: [-0.09837469 0.66412622 0.05052458 0.44153949 -0.23613841 -0.91525549\n",
" -1.00494135 0.76968396 -0.72702683 0.42993247 -0.87134462 -0.9915977\n",
" -0.53417827]\n"
]
}
],
"source": [
"# 1つ目のサンプルに射影行列を適用(内積を作用させる)\n",
"x0 = X_train_std[0]\n",
"print('もともとの特徴量:', x0)\n",
"z0 = x0.dot(w)\n",
"print('変換後の特徴量:', z0)\n",
"x0_reconstructed = z0.dot(w.T)\n",
"print('復元された特徴量:', x0_reconstructed)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "CEULzsgEVV5N"
},
"source": [
"完全には復元できていないことがわかる(近似値に復元される)。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "-rdNhuboxt-a"
},
"source": [
"## Principal component analysis in scikit-learn"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "0GIL4l8Rxt-b"
},
"source": [
"上記で行った PCA の実装は、scikit-learn を使うことで簡単に実装できる。\n",
"以下にその実装を示す。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 68
},
"id": "Wnsh10ibxt-b",
"outputId": "08ece0bb-ee92-4c58-eb39-f2cd83829731"
},
"outputs": [
{
"data": {
"text/plain": [
"array([0.36951469, 0.18434927, 0.11815159, 0.07334252, 0.06422108,\n",
" 0.05051724, 0.03954654, 0.02643918, 0.02389319, 0.01629614,\n",
" 0.01380021, 0.01172226, 0.00820609])"
]
},
"execution_count": 19,
"metadata": {
"tags": []
},
"output_type": "execute_result"
}
],
"source": [
"from sklearn.decomposition import PCA\n",
"\n",
"pca = PCA()\n",
"# 主成分分析の実行\n",
"X_train_pca = pca.fit_transform(X_train_std)\n",
"# 分散説明率の表示\n",
"pca.explained_variance_ratio_"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 279
},
"id": "r3xh2K_Sxt-d",
"outputId": "bbd044f4-80e3-450b-ca5c-6f2426d38782"
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light",
"tags": []
},
"output_type": "display_data"
}
],
"source": [
"# 分散説明率とその累積和のプロット\n",
"plt.bar(range(1, 14), pca.explained_variance_ratio_, alpha=0.5, align='center')\n",
"plt.step(range(1, 14), np.cumsum(pca.explained_variance_ratio_), where='mid')\n",
"plt.ylabel('Explained variance ratio')\n",
"plt.xlabel('Principal components')\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "R21CXFHext-f"
},
"outputs": [],
"source": [
"# 2次元に削減\n",
"pca = PCA(n_components=2)\n",
"X_train_pca = pca.fit_transform(X_train_std)\n",
"X_test_pca = pca.transform(X_test_std)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 279
},
"id": "xqQ0HYK2xt-h",
"outputId": "f2030495-ea9b-4b58-889c-a0f2e8fbc5e7"
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light",
"tags": []
},
"output_type": "display_data"
}
],
"source": [
"# 2次元空間にプロット\n",
"plt.scatter(X_train_pca[:, 0], X_train_pca[:, 1])\n",
"plt.xlabel('PC 1')\n",
"plt.ylabel('PC 2')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "zD0HQYUW34lj"
},
"source": [
"### 因子負荷量の確認\n",
"\n",
"以下のように、`pca.components_` を見ることで、因子負荷量を確認することができる。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 452
},
"id": "dOAUG6vB615P",
"outputId": "94431650-160e-4e63-e2aa-f5816f393734"
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" PC1 | \n",
" PC2 | \n",
"
\n",
" \n",
" \n",
" \n",
" Flavanoids | \n",
" -0.417351 | \n",
" -0.022873 | \n",
"
\n",
" \n",
" Total phenols | \n",
" -0.393770 | \n",
" 0.050801 | \n",
"
\n",
" \n",
" OD280/OD315 of diluted wines | \n",
" -0.368610 | \n",
" -0.249025 | \n",
"
\n",
" \n",
" Hue | \n",
" -0.326133 | \n",
" -0.207164 | \n",
"
\n",
" \n",
" Proanthocyanins | \n",
" -0.306683 | \n",
" 0.008352 | \n",
"
\n",
" \n",
" Proline | \n",
" -0.296697 | \n",
" 0.380229 | \n",
"
\n",
" \n",
" Magnesium | \n",
" -0.154366 | \n",
" 0.289745 | \n",
"
\n",
" \n",
" Alcohol | \n",
" -0.137242 | \n",
" 0.503035 | \n",
"
\n",
" \n",
" Ash | \n",
" -0.025452 | \n",
" 0.244565 | \n",
"
\n",
" \n",
" Color intensity | \n",
" 0.075541 | \n",
" 0.549776 | \n",
"
\n",
" \n",
" Alcalinity of ash | \n",
" 0.206945 | \n",
" -0.113529 | \n",
"
\n",
" \n",
" Malic acid | \n",
" 0.247243 | \n",
" 0.164871 | \n",
"
\n",
" \n",
" Nonflavanoid phenols | \n",
" 0.305729 | \n",
" 0.090489 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" PC1 PC2\n",
"Flavanoids -0.417351 -0.022873\n",
"Total phenols -0.393770 0.050801\n",
"OD280/OD315 of diluted wines -0.368610 -0.249025\n",
"Hue -0.326133 -0.207164\n",
"Proanthocyanins -0.306683 0.008352\n",
"Proline -0.296697 0.380229\n",
"Magnesium -0.154366 0.289745\n",
"Alcohol -0.137242 0.503035\n",
"Ash -0.025452 0.244565\n",
"Color intensity 0.075541 0.549776\n",
"Alcalinity of ash 0.206945 -0.113529\n",
"Malic acid 0.247243 0.164871\n",
"Nonflavanoid phenols 0.305729 0.090489"
]
},
"execution_count": 36,
"metadata": {
"tags": []
},
"output_type": "execute_result"
}
],
"source": [
"pd.DataFrame(pca.components_.T,index=df_wine.columns[1:],columns=['PC1','PC2']).sort_values('PC1')"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "EAJ_tG8_6V7T"
},
"source": [
"値の絶対値が大きい特徴量を見れば良い。\n",
"\n",
"つまり、第1主成分 (PC1) でよく表されている特徴量は、 \"Flavanoids\" と \"Total phenols\" である。\n",
"一方、第2主成分 (PC2) でよく表されている特徴量は、 \"Color intensity\" と \"Alcohol\" である。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "JaTyfCHWsGec"
},
"source": [
"## 2次元に次元削減された特徴量を用いてロジスティック回帰を行ってみる\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "rLzXoCajxt-j"
},
"outputs": [],
"source": [
"from matplotlib.colors import ListedColormap\n",
"\n",
"def plot_decision_regions(X, y, classifier, resolution=0.02):\n",
"\n",
" # setup marker generator and color map\n",
" markers = ('s', 'x', 'o', '^', 'v')\n",
" colors = ('red', 'blue', 'lightgreen', 'gray', 'cyan')\n",
" cmap = ListedColormap(colors[:len(np.unique(y))])\n",
"\n",
" # plot the decision surface\n",
" x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1\n",
" x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1\n",
" xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution),\n",
" np.arange(x2_min, x2_max, resolution))\n",
" Z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T)\n",
" Z = Z.reshape(xx1.shape)\n",
" plt.contourf(xx1, xx2, Z, alpha=0.4, cmap=cmap)\n",
" plt.xlim(xx1.min(), xx1.max())\n",
" plt.ylim(xx2.min(), xx2.max())\n",
"\n",
" # plot class samples\n",
" for idx, cl in enumerate(np.unique(y)):\n",
" plt.scatter(x=X[y == cl, 0], \n",
" y=X[y == cl, 1],\n",
" alpha=0.6, \n",
" c=cmap(idx),\n",
" edgecolor='black',\n",
" marker=markers[idx], \n",
" label=cl)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "sK403BdGxt-l"
},
"source": [
"Training logistic regression classifier using the first 2 principal components."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "u-fxY4soxt-l"
},
"outputs": [],
"source": [
"from sklearn.linear_model import LogisticRegression\n",
"\n",
"pca = PCA(n_components=2)\n",
"X_train_pca = pca.fit_transform(X_train_std)\n",
"X_test_pca = pca.transform(X_test_std)\n",
"\n",
"lr = LogisticRegression(penalty='l2', C=1.0)\n",
"# lr = LogisticRegression(penalty='none')\n",
"lr = lr.fit(X_train_pca, y_train)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"id": "049GPILWRLMb",
"outputId": "88066ad1-4cb2-4037-a8f0-557b2ebec4e7"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(124, 2)\n"
]
}
],
"source": [
"print(X_train_pca.shape)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"id": "fAjcTBYaQY5e",
"outputId": "f5974ff8-9916-4e6e-f5e8-9697c16adcbe"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Cumulative explained variance ratio: 0.5538639565949177\n"
]
}
],
"source": [
"print('Cumulative explained variance ratio:', sum(pca.explained_variance_ratio_))"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "antd-sULGBbb"
},
"source": [
"### 学習時間の計測"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"id": "wPNX7zIZF9U-",
"outputId": "1a04fa11-bee7-4c16-ef10-98b16e3416ce"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"100 loops, best of 3: 5.08 ms per loop\n"
]
}
],
"source": [
"%timeit lr.fit(X_train_pca, y_train)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 313
},
"id": "IlnWwBp0tsCA",
"outputId": "eb231d82-55e7-462a-b0dd-b263e9fee7c0"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"accuracy 0.9838709677419355\n"
]
},
{
"data": {
"text/plain": [
""
]
},
"execution_count": 28,
"metadata": {
"tags": []
},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light",
"tags": []
},
"output_type": "display_data"
}
],
"source": [
"from sklearn.metrics import plot_confusion_matrix\n",
"\n",
"# 精度\n",
"print('accuracy', lr.score(X_train_pca, y_train))\n",
"# confusion matrix\n",
"plot_confusion_matrix(lr, X_train_pca, y_train)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "HIBqNjsds2NN"
},
"source": [
"### トレーニングデータセットの予測結果"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 368
},
"id": "qA_RwRlWxt-n",
"outputId": "ed72c741-2a49-497d-ea90-b153b94a3042"
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"'c' argument looks like a single numeric RGB or RGBA sequence, which should be avoided as value-mapping will have precedence in case its length matches with 'x' & 'y'. Please use a 2-D array with a single row if you really want to specify the same RGB or RGBA value for all points.\n",
"'c' argument looks like a single numeric RGB or RGBA sequence, which should be avoided as value-mapping will have precedence in case its length matches with 'x' & 'y'. Please use a 2-D array with a single row if you really want to specify the same RGB or RGBA value for all points.\n",
"'c' argument looks like a single numeric RGB or RGBA sequence, which should be avoided as value-mapping will have precedence in case its length matches with 'x' & 'y'. Please use a 2-D array with a single row if you really want to specify the same RGB or RGBA value for all points.\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nO3dfXyV5Zkn8N8FIbw0CILElLcoggEiL5IUkdBYEC0dUWxRq+O068gWOtt2aKc7di1uZ7q6dnY6ndadzn7W7OjaWRnfBlucVmlVrCkU1AAChpdKGUNIiIEUAgiBvFz7x5OTnPecl+d57vs55/f9fPjAOUnOuYjy/HLf93Xfj6gqiIiIbDPIdAFERETxMKCIiMhKDCgiIrISA4qIiKzEgCIiIisVmC4gHZcVFekVY8eaLoPIM43nB+NjE4Dhg4abLoXIN/t27juhquOinw9UQF0xdizq1q0zXQaRZ2q+14bWH1yKFVVVpksh8s3sYbMb4j3PKT4ii6x+kDMERCEMKCIishIDishCG7dvN10CkXEMKCLLPHRoENDdbboMIuOMB5SIDBaRXSLyc9O1EBGRPYwHFIC1APabLoKIiOxiNKBEZCKAWwD8k8k6iGz0xpF60yUQGWV6BPUjAA8A6En0CSKyWkTqRKTu+Nmz/lVGZNCBu0pNl0BknLGAEpHlAFpVdUeyz1PVGlWtVNXKcUVFPlVHRESmmRxBVQG4TUQ+APAsgCUi8rTBeoiscrrxlOkSiIwyFlCq+qCqTlTVKwDcDWCzqv6JqXqIbPL0o42mSyAyzvQaFBERUVxWHBarqr8G8GvDZRARkUU4giKy2MatW02XQGQMA4rIUg8d4j9Pym/8F0BERFZiQBFZrqmryXQJREYwoIgsduCuUtTtbjFdBpERDCgiiz191V+bLoHIGAYUERFZiQFFZLNVq4CODtRf4MnmlH8YUESWa9swynQJREYwoIiIyEpWHHVERMm1fgiUT/b/ffe+sxebN21Ga0srikuKsWTZEsz6xCz/C6G8xIAistwP636ERxr/FPA5oPa+sxcvbXwJ199zPUqmlKDlcAteeuYlAGBIkS84xUdku1WrjLzt5k2bcf0912P8tPEYNHgQxk8bj+vvuR6bN202Ug/lHwYUEcXV2tKKkiklEc+VTClBa0uroYoo3zCgiAJi4/btvr5fcUkxWg5HnmLRcrgFxSXFvtZB+YsBRRQADz25xff3XLJsCbY9sw3N7zejp7sHze83Y9sz27Bk2RLfa6H8xCYJIoor1Aix+cXNeL3ldRSXFOO2FbexQYJ8w4AiooRmfWIWA4mMMTbFJyLDRORtEdktIvUi8l1TtRBZr7oa6O7GG0d45BHlD5NrUBcALFHVOQDmAlgmIgsM1kNktQN3lZougchXxqb4VFUBnO19OKT3l5qqh4iI7GK0i09EBovIuwBaAbyqqm/F+ZzVIlInInXHz56NfRGiPHK68ZTpEoh8YzSgVLVbVecCmAhgvohcE+dzalS1UlUrxxUV+V8kkSWefrTRdAlEvrJiH5SqngLwBoBlpmshIiI7mOziGycio3v/PBzATQAOmKqHiIjsYnIf1McB/EREBsMJyudV9ecG6yEKhI1bt2JFVZXpMnIKbytiJ5NdfHsAXGvq/YmC6KFDg/DI1B7TZeQU3lbEXlasQRERmcLbitiLAUUUQDxRwj28rYi9GFBEAfPQg/8Xp493mC4jZ/C2IvbiYbEW+cZTT+Fce3vM8yNGjcIP77vP/4KI8sCSZUvw0jORa1DbntmG21bcltbrsNHCfQwoi5xrb8fjY8fGPL+mrc1ANUT5wY3birDRwhsMKKIg6uhAU1cTJhRMMF1JTsj2tiLhjRYA+hstXtzMgMoC16CIgmbVKlxoKDRdBYVho4U3GFBERFlio4U3GFBEAVW3u2XgTyJfLFm2BNue2Ybm95vR092D5vebse2ZbViybInp0gKNa1AWGTFqVNyGiBGjRhmohmz2cGcXHungiRK2cKPRgmIxoCzCVnLKB7najp1towXFYkARkW+C1o6dq2EaFAwoogB740g9Fk8uN11Gyky2Y6cbNkEL01zEgEoDT3ogmzz05BY88qUbgMmmK0ldonbs11te9/R9Mwkb7m0yjwGVhqCd9OB3oDLAaSChduzQRR/wpx07k7AxFabUjwGVw/wO1KAFeE7o7jZdQVrcOvcunmRTeJmEjakwpX4MKKKgqq4G0BOodSiv2rEHmsLLJGzcDFM2W2SGAUUUYAfuKsX8bbHTqjbzoh17oCm8TMLGrTBls0XmGFBEFHgDTeFlGjZuhCmbLTJnLKBEZBKAfwZwOQAFUKOqj5mqJxU86YFsdPp4R6A6+byQyhSeqY20bLbInMkRVBeAb6rqThEZCWCHiLyqqvsM1pRU0DrR/A5UBrj/nn60kUcewVzzRSrYbJE5YwGlqscAHOv98xkR2Q9gAgBrAypo/A7UoAU45Q4/mi/OnjyLLRu24JFvP4Ky6WW484t3pvT6XoZnrrNiDUpErgBwLYC34nxsNYDVADB5zBhf6yIiOyUa1QwUGOmOhkLrRx+1f4Ttr2zHwj9diJvH3oz3t7yPlzam1ujAg2QzZzygRKQIwAYAX1fV09EfV9UaADUAUFlaqj6XRxQIG7duxYqqKtNl+CLTrrhMvi60fvT83z6P+Z+fj5JpJVBVFI0rQtk9ZSk3OvAg2cwYvR+UiAyBE07rVfVFk7UQBdVDh/Lrtm7hXXGDBg/q74rbtNn1rwutH51sOYniKc6a0fnT5zFs+DDeMdcHxv7PFhEB8ASA/ar696bqIKJgyfT26pl8XehGhEOHDcWHv/8Q59rP4cPff4gJkyaw0cEHJqf4qgB8AcBeEXm397lvq+rLBmvKWzxHj4Ii0664TL4uNC333JPP4Wff/RkWfH4BZi2YhY72Dk8aHXjiRCSTXXxbAIip96dIPEcv+DbW12NFeTCOPMpGpl1xmX5daP0oFB6v1L7iSaMDT5yIZbxJgoKHoy37FK86idYNo02X4YtsToXI5OvCv97LoOCJE7EYUJS2TEdbDDZyS6ZhET0aevapZ7F502YrptJ44kQsBpTF0r2g2x4AoWD7xsGDOHfxYt/z7zQ0YM1jj1lTZxCtLv4ZHjn1p2jqasKEggmmy7GarVNpPHEiFgPKYumOVIKyjnTu4kU8PmxY3+NaANVjx1pXZ6CsWoULDQXAdaYLsZ+tU2k8cSIWA4oA8Bw9yh+2TqXxxIlYDCgCwHP0KH/YPJXGEyciMaAobamOtqLXxOobGrCmuRkHzp0Dwqb4yD11b32ACVVcg0qGU2nBwYCitKU62opeE/vtiRPoungRf97VhdqOjr7nCwoL3S4xLz3c2YVHTBcRAJxKCw4GlMWiRyoHmprQ3dWFzoICrHnssYjP++F992W1juRHB+DCsjIAwNA9e7B+/PiIj/2krY3rXeQbTqUFAwPKYtHBsOaxx5J26WUTJDv37cPDEnuwx39tasr4NROZO2ECHl+71vXXJcfGHTuwoqLCdBk5h8cQ+Y8BRQCA7q4uVI8cGfv8mTMGqqFMPfTkFjzypRtMl5FzbN07lesYUEQUWH6NamzdO5XrGFDkGe6tIi/5Oaqxde9UrmNAWSpe00J9QwO+ceIEftjbbGA77q0ypLsb9RfqUT40t08293NUY/PeqVzGgLJUvGOLfnviBB746KOYUYkbI5LOggKsCWv9Dn/eLbafFZgTqqtx4K5JuGRbO8onmy7GW36Oarh3ygwGVIAsLCtDeVubJx1wC2fOjBseC9MMv2QhFJSzAikY/BzVcO+UGQwoApD6dNxAoyCGkB1ON54CcnwE5feohnun/MeAogGFh1J9QwPKhwwBAIwoLOxbD2MA2ePpRxvz4kQJjmpyn9GAEpEnASwH0Kqq15ishWJHR6GTK05fuIAfFxUBAE5euIDrurtRMnp03DUrIj/l8qiGG4PNj6CeAvBjAP9suA7rmGjRjp6eq21uRvXIkVh04QKqew93rT13DtrT41kNRMSNwSFGA0pVa0XkCpM12CrbrjYbO+a4L8pfG7dvx4oFC0yXQRngxmCH6REUecRUs0KyEGIruX8eOjQIj0ztNl0GZYgbgx3WB5SIrAawGgAmjxljuBoqGDQIb3d14dKODtR3dvaFUWgUxBAiyh43BjusDyhVrQFQAwCVpaVquJy81CnS3xAxbBjqOztRPn48PsFREZEnuDHYYX1AkX9i7j+l6pxmPmIEEHb/JgZTcGysr8eK8tw+8igXsYXeYbrN/BkAnwJwmYgcBfBXqvqEyZryWaLQiW64ONfejjWPPcZ1JcsVrzqJ1g2jTZdhNZtbuXO5hT5Vprv47jH5/rnMzY45PxsubOw+pNzEVm77cYovx7h9gf/GU0+hvqEBtc3NEc8XFBYCl12WaZkJ8agkl506ZboCa7GV234MqBzj9gX+XHs7yocM6duoG1LLUySst/rBsXgEPWjqasKEggmmy7HOQK3c6Uz/2TxVGC1ItTKg8oztU2jvNjVhTdRoDQDeVTZwZuJCQyFwnekq7JSslTud6b8gTRUGqVaAAZV3bJ9CG9LVhcdHjox5ftGZMxGPMwla28OZ/JWslTud6b8gTRUGqVaAAUUpGFFYGHMwbH1nJz5h8IiiTILW9nD2wtm64agr/QATqjjFFy28lXvD3g3ouNCBjxV9DJs3bcau3+7CH7r+gFOtp3BpyaWouKkCV117VdyTHFpbWnH25Fk8+71ncbLlJC4tuRTzbpyH1pZWv/9KAwraCRUMKBpQvFvMr2lrixh1uDU6GVxQEHd9a3AWd/YN1Rbd7FFQWIiFcf5uueSHc87kxa03MhUKqbMXzvaNpN7+t7dxftt5XPWpqzD1E1PRergV257bhrajbXFPcpAewZv/+iY+ef8nUTylGK2HW/Hmk29ieM9wv/86AwraCRUMqBzj9oGsqb6eW6OT6RMmoDrO60zPYpQTqm1Nc3NEswcbPQiInfb6YP8HuOlrN6HjfAc6znbg8qmXY9YfzcIr33sFf/lXfxnz9YMKBuHKBVfikuJLIIMElxRfgisXXInWre6PoLJtcAjaCRUMqBzj9loK12YoqFK9mEdPe51sOYmbFt2E/bX70fbvbeg434HCwkKMHjU67td393Rj7vVzcezfj6HjfAeGDR+GudfPxSu/ecX1v0+2DQ5BO6GCAZVnbL/lhe31BdGFhkJsHLYDKyoqTJfim3Qu5tHTXpeWXIoje45g1JhRmFXhfO6+7fvw0dmPsO4r62LCrrikGBfPXuz7XABofr/Z9WkztxocgnRCBQMqz9g+Ikq1vkyCLLrZo76zE+VtbTkffg+/vhmPTLnBdBm+SudiHj3tdcWMK/Dq/3wVy7+yHD3dPTjwzgH8/B9/jup7qzH/1vkxYefXtFnQGhzcwICiQMokaKObPda0teHxtWtdqii/2bb5M52Lebxpr1tvuRVH3jyCHc/tQMvRFlTfW40Ftzs3f4wOO7+mzYLW4OAGBlQOMbnPx+apOZtr8013N+ov1KN8qPsnm9u4+TPdi3myaa91X1mH+bfOj3guOuz8mDYLWoODG5IGlIhMBzABwFuqejbs+WWqusnr4ig9Jvf52Dx1aHNtnqqtBQDUbC1H26hRwGhgdFkTALh69JGNmz/dvJjbMnIJWoODGxIGlIj8OYCvANgP4AkRWauqG3s//CgABhSRhWq+F/qBpBwoLgaKgRlz7kHj8U3YehwYOu4U6nAKU6fClRGVjWsjbl7MbRq5BKnBwQ3JRlBfAlChqmdF5AoA/yoiV6jqYwDEj+KIaAC1tajZGhUyVVVAdXXMp05qWOb8ocH57RCexftaDxHgkpHA4snlUAUkzX/dtowwAG/WwmZ9YhYO7T+E9d9ej/b2dowaNQrLVy7Pq6AwJVlADQpN66nqByLyKTghVQoGFCXgxTpYtq/p19qcL+/zxBOoab097InyhIE0kGNP3I3OTuCjj4AZ33wWP3uvHu+9OgmjLu3GNUuasXhyaqMrW0YYXq2F7X1nL/b9bh/uffTeiL/f1HemGgkp2xpSvJQsoD4Ukbmq+i4A9I6klgN4EkBufjcoa16sg2X7mn6tzbn+PrW1wPvvRwXS7cCDD2b2emFUgc5O4MABYPp0YNw7d2PHDuDYAaBZgeLSTdh4ph4AMHWq8zWJpgNtWRvxai3MpjU2GxtSvJQsoL4IoCv8CVXtAvBFEXnc06ooI+xWC7iwpgZHOVC1GpiGjEZIyYgAoX27Bw44vwAnrCoqADmyDDgC7O/ai7btwNgF9TgEJ7Aqy0bHNFnYsDbi1VqYTWtsNoWlHxIGlKoeTfKxrd6UQ9nI2261gIvX1IBVqzx/31BIhcIJ6A2nsAn8GQW9F7065/f9XXtRh3rUwblTb2jtygZerYXZtMZmU1j6weg+KBFZBuAxAIMB/JOq/o3Jeij3hG5ZH30TxBEZ3rI+2TpTSuI1NRQX+xJI0VSBHTsin9uxIzakws0omNUXVgDQWvksNtY7IyvTYeXVWpgta2yAXWHpB2MBJSKDAfwjgJsAHAXwjoi8pKr7TNVE/vGrceFcezsejXPL+uj7W6XzeumsM+3f1YHGrs7IUVKGTQ1uCoVTaA2qoqL/MZA8pMIV193d9+fGsHUrwP/A8motzJY1NsCusPRDsn1QUwFcHj2dJyJVAFpU9fdZvvd8AIdU9XDv6z4LYAUABlSAeXF7jmzX1goKC2NureHFDRdHnD+PNbt3o/Hi5f1PFhYC1y4E7su+scFNIsCQIWFrTmFrUkOGpN9qDvS2sfe2sNfWAuMW7sXpBak1Wrgl1bWw6Hb6gdrrbVhjC9UB2BGWfkg2gvoRgHj/qk73fuzWLN97AoDGsMdHAVwX/UkishrAagCYPGZMlm9JXvNiHSzb14x3U8LyqBsuZuTYMQDA/pZL0djVidtLvgTcWoUKwPgIKRVz5kRemEMhlUk4RXP++s50YKqNFl4Kb83uvDARV09bhlUPXAkR53vwqw2jMHR4Dz51yxnfasqULWHph2QBdbmq7o1+UlX39m7c9YWq1gCoAYDK0lL1632JEtm/KzQauxQYPhwYDmDcGGCtXaOkVESHkRvhFC1eo8XW400YOq5/OnBFuXcjq4jW7CtLsKu2Da/VbAD+diVWPXAlfrVhFN5642O4bvFHGW1UJu8kC6jRST7mxr2MmwBMCns8sfc5Imv0rx0BKC5G41FxQmn69MhPbGvwt7AAm1EwC2iY1Tcd2Fi6Cc//uglDxzmdgW6HVXRrdsXicQCuw6YfvI7mI98BAFy3+CPcvLLdtXDKp820XkoWUHUi8iVV/T/hT4rIfwSwI8HXpOMdANNE5Eo4wXQ3gD924XXJZSZPSc9WuutXEYEUEr4x9qnf4JvtLbGBNCqy9ZdSF34EU2Pppr6uQMBptLh6fHbTgTGt2QJcWz0WG/+mv7PT7XDKp820XkoWUF8H8FMRuRf9gVQJoBDAZ7N9Y1XtEpGvAvglnDbzJ1W1foAvI5elsljsxUkMfm0qHjBAo48OGqDl+/b7nnKlLoovUaNF6HBbIP1Gi5jWbAV21bZh6JD+Vu1fbRjlWkjl22ZaLyXbqPshgIUishjANb1P/0JVN7v15qr6MoCX3Xo9Ss+/7Z6M850FuLPicN9i8Qs7pmD4kC7cOueIp+9tZOQVc1IDgOLVQNW0QDQ15JuBGi1SPY09ojW7bw3qLdywdCVWPdDctwYFuDOSyrfNtF5K1mY+DMCXAUwFsBfAE71HHVEOUAXOdxbg9QPO1MmdFYfxwo4peP3ABNw4vSk3FoujN8UWL3Z+ZyBZL/r/v+mDZzmPexstamuBC1/YhENhjRaJOgOjW7M7L0xE1XUr+7r4bl7pTF8PHd7jyv/z+baZ1kvJpvh+AqATwG8AfAbADDjTfpQDRJxQAoDXD0zoC6obpzf1jaiCKLKpYbFvxwaRe3bvdg6yDbW8hzYVDxnitMYDvT9fhE0HNpaG7nUVv409ujU7ur3ezTWofNtM66VkATVTVWcBgIg8AeBtf0oiv4RCKhROAAIXTgM2NVCghJ+yDkSecDF9euINteGNFvHOCyy+PHI60Mv2+nzbTOulZAHVGfpDb0ODD+WQn0JrTuFe2DElJqSsOSX9iScAADWtt0deqB58MDemJGngU9ZT+G8cfl5g77Ijpv/FsziEeutOtKDkkgXUHBE53ftnATC897EAUFW9xPPqyDOhcAqtOYWvQQGRIyljreRhgeS4Haiqwu7hY9B59TVJp4DCpXusDZmVyinrqepbaqy7G7W1QNvCvTGNFqMH+3uqBaUuWRffYD8LIX+JAMOHdEWsOYXWpIYP6TJzAY856dsJJKzqb2hQBTp3pD4FlMp6Btklk1PWUxHeFQggIrBC04GVZc75BAwsOxi93QaZdeucIzGLxX6vQaXb1JDOFFCm6xlkjlunrKciOrD6Gy1OoQ6nfD8vkGIxoPKcH2exhcRtaADSbmpIdQrIjfUM8pcXp6ynKt1GC/IeA4q8E31KA+BKh106U0BurmfYLJfW2bw8ZT1VyRotLhnpPLblTsK5jAFF7onX1OByy3e6U0CphlmQL/C5uM7m58h+INGNFoATVuF3Es72vECKjwFFmUuhqcFt6UwBpRpmQb7Ac53NX+FhFbK/q/+8QMD/e13lMgYUpS7mYFUzJzWkOgWUSpgF/QLPdTbzwqcDG0s3oQ6n+sIq1fMCKT4GFCUU29Tg/pRdplKdAhoozHLhAp8v62xBEH0aO3rXrQBnKpDrVulhQFGfXD02aKAwC/oF3qt9Q5Sd6mpETAW2VkauWwEMrIEwoPJZTFMDciKQ0hXkC7yf+4YoO8VhYVVbG9lo4dcRTEHDgMoX8e6F5ENTg+2CfoE3uW+IMhc+uop3rys2WjgYULksoqmh3LlbLO+FFMGWC3w2be427BuizM0o6D1Ulo0WMRhQuSSmy2418CDvhTQQ0xd4N9rcbdo3RNkJb7QAgPrjkTdmXFGeP2HFgAowm7vsgsbUBT7obe7kvfDAyrdGCyMBJSJ3AvhrOHfpna+qdSbqCJR4DQ0AAyngcqHNnfwT3Whx5Rc2YeOZ3G20MDWCeg/A5wA8buj97RfT1NDb0DANXEPKMW63uQf52Ca/5ML3KPy297naaGEkoFR1PwDwLr1hYgKJTQ35ws029yAf2+SXXPweRTdaxDuNPYjnBVq/BiUiqwGsBoDJY8YYrsZl7LLLe262uXM9a2D58j0KP34JcDoDjx8GhvY2WwSl0cKzgBKR1wCUxPnQOlXdmOrrqGoNgBoAqCwtVZfK81/MwaoAmxrIzTb3VNazcmFqKxv5uuYXfq+rxtJNfY0WgN1HMHkWUKq61KvXDoSYpoZyZw2JoyOK4mabe7L1rEyntnIt1IJ+tFW2os8LHLfQOY0dsK/RwvopvsCIdy8kNjWkLdcuhqlyq8090XrWvHmZTW3l4npNkI+2clv4be9ra4G2hXsjGi1MbxI21Wb+WQD/AGAcgF+IyLuq+mkTtWQkdNcysMsuXckCKOgXQ9PhOtB61rx5zu+pTm3l4npN0I+28lJ4WAFOo8WF4019m4RNNFqY6uL7KYCfmnjvbPRvjO1taADY1JCGZAE0e3awL4Y2hOtA61mDBqU3tZWL6zW2HG0VBDMKZgENs/qmA000WnCKL5F4TQ3Fxb7fnC9XDPTTeOg5IHgXQ5tGGsnWszKZ2vJqvSbd0aabo1PTR1sF1UCNFl6MrhhQITGBxKYGN6X603gQF69tG2nEW8/KdGrLi/WaVEeboRDxYnTKswuzk6jRog6ncMlIoPhyd9au8jeg4nXZseXbUwP9NB7kxWsvO8PcGD1kMrXlxXpNotHm1q1ASQkwa5YzFRkeQraMTim+6EYLwLnXlRuNFvkRUPHuhVT1fed3NjX4JlkAhf7s5+K1m9NGXoWrm6OHdKe2vFivSTTaLCkBLl4Edu6MDaF0mzvInL5Lae+ZgbW1wIUvRJ7GXlk2GgBSmg7M6YCKaWooBteQDEn00/j+/c7HKyqci15ZmT+L125e+L3qDPNibSvdqS031mvi1Rk92rzzTiecEoVQEKd+KfK8QMBZu9p6HBg6zrnf1UDnBeZUQMXcfoJNDdaI99P4kCFAYSFQUOA8nj0bqKsD9uxxLoxeLV67feH3qjPMlrWtbNZr4v0gUFcHHDkS+Xk7dzojpXghFOSpX4oU3mgRfV5gPIENqNh7IYGBZLnwn8ZDIdHZCXR19V+EDh6MDAkvLkBeXPi96gwL8ugh3g8CdXXAli3O40WLgMrK/h8Ofv/7yO9haINxaGTFfUu5JfK8wHvifk6gAup4S3d/MDGMAin6Ag6YGR14ceH3ojMsyKOHRP+NJ092flVWOp8zb54TTi0tTuNsdAgVFHDfUr4KVEChqIiddjnE5OggCBf+XDj1IN5/4899rv9jgNO1V1YGXHVV/BDivqX8FbyAokBJ1ilnKiRSvfCbProoF049GKhzM2Tu3OQhxH1L+SlYAUWBMtDRRl6NDgYKllQu/OG1h4TX7tcFMsijh3RHgAwhisaAIk+kcrRRJhtHBxrRpNo+PtCRQKHaGxqc9RLAaeAoK3MW+gsL/T1jL9ljW+XCCJDMYkCRJ1JpgkhndJBK8KTbPp7owh+qQ9XpONuzBxg92uk6A2I7DSmxII8AyTwGFHkmlSaIVEYHqQaPm52BIk6X2cGDzuNTp5zXE8nPUwyyWY+LXs+Lt75HFM8g0wVQ7kq0QK6a3uuEgmf6dCck1q+PXNeIDrzoBfhMz4wL1T5unPP7iRPO8/kWTrt3R/53C31vdu/25+spfzGgyBPRC+T33tsfMNmEVLh4QeFGKIbXXlbm/Bo92hlFnTjhrEGlW39QhY9eQ9/H0Pems3Pg70O2X0/5jVN85Am3F8hTaUl3a99QqParr3YeHzzorD+pAo2NzuN8WUvJdtrU9IZsCjYGFHnGrQXyVIPH7VAMf71585z3nDrV+ck/n7rQst1QHeTjmsgsI1N8IvJ9ETkgIntE5KciMtpEHeQ9N1qkEwXP9OmxQTFnTuwGz4qK9FrCQ9NSBw865wSGzoM7eNB5fl7MVboAAA6HSURBVN48/1rMbZDttKlba5GUf0yNoF4F8KCqdonI/wDwIIBvGaqFAiCd0VgmoRj92rbfg8ivUy6ynTbNheOayBwjAaWqvwp7uB3AHSbqoGDxasNqvD1WO3c6h5SGs+ViOtAJHZkEV6LAy3balJt1KRs2rEHdD+A500VQsGU6oki0x2r/fue0iHA2HCabbE/Y8OHOXWkrKiJvm15Q4Jx1l8hAm6CzXUvkZl3KlGcBJSKvASiJ86F1qrqx93PWAegCsD7J66wGsBoAxoyZ7EGlFHTZ3B03XpeZqhNOnZ2ZT0t5NQWXqCvu6qudj/32t8Dhw8AddwC7dvUHbejkjnh1proJOrqOdOvO5uspP3kWUKq6NNnHReQ+AMsB3KiaeLlUVWsA1ABAaWkll1Upght3x43uMgudFhEeeulMS7l5O/lU6m1r6183O3wYqK93gmn0aODjH++/MWS87wXbwMlmRqb4RGQZgAcA3KCq50zUQLnBjQtsvC6zULdeutNSbt9OfqB6VYH2duDll53Hd9zhhFNbm/P82LHAjBnJa2cbONnK1BrUjwEMBfCqOP8Ktqvqlw3VQgGXzQU2nS6zVDf5ZhOY0QHW0+OsJ4U/Dr8F+rx5wPPPO8+9/DLwm98A5845r1NQABw/7pzikUqnXTgb1tuITHXxTTXxvpSbsrnAetFllmlgRk8N7t7df9xS6IZ+O3cCTU2R9d51l/P1b70FnDzpPDdlivNcezvwwgvAnXdGBl0I28DJZjyLjwLNjTP/3NjcG6+mcAPVEn1mXU+P8+d9+5wNwj09/X/PCRNipx+vuqq/GULV+Zy1a4GZM4GWFifY4r1/OpugifxmQ5s5UcbcGgG51WWWyogk+vVD03rxuglnznSC61/+xflY9FShqnN47ZYtQEmJ83x7O9Dc7IRSqJsv2feCbeBkKwYUBZ5NF9iBAnPPnuQdftHdhHfe2R9OQPy/V0OD8/uiRc49rN5+22k3P3LEeZzqVGeyx0QmBD6gCgo6MWXKUYwY0WG6lITOnRuGw4cnoqtriOlScpaXF9h09zQlCkwgdjQVPtoKNUCEv88LL0S+dvTa2p49zp+rqpwwApy1pkmTnINtGTQUZIEPqClTjmLSpJEYOfIKiIX/GlUVZ860ATiK3/3uStPlUJoy3dOUKDATdfiFDqQN78574QVnDWrmTGckFfp4+Ot0dgLnz/e//o4dzppVWZlz7BFRkAU+oEaM6LA2nABARDBy5FiMGHHcdCmUJi/2NCXr8IueGpw+3fl4WZkzKoq3thYeeKHb03OTLeWKwAcUAGvDKcT2+ig+L05ZSNYSHz01OGcOMGtWf3t4vLW1RIE3UA1eHMNE5LacCCgir7h5ykIme46i9y5Ff1wVePFFZ0PuuHHOc3V1zu+FhbHTkF4fw0TkJu6DcsHatfdj5sxiVFdfY7oUcpmbN9tze89RqMX8yBHncVmZ82vLFufXxYuRdUbvtQoPzNBZfUQ2yasR1He+dh86Wltinh9WXIL/9g9PZfy6d999H1at+iq++tUvZlEd2caLUxbcbIkXcUZJixY5jw8e7A+ZyZOdrr5404EAD4alYMirgOpobcH/mlga8/x/OtqQ1etef301jhz5IKvXIPt4cQxS6HWTPU5HKPAAJ6BEgMsuAz73ufivy4NhKUg4xUeUhNvHIHklfBpSxJn6i57eC/3u1pQlkdfyagRFlAmbT1mINw354ovOGhTQv3k31AgRWoPiwbAUBBxBEQVY9DQk4Kw/Af3NE+GNEAUFPBiWgoMjKKKAi268CI2aDh4E1q93/hweSracW0g0kLwKqGHFJXEbIoYVl2T1umvW3IOtW3+NP/zhBObMmYgHHvgu7r13VVavSZTIQBttRZyQCp0sASS/8SLDiWyVVwGVTSt5Mo8//ownr0sULZWNtrxDLuUKrkERBUQqG23duIEjkS3yagRFFGSpbrT1Yu8WkQlGAkpEHgawAkAPgFYA96lqs4laiIIklY22Nt3AkSgbpqb4vq+qs1V1LoCfA/iOoTqIAiXVjbZshKBcYGQEpaqnwx5+DABnxokG4MXZgEQ2M7YGJSL/HcAXAbQDWJzk81YDWA0AY8ZM9qc4Igt5dTYgka08m+ITkddE5L04v1YAgKquU9VJANYD+Gqi11HVGlWtVNXKoqJxWdcVPRXiRldTU1MjPvvZxVi0aCY++cly1NQ8lv2LEsURlLMBidzg2QhKVZem+KnrAbwM4K+8qiXkl78EOjqA227r30Py0kvAsGHApz+d+esWFBTgu9/9AWbPnoezZ89g6dIK3HDDTSgrm+le8eQ7W+88y/UlyhdGmiREZFrYwxUADiT6XLeoOuFUW+uEUiicamud57MZSV1++ccxe/Y8AEBR0UhcffUMHDvW5FLlZMLu3ZHNB6H1n927zdZFlE9MrUH9jYiUwWkzbwDwZa/fUMQZOQFOKNXWOn+uru4fUbnhyJEPsHfvLlRUXOfOC5LvwjfEApHNCNOn2zOSIsp1prr4Vpp431BIhcIJcDeczp49i/vvX4mHH/4RRo68xJ0XJd/xzrNEdsiro45C03rhQtN92ers7MT996/EypX3Yvnyz2X/gmRUeEiFMJyI/JU3ARW+5lRdDfzd3zm/h69JZf7aiq9/fRWuvnoG/uzP/sK9oskY3nmWyLy8OYtPxOnWC19zCq1JDRuW3U/Gb721FS+88P8wY8YsLF48FwCwbt2jWLr0j1yonPzGDbFEdsibgAKcVvLoM8rcWINasGARWlv5o3Wu4IZYIjvkVUAB3ENCqeGBq0Tm5c0aFFG6+MMMkVkMKCIishIDioiIrMSAIiIiKzGgiIjISnnXxeeFjo4OrFhRjQsXLqC7uwvLl9+Bb33ru6bLIiIKtLwLqJ273sYvXtuA5tZGjC+ehFuWrsS8a+dn9ZpDhw7Fhg2bUVRUhM7OTtx66yLceONnUFm5wKWqiYjyT14F1M5db2P9KzWo+vwiLJ1yI44dbsb652oAIKuQEhEUFRUBcM7k6+zshLAnmYgoK3m1BvWL1zag6vOLMHHaJAwePBgTp01C1ecX4Revbcj6tbu7u7F48VzMnFmMG264ibfbICLKUl4FVHNrIz4+ZXzEcx+fMh7NrY1Zv/bgwYPxxhvvYvfuo9i1623s3/9e1q9JRJTP8iqgxhdPwrHDzRHPHTvcjPHFk1x7j1GjRqOqajE2b97k2msSEeWjvAqoW5auxNbntuDo+43o7u7G0fcbsfW5LbhlaXb3Tzxx4jja208BAM6fP48333wV06ZNd6NkIqK8lVdNEqFGiF+8uAGvtv4K44sn4d7PrM66i+/DD4/ha1/7D+ju7oZqD2677S7cfPNyN0omIspbeRVQgBNS2QZStPLy2di8eZerr0lElO+MTvGJyDdFREXkMpN1EBGRfYwFlIhMAnAzgCOmaiAiInuZHEH9EMADALK+Fa2q3Xeztb0+IiIbGQkoEVkBoElVd6fwuatFpE5E6s6ePR7z8XPnhuHMmTZrQ0BVceZMG86dG2a6FCKiQPGsSUJEXgNQEudD6wB8G8703oBUtQZADQCUllbGpNDhwxMBHMWIEbHhZYtz54b11klERKnyLKBUdWm850VkFoArAezuPa9uIoCdIjJfVVvSfZ+uriH43e+uzKpWIiKyj+9t5qq6F0Bx6LGIfACgUlVP+F0LERHZK69OkiAiouAwvlFXVa8wXQMREdlHbO1+i0dEjgNoMF1Hii4DwGnL+Pi9SYzfm8T4vUks6N+bUlUdF/1koAIqSESkTlUrTddhI35vEuP3JjF+bxLL1e8N16CIiMhKDCgiIrISA8o7NaYLsBi/N4nxe5MYvzeJ5eT3hmtQRERkJY6giIjISgwoIiKyEgPKB7wxYywR+b6IHBCRPSLyUxEZbbom00RkmYgcFJFDIvJfTNdjCxGZJCJviMg+EakXkbWma7KNiAwWkV0i8nPTtbiJAeUx3pgxoVcBXKOqswH8DsCDhusxSkQGA/hHAJ8BMBPAPSIy02xV1ugC8E1VnQlgAYCv8HsTYy2A/aaLcBsDynuu3Zgxl6jqr1S1q/fhdjin2uez+QAOqephVb0I4FkAKwzXZAVVPaaqO3v/fAbOhXiC2arsISITAdwC4J9M1+I2BpSH0rkxY567H8ArposwbAKAxrDHR8GLcAwRuQLAtQDeMluJVX4E54fgHtOFuM34YbFB59aNGXNRsu+Nqm7s/Zx1cKZw1vtZGwWPiBQB2ADg66p62nQ9NhCR5QBaVXWHiHzKdD1uY0Blya8bMwZRou9NiIjcB2A5gBuVG/KaAEwKezyx9zkCICJD4ITTelV90XQ9FqkCcJuI/BGAYQAuEZGnVfVPDNflCm7U9QlvzBhJRJYB+HsAN6jqcdP1mCYiBXCaRW6EE0zvAPhjVa03WpgFxPkJ7ycA/qCqXzddj616R1D/WVWXm67FLVyDIlN+DGAkgFdF5F0R+d+mCzKpt2HkqwB+CacJ4HmGU58qAF8AsKT3/5V3e0cMlOM4giIiIitxBEVERFZiQBERkZUYUEREZCUGFBERWYkBRUREVmJAEflIRLp726TfE5EXRGRE7/MlIvKsiPxeRHaIyMsicnWcr39SRFpF5D3/qyfyFwOKyF/nVXWuql4D4CKAL/duRP0pgF+r6lWqWgHndPfL43z9UwCW+VYtkUE86ojInN8AmA1gMYBOVe3brJzogGFVre09MJUo53EERWRA79FGnwGwF8A1AHaYrYjIPgwoIn8NF5F3AdTBuYnlE4brIbIWp/iI/HVeVeeGPyEi9QDuMFQPkbU4giIybzOAoSKyOvSEiMwWkU8arInIOAYUkWG998L6LIClvW3m9QC+ByDmvmEi8gyAbQDKROSoiKzyt1oi//A0cyIishJHUEREZCUGFBERWYkBRUREVmJAERGRlRhQRERkJQYUERFZiQFFRERW+v+xg1fE3UjK6wAAAABJRU5ErkJggg==\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light",
"tags": []
},
"output_type": "display_data"
}
],
"source": [
"plot_decision_regions(X_train_pca, y_train, classifier=lr)\n",
"plt.xlabel('PC 1')\n",
"plt.ylabel('PC 2')\n",
"plt.legend(loc='lower left')\n",
"plt.tight_layout()\n",
"# plt.savefig('images/05_04.png', dpi=300)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "lS4QAHFwtAXw"
},
"source": [
"### テストデータに対する予測結果"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 317
},
"id": "reEKKpwj_FK-",
"outputId": "2fdae932-a3dd-4006-b3fd-ba53e6450e7e"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"accuracy 0.9259259259259259\n"
]
},
{
"data": {
"text/plain": [
""
]
},
"execution_count": 30,
"metadata": {
"tags": []
},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light",
"tags": []
},
"output_type": "display_data"
}
],
"source": [
"from sklearn.metrics import plot_confusion_matrix\n",
"\n",
"# 精度\n",
"print('accuracy', lr.score(X_test_pca, y_test))\n",
"# confusion matrix\n",
"plot_confusion_matrix(lr, X_test_pca, y_test)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 368
},
"id": "LcaYkPPpxt-p",
"outputId": "dded5d8f-9ea3-4efb-f7f8-d07f683aad77"
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"'c' argument looks like a single numeric RGB or RGBA sequence, which should be avoided as value-mapping will have precedence in case its length matches with 'x' & 'y'. Please use a 2-D array with a single row if you really want to specify the same RGB or RGBA value for all points.\n",
"'c' argument looks like a single numeric RGB or RGBA sequence, which should be avoided as value-mapping will have precedence in case its length matches with 'x' & 'y'. Please use a 2-D array with a single row if you really want to specify the same RGB or RGBA value for all points.\n",
"'c' argument looks like a single numeric RGB or RGBA sequence, which should be avoided as value-mapping will have precedence in case its length matches with 'x' & 'y'. Please use a 2-D array with a single row if you really want to specify the same RGB or RGBA value for all points.\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light",
"tags": []
},
"output_type": "display_data"
}
],
"source": [
"plot_decision_regions(X_test_pca, y_test, classifier=lr)\n",
"plt.xlabel('PC 1')\n",
"plt.ylabel('PC 2')\n",
"plt.legend(loc='lower left')\n",
"plt.tight_layout()\n",
"# plt.savefig('images/05_05.png', dpi=300)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "CpFHlqO5tL_T"
},
"source": [
"次元削減せずに全てのの主成分を取得したい場合は、 `n_components=None` にする。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 68
},
"id": "J5edgc_7xt-r",
"outputId": "fdf117dc-9c1d-46a7-eb76-1452aa51da0c"
},
"outputs": [
{
"data": {
"text/plain": [
"array([0.36951469, 0.18434927, 0.11815159, 0.07334252, 0.06422108,\n",
" 0.05051724, 0.03954654, 0.02643918, 0.02389319, 0.01629614,\n",
" 0.01380021, 0.01172226, 0.00820609])"
]
},
"execution_count": 32,
"metadata": {
"tags": []
},
"output_type": "execute_result"
}
],
"source": [
"pca = PCA(n_components=None)\n",
"X_train_pca = pca.fit_transform(X_train_std)\n",
"pca.explained_variance_ratio_"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Xe99xVa8Cvsd"
},
"source": [
"## 3 次元に次元削減された特徴量を用いてロジスティック回帰を行ってみる"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "4Muajlv6LKF6"
},
"outputs": [],
"source": [
"from sklearn.linear_model import LogisticRegression\n",
"\n",
"k = 3\n",
"\n",
"pca = PCA(n_components=3)\n",
"X_train_pca = pca.fit_transform(X_train_std)\n",
"X_test_pca = pca.transform(X_test_std)\n",
"\n",
"lr = LogisticRegression(penalty='l2', C=1.0)\n",
"# lr = LogisticRegression(penalty='none')\n",
"lr = lr.fit(X_train_pca, y_train)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"id": "1vvAiqdURuqV",
"outputId": "22a1be3b-75e2-4c21-cd0c-ed21f7466596"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(124, 3)\n"
]
}
],
"source": [
"print(X_train_pca.shape)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"id": "oFPspmL4RFCd",
"outputId": "ae43e2bc-7343-4623-cd85-a3fcb39815dd"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Cumulative explained variance ratio: 0.6720155475408875\n"
]
}
],
"source": [
"print('Cumulative explained variance ratio:', sum(pca.explained_variance_ratio_))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"id": "5gLd8w0RLX_x",
"outputId": "7bef8190-9893-4b98-c6e6-a5897a822b5a"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"100 loops, best of 3: 6.02 ms per loop\n"
]
}
],
"source": [
"%timeit lr.fit(X_train_pca, y_train)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 313
},
"id": "GAWPCiR1LjBt",
"outputId": "b5b2e511-bfc3-4dd4-e652-a4b47855a2a5"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"accuracy 0.9838709677419355\n"
]
},
{
"data": {
"text/plain": [
""
]
},
"execution_count": 37,
"metadata": {
"tags": []
},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light",
"tags": []
},
"output_type": "display_data"
}
],
"source": [
"from sklearn.metrics import plot_confusion_matrix\n",
"\n",
"# 精度\n",
"print('accuracy', lr.score(X_train_pca, y_train))\n",
"# confusion matrix\n",
"plot_confusion_matrix(lr, X_train_pca, y_train)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 248
},
"id": "WTxnzo33MIHS",
"outputId": "bb1c433c-97f8-4e1f-a822-89b3f6f88a6e"
},
"outputs": [
{
"data": {
"image/png": "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n6F3edbDaDSSmZkZwQDQjwSr/m5TjTYnCqFQiKamJlwuF2vWrInLoh0m9ttTTym//e1vef755+nv7+fUU0/VHKrn2rftBKbGiUz3GIYsy3R0dLB9+3Z27NhBbW0to6OjlJeXa426devWTduZ1+/309DQQCgUory8PG6lKn19WNUzmC/+sGpDo3b5Z8thjW7UzYVrs1ofVwWWErFBKYrCc889x8MPP8xdd93FpZdeSlNTEzt37uTiiy8+ogMGJzLdsT84EXSPL0iSxIcffqiJ/OzduxdBEKisrNQGOcrLy2N279Ug3tPTQ3FxccxMcTpQj8Bq4FLrwyrLIBH84VAoREtLC8PDw1RUVMxZUJloEm0mAxDBYJCGhgaCwSAVFRUJGzHv6+vjO9/5DlarlR//+MfzTombCieC7tgfnAi6xzcURcHlcrFr1y6NP9zQ0EB2djZVVVVUVVWxadMm9u/fj8PhYP369QkX6Y5eT/Q4sKIo47iq8dSq1UxRtVCa73rlTEabVbnI5cuXJ2yCUZZl/vznP/PII49wzz33cOmllx419XUVn//853nzzTcZHBxk0aJF3H333Vx99dVHellziRNBV8Wjjz7KzTffzMDAwFGXCcwXFEWht7eXHTt2sG3bNp599lmsVqtGW6uurmb9+vXz1hybTH84Vn04EAhQX1+PLMuUl5fPixhRvJhotDklJQWn04nZbGblypUJqxH39vZy0003YbPZePzxx8nOzk7IdePByy+/zA033EAoFOKaa67htttum7fXPgZwIuhCWKfzmmuu4dChQ+zatetjG3T1+MIXvsAVV1zBxRdfTGNjo1Yf3rNnD4FAgDVr1mj14ZUrV86bolas+nBSUhKiKOJ0OikuLiY3N3de1jIbqM29lpYWMjMzCYVCMUeb47E610OWZf74xz/y2GOPce+99/KpT31qXrPbUChEWVkZr776Kvn5+VRXV/P73//+WJNfnEucCLoAn/nMZ7jzzju55JJL2Llz54mgOwV8Ph979uyJEIFPTU2NEPmZrwEJp9NJXV0dJpOJ5ORknE5nwuvDiYbP59OGHEpLSyM2rKlGmydrOvb29nLDDTeQlZXFY489Nu8TgQDvv/8+d911F6+88goADzzwAAC33377vK/lKMUJytgLL7xAXl4e69atO9JLOWZgsVg46aSTOOmkk4Bw1jY0NKSJ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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light",
"tags": []
},
"output_type": "display_data"
}
],
"source": [
"from mpl_toolkits.mplot3d import Axes3D\n",
"import matplotlib.pyplot as plt\n",
"\n",
"fig = plt.figure()\n",
"ax = fig.add_subplot(111, projection='3d')\n",
"\n",
"# ax.scatter(X_train_pca[:,0], X_train_pca[:,1], X_train_pca[:,2], c='r', marker='o')\n",
"ax.scatter(X_train_pca[:,0], X_train_pca[:,1], X_train_pca[:,2], c=y_train, marker='o')\n",
"\n",
"ax.set_xlabel('PC1')\n",
"ax.set_ylabel('PC2')\n",
"ax.set_zlabel('PC3')\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 542
},
"id": "gb_gHez23KnK",
"outputId": "ed40d789-41ad-450a-bc54-46eff9b9bce9"
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"\n",
" \n",
" \n",
" \n",
" \n",
"
\n",
" \n",
"
\n",
"\n",
""
]
},
"metadata": {
"tags": []
},
"output_type": "display_data"
}
],
"source": [
"# plotly を使った interactive な 3D 散布図\n",
"import plotly.express as px\n",
"\n",
"df = pd.DataFrame(X_train_pca, columns=['PC1', 'PC2', 'PC3'])\n",
"df['label'] = y_train\n",
"\n",
"fig = px.scatter_3d(df, x='PC1', y='PC2', z='PC3',\n",
" color='label', opacity=0.7, )\n",
"fig.show()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "lftcQeROP8x9"
},
"source": [
"人間の目で確認できるのは 3 次元が限界。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "yiGD5KoZB4M6"
},
"source": [
"## 次元削減せずにロジスティック回帰を行ってみる\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "sPjATTfXCBoO"
},
"outputs": [],
"source": [
"from sklearn.linear_model import LogisticRegression\n",
"\n",
"lr = LogisticRegression(penalty='l2', C=1.0)\n",
"# lr = LogisticRegression(penalty='none')\n",
"lr = lr.fit(X_train_std, y_train)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"id": "xzhVfAVqFsak",
"outputId": "9ba54299-78b2-4308-cb51-90ef79342af2"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"100 loops, best of 3: 7.24 ms per loop\n"
]
}
],
"source": [
"# 学習時間\n",
"%timeit lr.fit(X_train_std, y_train)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 630
},
"id": "JoeDSsDsCIyj",
"outputId": "64a753f2-1dba-43f7-ce01-bef6279a28de"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Evaluation of training dataset\n",
"accuracy 1.0\n",
"Evaluation of test dataset\n",
"accuracy 1.0\n"
]
},
{
"data": {
"text/plain": [
""
]
},
"execution_count": 42,
"metadata": {
"tags": []
},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light",
"tags": []
},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light",
"tags": []
},
"output_type": "display_data"
}
],
"source": [
"from sklearn.metrics import plot_confusion_matrix\n",
"\n",
"print('Evaluation of training dataset')\n",
"# 精度\n",
"print('accuracy', lr.score(X_train_std, y_train))\n",
"# confusion matrix\n",
"plot_confusion_matrix(lr, X_train_std, y_train)\n",
"\n",
"print('Evaluation of test dataset')\n",
"# 精度\n",
"print('accuracy', lr.score(X_test_std, y_test))\n",
"# confusion matrix\n",
"plot_confusion_matrix(lr, X_test_std, y_test)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Uiv1Oy6kIhK5"
},
"source": [
"元々の全ての特徴量を使って学習させた方が精度が高くなった。 \n",
"学習時間は、次元削減したほうがわずかに早くなっている。\n",
"(主成分 2 つで学習した場合 4.9 ms に対し、元々の特徴量全て使った場合 5.64 ms) \n",
"結論として、今回のタスクでは、PCA を適用するべきではなく、すべての特徴量を使用したほうが良い。 \n",
" \n",
"もっとデータ数が大きい場合や、モデルのパラメータ数が多い場合には、次元削減が効果的となる。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "HoBsyKBGHsWp"
},
"source": [
"### 2つの特徴量だけでロジスティック回帰を行ってみる\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "skuEBI5RH40z"
},
"outputs": [],
"source": [
"from sklearn.linear_model import LogisticRegression\n",
"\n",
"lr = LogisticRegression(penalty='l2', C=1.0)\n",
"# lr = LogisticRegression(penalty='none')\n",
"lr = lr.fit(X_train_std[:,:2], y_train)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"id": "MtNJevdAH6QN",
"outputId": "f12503a1-9b69-4b32-a88b-5d7282159677"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"100 loops, best of 3: 3.6 ms per loop\n"
]
}
],
"source": [
"%timeit lr.fit(X_train_std[:,:2], y_train)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 630
},
"id": "fUj-ZkJ8IW5P",
"outputId": "1974df4e-94a7-40a8-b837-c77979aa70ea"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Evaluation of training dataset\n",
"accuracy 0.7580645161290323\n",
"Evaluation of test dataset\n",
"accuracy 0.7777777777777778\n"
]
},
{
"data": {
"text/plain": [
""
]
},
"execution_count": 45,
"metadata": {
"tags": []
},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light",
"tags": []
},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light",
"tags": []
},
"output_type": "display_data"
}
],
"source": [
"from sklearn.metrics import plot_confusion_matrix\n",
"\n",
"print('Evaluation of training dataset')\n",
"# 精度\n",
"print('accuracy', lr.score(X_train_std[:,:2], y_train))\n",
"# confusion matrix\n",
"plot_confusion_matrix(lr, X_train_std[:,:2], y_train)\n",
"\n",
"print('Evaluation of test dataset')\n",
"# 精度\n",
"print('accuracy', lr.score(X_test_std[:,:2], y_test))\n",
"# confusion matrix\n",
"plot_confusion_matrix(lr, X_test_std[:,:2], y_test)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "dnNozYLnJG_F"
},
"source": [
"もともとの特徴量を 2 つだけ使った場合、精度はかなり下がる。\n",
"これと比べると、PCA によって特徴抽出した 2 つの主成分を使った場合には、精度がかなり高いことがわかる。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "tZsOxnuoSHC9"
},
"source": [
"## まとめ\n",
"\n",
"主成分分析により以下のタスクを行うことができる。\n",
"\n",
"- 次元削減\n",
" - データを格納するためのメモリやディスク使用量を削減できる\n",
" - 学習アルゴリズムを高速化できる\n",
"- 可視化\n",
" - 多数の特徴量(次元)をもつデータを2次元などの理解しやすい空間に落とし込んで議論、解釈することができる。\n",
" \n",
"しかし、機械学習の前処理として利用する場合には、以下のことに注意する必要がある。\n",
"\n",
"- 次元削減を行うことによって、多少なりとも情報が失われている\n",
"- まずは、すべての特徴量を使ってトレーニングを試すことが大事 \n",
"- 次元削減によってオーバーフィッティングを防ぐことができるが、次元削減を使う前に正則化を使うべし\n",
"- 上記を試してから、それでも望む結果を得られない場合、次元削減を使う\n",
"- 機械学習のトレーニングでは、通常は、99% の累積寄与率が得られるように削減後の次元数を選ぶことが多い \n",
"\n",
"参考) [Andrew Ng先生の講義](https://www.coursera.org/learn/machine-learning)"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true,
"id": "KkvcNebnxt_3"
},
"source": [
"## References"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "x4HvU9ydxt9f"
},
"source": [
"1. *Python Machine Learning 2nd Edition* by [Sebastian Raschka](https://sebastianraschka.com), Packt Publishing Ltd. 2017. Code Repository: https://github.com/rasbt/python-machine-learning-book-2nd-edition\n",
"1. [Andrew Ng先生の講義](https://www.coursera.org/learn/machine-learning)"
]
}
],
"metadata": {
"anaconda-cloud": {},
"colab": {
"collapsed_sections": [],
"include_colab_link": true,
"name": "da_handson_pca.ipynb",
"provenance": []
},
"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"
},
"toc": {
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"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": 1
}