├── .gitignore ├── .ipynb_checkpoints └── Pseudo-Labeling-checkpoint.ipynb ├── Keras └── feature_extract_and_xgboost.ipynb ├── MachineLearning ├── .ipynb_checkpoints │ └── nile_RF-checkpoint.ipynb ├── Readme.md ├── ch03_rasbt.ipynb ├── ch04_rasbt.ipynb ├── ch05_rasbt.ipynb ├── ch06_rasbt.ipynb ├── ch07_rasbt.ipynb ├── ch10_rasbt.ipynb ├── ch11_rasbt.ipynb ├── images │ ├── 03_05.png │ ├── 03_09.png │ ├── 03_11.png │ ├── 04_15.png │ ├── 06_01.png │ ├── 06_02.png │ ├── 06_03.png │ ├── 06_04.png │ ├── 06_05.png │ ├── 06_06.png │ ├── 06_07.png │ ├── 06_08.png │ ├── 06_10.png │ ├── 07_06.png │ ├── 07_07.png │ ├── 07_08.png │ ├── 07_09.png │ ├── 07_10.png │ ├── 07_11.png │ └── 11_11.png └── pandas_tutorial.ipynb ├── PseudoLabel ├── Accurate-Pseudo-Label.ipynb ├── Cross-Pseudo-Label.ipynb ├── Distillation-Pseudo-Label.ipynb ├── Make-Pseudo-Label.ipynb └── Train-Pseudo-Label.ipynb ├── examples └── entity_embeddings.ipynb ├── hikkoshi ├── Untitled.ipynb ├── Visualize.ipynb ├── dow_embedding.png ├── entity_embeddings_example.ipynb ├── month_embedding.png ├── subspace_method_example.ipynb └── train.ipynb └── 輪講 ├── 353.png ├── 356.png ├── 366.png ├── EP.ipynb ├── alg35.png ├── alg36.png ├── ep.pdf └── ep.py /.gitignore: -------------------------------------------------------------------------------- 1 | *.tsv 2 | *.csv 3 | */.ipynb_checkpoints/ 4 | .DS_Store 5 | PseudoLabel/data/ 6 | PseudoLabel/log/ 7 | PseudoLabel/save/ 8 | -------------------------------------------------------------------------------- /.ipynb_checkpoints/Pseudo-Labeling-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": null, 6 | "metadata": { 7 | "collapsed": true 8 | }, 9 | "outputs": [], 10 | "source": [ 11 | "import torch\n", 12 | "import torch.nn as nn\n", 13 | "import torch.nn.functional as F\n", 14 | "import torch.optim as optim\n", 15 | "from torchvision import datasets, transforms\n", 16 | "from torch.autograd import Variable\n", 17 | "\n", 18 | "batch_size = 64\n", 19 | "test_batch_size = batch_size * 2\n", 20 | "epochs = 20\n", 21 | "lr = 0.01\n", 22 | "seed = 2017\n", 23 | "log_interval = 1000\n", 24 | "\n", 25 | "torch.manual_seed(args.seed)\n", 26 | "\n", 27 | "kwargs = {'num_workers': 1, 'pin_memory': True} if args.cuda else {}\n", 28 | "train_loader = torch.utils.data.DataLoader(\n", 29 | " datasets.MNIST('../data', train=True, download=True,\n", 30 | " transform=transforms.Compose([\n", 31 | " transforms.ToTensor(),\n", 32 | " transforms.Normalize((0.1307,), (0.3081,))\n", 33 | " ])),\n", 34 | " batch_size=batch_size, shuffle=True, **kwargs)\n", 35 | "test_loader = torch.utils.data.DataLoader(\n", 36 | " datasets.MNIST('../data', train=False, transform=transforms.Compose([\n", 37 | " transforms.ToTensor(),\n", 38 | " transforms.Normalize((0.1307,), (0.3081,))\n", 39 | " ])),\n", 40 | " batch_size=args.test_batch_size, shuffle=True, **kwargs)\n", 41 | "\n", 42 | "\n", 43 | "class Net(nn.Module):\n", 44 | " def __init__(self):\n", 45 | " super(Net, self).__init__()\n", 46 | " self.conv1 = nn.Conv2d(1, 10, kernel_size=5)\n", 47 | " self.conv2 = nn.Conv2d(10, 20, kernel_size=5)\n", 48 | " self.conv2_drop = nn.Dropout2d()\n", 49 | " self.fc1 = nn.Linear(320, 50)\n", 50 | " self.fc2 = nn.Linear(50, 10)\n", 51 | "\n", 52 | " def forward(self, x):\n", 53 | " x = F.relu(F.max_pool2d(self.conv1(x), 2))\n", 54 | " x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2))\n", 55 | " x = x.view(-1, 320)\n", 56 | " x = F.relu(self.fc1(x))\n", 57 | " x = F.dropout(x, training=self.training)\n", 58 | " x = self.fc2(x)\n", 59 | " return F.log_softmax(x)\n", 60 | "\n", 61 | "model = Net()\n", 62 | "if args.cuda:\n", 63 | " model.cuda()\n", 64 | "\n", 65 | "optimizer = optim.SGD(model.parameters(), lr=args.lr, momentum=args.momentum)\n", 66 | "\n", 67 | "def train(epoch):\n", 68 | " model.train()\n", 69 | " for batch_idx, (data, target) in enumerate(train_loader):\n", 70 | " if args.cuda:\n", 71 | " data, target = data.cuda(), target.cuda()\n", 72 | " data, target = Variable(data), Variable(target)\n", 73 | " optimizer.zero_grad()\n", 74 | " output = model(data)\n", 75 | " loss = F.nll_loss(output, target)\n", 76 | " loss.backward()\n", 77 | " optimizer.step()\n", 78 | " if batch_idx % args.log_interval == 0:\n", 79 | " print('Train Epoch: {} [{}/{} ({:.0f}%)]\\tLoss: {:.6f}'.format(\n", 80 | " epoch, batch_idx * len(data), len(train_loader.dataset),\n", 81 | " 100. * batch_idx / len(train_loader), loss.data[0]))\n", 82 | "\n", 83 | "def test():\n", 84 | " model.eval()\n", 85 | " test_loss = 0\n", 86 | " correct = 0\n", 87 | " for data, target in test_loader:\n", 88 | " if args.cuda:\n", 89 | " data, target = data.cuda(), target.cuda()\n", 90 | " data, target = Variable(data, volatile=True), Variable(target)\n", 91 | " output = model(data)\n", 92 | " test_loss += F.nll_loss(output, target, size_average=False).data[0] # sum up batch loss\n", 93 | " pred = output.data.max(1, keepdim=True)[1] # get the index of the max log-probability\n", 94 | " correct += pred.eq(target.data.view_as(pred)).cpu().sum()\n", 95 | "\n", 96 | " test_loss /= len(test_loader.dataset)\n", 97 | " print('\\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\\n'.format(\n", 98 | " test_loss, correct, len(test_loader.dataset),\n", 99 | " 100. * correct / len(test_loader.dataset)))\n", 100 | "\n", 101 | "\n", 102 | "for epoch in range(1, args.epochs + 1):\n", 103 | " train(epoch)\n", 104 | " test()" 105 | ] 106 | } 107 | ], 108 | "metadata": { 109 | "kernelspec": { 110 | "display_name": "Python 3", 111 | "language": "python", 112 | "name": "python3" 113 | }, 114 | "language_info": { 115 | "codemirror_mode": { 116 | "name": "ipython", 117 | "version": 3 118 | }, 119 | "file_extension": ".py", 120 | "mimetype": "text/x-python", 121 | "name": "python", 122 | "nbconvert_exporter": "python", 123 | "pygments_lexer": "ipython3", 124 | "version": "3.6.3" 125 | }, 126 | "toc": { 127 | "nav_menu": {}, 128 | "number_sections": true, 129 | "sideBar": true, 130 | "skip_h1_title": false, 131 | "toc_cell": false, 132 | "toc_position": {}, 133 | "toc_section_display": "block", 134 | "toc_window_display": false 135 | }, 136 | "varInspector": { 137 | "cols": { 138 | "lenName": 16, 139 | "lenType": 16, 140 | "lenVar": 40 141 | }, 142 | "kernels_config": { 143 | "python": { 144 | "delete_cmd_postfix": "", 145 | "delete_cmd_prefix": "del ", 146 | "library": "var_list.py", 147 | "varRefreshCmd": "print(var_dic_list())" 148 | }, 149 | "r": { 150 | "delete_cmd_postfix": ") ", 151 | "delete_cmd_prefix": "rm(", 152 | "library": "var_list.r", 153 | "varRefreshCmd": "cat(var_dic_list()) " 154 | } 155 | }, 156 | "types_to_exclude": [ 157 | "module", 158 | "function", 159 | "builtin_function_or_method", 160 | "instance", 161 | "_Feature" 162 | ], 163 | "window_display": false 164 | } 165 | }, 166 | "nbformat": 4, 167 | "nbformat_minor": 2 168 | } 169 | -------------------------------------------------------------------------------- /MachineLearning/.ipynb_checkpoints/nile_RF-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 65, 6 | "metadata": { 7 | "collapsed": false, 8 | "scrolled": true 9 | }, 10 | "outputs": [ 11 | { 12 | "data": { 13 | "image/png": "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\n", 14 | "text/plain": [ 15 | "" 16 | ] 17 | }, 18 | "metadata": {}, 19 | "output_type": "display_data" 20 | }, 21 | { 22 | "name": "stdout", 23 | "output_type": "stream", 24 | "text": [ 25 | "0.245969448342\n" 26 | ] 27 | }, 28 | { 29 | "data": { 30 | "text/plain": [ 31 | "{'bootstrap': True,\n", 32 | " 'criterion': 'mse',\n", 33 | " 'max_depth': None,\n", 34 | " 'max_features': 'auto',\n", 35 | " 'max_leaf_nodes': None,\n", 36 | " 'min_impurity_split': 1e-07,\n", 37 | " 'min_samples_leaf': 1,\n", 38 | " 'min_samples_split': 2,\n", 39 | " 'min_weight_fraction_leaf': 0.0,\n", 40 | " 'n_estimators': 100,\n", 41 | " 'n_jobs': 1,\n", 42 | " 'oob_score': True,\n", 43 | " 'random_state': 1,\n", 44 | " 'verbose': 0,\n", 45 | " 'warm_start': False}" 46 | ] 47 | }, 48 | "execution_count": 65, 49 | "metadata": {}, 50 | "output_type": "execute_result" 51 | }, 52 | { 53 | "data": { 54 | "text/plain": [ 55 | "" 56 | ] 57 | }, 58 | "metadata": {}, 59 | "output_type": "display_data" 60 | }, 61 | { 62 | "data": { 63 | "image/png": "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\n3pZN0OZFAAAAAElFTkSuQmCC\n", 64 | "text/plain": [ 65 | "" 66 | ] 67 | }, 68 | "metadata": {}, 69 | "output_type": "display_data" 70 | } 71 | ], 72 | "source": [ 73 | "%matplotlib inline\n", 74 | "import statsmodels as sm\n", 75 | "import pandas as pd\n", 76 | "import matplotlib.pyplot as plt\n", 77 | "import seaborn as sns\n", 78 | "import numpy as np\n", 79 | "from sklearn.ensemble import RandomForestRegressor\n", 80 | "\n", 81 | "def load_data():\n", 82 | " df_read = sm.datasets.nile.load_pandas().data\n", 83 | " s_date = pd.Series(\n", 84 | " [pd.to_datetime(str(int(y_str))) for y_str in df_read['year']]\n", 85 | " )\n", 86 | " df = df_read.set_index(s_date)\n", 87 | " df = df.drop('year', axis=1)\n", 88 | "\n", 89 | " return df\n", 90 | "\n", 91 | "df_nile = load_data()\n", 92 | "\n", 93 | "# Plot Time Series Data\n", 94 | "plt.figure()\n", 95 | "ax = df_nile['volume'].plot(figsize=(8,4), grid=True)\n", 96 | "ax.set_xlabel('year')\n", 97 | "ax.set_ylabel('volume x 10^8 m^3')\n", 98 | "plt.show()\n", 99 | "\n", 100 | "df_nile['lag1'] = df_nile['volume'].shift(1) \n", 101 | "df_nile['lag2'] = df_nile['volume'].shift(2)\n", 102 | "df_nile['lag3'] = df_nile['volume'].shift(3)\n", 103 | "\n", 104 | "df_nile = df_nile.dropna()\n", 105 | "\n", 106 | "x_train = df_nile[['lag1', 'lag2', 'lag3']][:67].values\n", 107 | "x_test = df_nile[['lag1', 'lag2', 'lag3']][67:].values\n", 108 | "\n", 109 | "y_train = df_nile['volume'][:67].values\n", 110 | "y_test = df_nile['volume'][67:].values\n", 111 | "\n", 112 | "# bootstrap:Bootstrapするかどうか\n", 113 | "# n_estimators:木の本数\n", 114 | "# criterion:評価関数 \n", 115 | "# max_features:説明変数の数(推奨値は分類:√n 回帰:n/3 特徴量がいっぱいあるときはもっと増やしたほうが良い) \n", 116 | "# max_leaf_nodes:最大ノード数(推奨値は分類:1 回帰5)\n", 117 | "# random_state:乱数のシード\n", 118 | "# oob_score: R^2をout of bags使って評価するかどうか\n", 119 | "rf = RandomForestRegressor(\n", 120 | " bootstrap=True,\n", 121 | " n_estimators=100,\n", 122 | " criterion='mse', \n", 123 | " max_features='auto',\n", 124 | " random_state=1,\n", 125 | " oob_score=True,\n", 126 | ")\n", 127 | "\n", 128 | "\n", 129 | "rf.fit(x_train, y_train)\n", 130 | "train_pred = rf.predict(x_train)\n", 131 | "test_pred = rf.predict(x_test)\n", 132 | "\n", 133 | "pred = np.concatenate((train_pred, test_pred))\n", 134 | "df_nile['pred'] = pred\n", 135 | "\n", 136 | "plt.figure()\n", 137 | "df_nile[['volume', 'pred']].plot()\n", 138 | "print(rf.oob_score_)\n", 139 | "\n", 140 | "# 実はテスト用のデータの特徴量に、訓練データの特徴量が時系列でスライドしてる分混じってしまっている" 141 | ] 142 | }, 143 | { 144 | "cell_type": "code", 145 | "execution_count": 63, 146 | "metadata": { 147 | "collapsed": false 148 | }, 149 | "outputs": [ 150 | { 151 | "name": "stdout", 152 | "output_type": "stream", 153 | "text": [ 154 | "RandomForestRegressor(bootstrap=True, criterion='mse', max_depth=None,\n", 155 | " max_features=3, max_leaf_nodes=None, min_impurity_split=1e-07,\n", 156 | " min_samples_leaf=1, min_samples_split=2,\n", 157 | " min_weight_fraction_leaf=0.0, n_estimators=200, n_jobs=1,\n", 158 | " oob_score=False, random_state=1, verbose=0, warm_start=False)\n" 159 | ] 160 | } 161 | ], 162 | "source": [ 163 | "# parameter tuning by grid search\n", 164 | "from sklearn.grid_search import GridSearchCV \n", 165 | "\n", 166 | "parameters = {\n", 167 | " 'n_estimators' : [10, 50, 100, 150, 200, 250, 300],\n", 168 | " 'max_features' : [1, 2, 3],\n", 169 | " 'random_state' : [1],\n", 170 | "}\n", 171 | "\n", 172 | "rf_tuned = GridSearchCV(RandomForestRegressor(), parameters)\n", 173 | "rf_tuned.fit(x_train, y_train)\n", 174 | "\n", 175 | "# クロスバリデーションによって得られた最適なパラメータの表示\n", 176 | "print(rf_tuned.best_estimator_)" 177 | ] 178 | } 179 | ], 180 | "metadata": { 181 | "kernelspec": { 182 | "display_name": "Python 3", 183 | "language": "python", 184 | "name": "python3" 185 | }, 186 | "language_info": { 187 | "codemirror_mode": { 188 | "name": "ipython", 189 | "version": 3 190 | }, 191 | "file_extension": ".py", 192 | "mimetype": "text/x-python", 193 | "name": "python", 194 | "nbconvert_exporter": "python", 195 | "pygments_lexer": "ipython3", 196 | "version": "3.6.0" 197 | } 198 | }, 199 | "nbformat": 4, 200 | "nbformat_minor": 2 201 | } 202 | -------------------------------------------------------------------------------- /MachineLearning/Readme.md: -------------------------------------------------------------------------------- 1 | # 「Python 機械学習プログラミング」の学習まとめレポジトリ 2 | 3 | * まとめノートのファイル名 => 'ch0x_rasbt.ipynb' 4 | * pandasの使い方を断片的にまとめたノート => 'pandas_tutorial.ipynb' 5 | * ch01,02,08,09,12,13については内容的にまとめを作っていません。 6 | 7 | ## ch03 8 | * ロジスティック回帰 9 | * SVM 10 | * ガウシアンカーネル 11 | * 決定木 12 | 13 | ## ch04 14 | * pandasを使ったデータの扱い 15 | * 正則化 16 | * 特徴量選択(ランダムフォレストのfeature_importance_) 17 | 18 | ## ch05 19 | * 主成分分析 20 | * 線形判別分析 21 | * カーネル主成分分析 22 | 23 | ## ch06 24 | * 機械学習手法のパイプライン化 25 | * クロスバリデーション 26 | * 学習曲線、検証曲線 27 | * グリッドサーチ 28 | * 分類機の性能指標 29 | 30 | ## ch07 31 | * バギング 32 | * ブースティング 33 | * アダブースト 34 | 35 | ## ch10 36 | * 特徴量間の相関性 37 | * R2スコア 38 | * 重回帰 39 | * 多項式回帰 40 | * 決定木回帰、ランダムフォレスト回帰 41 | 42 | ## ch11 43 | * k-means 44 | * 階層的クラスタリング 45 | * DBSCAN 46 | -------------------------------------------------------------------------------- /MachineLearning/ch03_rasbt.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# ロジスティック回帰\n", 8 | "名前に反して分類手法の一つであり、人気手法の一つ\n", 9 | "\n", 10 | "### 長所\n", 11 | "* 出力が0〜1の確率で表されるため、天気予報などの「どのくらいの確率で現象Aが起こるか」を知りたいタスクで便利\n", 12 | "* シンプルで解釈性にも優れる\n", 13 | "\n", 14 | "### 短所\n", 15 | "* ロジスティック回帰は与えられた訓練データから、パラメータの条件付き尤度最大化を行っているため、外れ値に影響されやすい\n", 16 | "* 他クラスの場合は一対他で比較する必要がある\n", 17 | "\n", 18 | "# サポートベクタマシン(SVM)\n", 19 | "人気手法の一つであり、ディープラーニングが出てくるまでは無双していた\n", 20 | "### 長所\n", 21 | "* 比較的実装が容易であり、軽量\n", 22 | "* データが線形分離不可能な場合(XORなど)で、非線形分離したい時に使う **カーネル法** と相性が良い\n", 23 | "* 訓練時にSVMにとって興味があるのが「サポートベクタ(決定境界付近のデータ)」のみであるので、外れ値に強い\n", 24 | "\n", 25 | "### 短所\n", 26 | "* パラメータチューニングが必要\n", 27 | "\n", 28 | "#### 補足:カーネル法について\n", 29 | "非線形な射影関数を用いて、非線形分離を行うことが可能である。\n", 30 | "$\\phi(x)$をデータ$x$の射影とすると、訓練時に解く式に登場する$x$を$\\phi(x)$で置き換えるだけで良い。\n", 31 | "しかし、SVMは最適化する際に$\\phi(x)$の内積を計算する必要があるが、陽に$\\phi(x)$を扱うと計算が大変である。\n", 32 | "よって以下のカーネル関数を代わりに計算する。\n", 33 | "$$k(x, x') = \\phi(x)^T \\phi(x')$$\n", 34 | "\n", 35 | "よく使われるカーネル関数はガウスカーネルと呼ばれる無限次元の基底を持つ射影関数である。式を下に示す。\n", 36 | "\n", 37 | "$${k(x, x') = exp(-\\frac {||x - x'||^2} {2\\sigma^2} )}$$\n", 38 | "\n", 39 | "実際には定数項をまとめて下のように簡略化される\n", 40 | "\n", 41 | "$${k(x, x') = exp(-\\gamma {||x - x'||^2} )}$$\n", 42 | "\n", 43 | "カーネルは、大雑把に言うと「2サンプル間の類似度」を表している。\n", 44 | "\n", 45 | "実際にカーネルSVMを実行してみる。" 46 | ] 47 | }, 48 | { 49 | "cell_type": "code", 50 | "execution_count": 7, 51 | "metadata": { 52 | "collapsed": false 53 | }, 54 | "outputs": [ 55 | { 56 | "data": { 57 | "image/png": "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\nSGJAERFRJP1/RY8OQIoEmtcAAAAASUVORK5CYII=\n", 58 | "text/plain": [ 59 | "" 60 | ] 61 | }, 62 | "metadata": {}, 63 | "output_type": "display_data" 64 | } 65 | ], 66 | "source": [ 67 | "import matplotlib.pyplot as plt\n", 68 | "import numpy as np\n", 69 | "from sklearn.svm import SVC\n", 70 | "\n", 71 | "plt.xlim([-3, 3])\n", 72 | "plt.ylim([-3, 3])\n", 73 | "\n", 74 | "# 'rbf' はガウスカーネルのこと。線形分離したいときは'linear'\n", 75 | "# gamma:大きいほど複雑な決定境界になる C:大きいほどハードマージン\n", 76 | "svm = SVC(kernel='rbf', random_state=0, gamma=0.10, C=10.0)\n", 77 | "\n", 78 | "svm.fit(X_xor, y_xor)\n", 79 | "plot_decision_regions(X_xor, y_xor,\n", 80 | " classifier=svm)\n", 81 | "plt.legend(loc='upper left')\n", 82 | "plt.tight_layout()\n", 83 | "plt.show()" 84 | ] 85 | }, 86 | { 87 | "cell_type": "markdown", 88 | "metadata": {}, 89 | "source": [ 90 | "## ロジスティック回帰とSVMの比較" 91 | ] 92 | }, 93 | { 94 | "cell_type": "code", 95 | "execution_count": 10, 96 | "metadata": { 97 | "collapsed": false 98 | }, 99 | "outputs": [ 100 | { 101 | "data": { 102 | "text/html": [ 103 | "
ロジスティック回帰SVM
" 104 | ], 105 | "text/plain": [ 106 | "" 107 | ] 108 | }, 109 | "metadata": {}, 110 | "output_type": "display_data" 111 | } 112 | ], 113 | "source": [ 114 | "from IPython.display import HTML, display\n", 115 | "display(HTML(\"
ロジスティック回帰SVM
\"))" 116 | ] 117 | }, 118 | { 119 | "cell_type": "markdown", 120 | "metadata": {}, 121 | "source": [ 122 | "# 決定木\n", 123 | "ジニ係数(ジニ不純度):データの混ざり具合\n", 124 | "\n", 125 | "### 長所\n", 126 | "* 特徴量のスケーリングが必要ない\n", 127 | "* モデルの解釈が容易(どの特徴量がどのように影響を及ぼしているか分かりやすい)\n", 128 | "\n", 129 | "### 短所\n", 130 | "* 過学習しやすい。(しかし、低バイアス高バリアンスの性質を活かしたアンサンブル学習器の「ランダムフォレスト」がとても強力)" 131 | ] 132 | }, 133 | { 134 | "cell_type": "markdown", 135 | "metadata": {}, 136 | "source": [ 137 | "---\n", 138 | "### その他コード" 139 | ] 140 | }, 141 | { 142 | "cell_type": "code", 143 | "execution_count": 4, 144 | "metadata": { 145 | "collapsed": true 146 | }, 147 | "outputs": [], 148 | "source": [ 149 | "from matplotlib.colors import ListedColormap\n", 150 | "import matplotlib.pyplot as plt\n", 151 | "import warnings\n", 152 | "\n", 153 | "\n", 154 | "def versiontuple(v):\n", 155 | " return tuple(map(int, (v.split(\".\"))))\n", 156 | "\n", 157 | "\n", 158 | "def plot_decision_regions(X, y, classifier, test_idx=None, resolution=0.02):\n", 159 | "\n", 160 | " # setup marker generator and color map\n", 161 | " markers = ('s', 'x', 'o', '^', 'v')\n", 162 | " colors = ('red', 'blue', 'lightgreen', 'gray', 'cyan')\n", 163 | " cmap = ListedColormap(colors[:len(np.unique(y))])\n", 164 | "\n", 165 | " # plot the decision surface\n", 166 | " x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1\n", 167 | " x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1\n", 168 | " xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution),\n", 169 | " np.arange(x2_min, x2_max, resolution))\n", 170 | " Z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T)\n", 171 | " Z = Z.reshape(xx1.shape)\n", 172 | " plt.contourf(xx1, xx2, Z, alpha=0.4, cmap=cmap)\n", 173 | " plt.xlim(xx1.min(), xx1.max())\n", 174 | " plt.ylim(xx2.min(), xx2.max())\n", 175 | "\n", 176 | " for idx, cl in enumerate(np.unique(y)):\n", 177 | " plt.scatter(x=X[y == cl, 0], y=X[y == cl, 1],\n", 178 | " alpha=0.8, c=cmap(idx),\n", 179 | " marker=markers[idx], label=cl)\n", 180 | "\n", 181 | " # highlight test samples\n", 182 | " if test_idx:\n", 183 | " # plot all samples\n", 184 | " if not versiontuple(np.__version__) >= versiontuple('1.9.0'):\n", 185 | " X_test, y_test = X[list(test_idx), :], y[list(test_idx)]\n", 186 | " warnings.warn('Please update to NumPy 1.9.0 or newer')\n", 187 | " else:\n", 188 | " X_test, y_test = X[test_idx, :], y[test_idx]\n", 189 | "\n", 190 | " plt.scatter(X_test[:, 0],\n", 191 | " X_test[:, 1],\n", 192 | " c='',\n", 193 | " alpha=1.0,\n", 194 | " linewidths=1,\n", 195 | " marker='o',\n", 196 | " s=55, label='test set')" 197 | ] 198 | }, 199 | { 200 | "cell_type": "code", 201 | "execution_count": 6, 202 | "metadata": { 203 | "collapsed": false 204 | }, 205 | "outputs": [ 206 | { 207 | "data": { 208 | "text/plain": [ 209 | "" 210 | ] 211 | }, 212 | "execution_count": 6, 213 | "metadata": {}, 214 | "output_type": "execute_result" 215 | } 216 | ], 217 | "source": [ 218 | "np.random.seed(0)\n", 219 | "X_xor = np.random.randn(200, 2)\n", 220 | "y_xor = np.logical_xor(X_xor[:, 0] > 0,\n", 221 | " X_xor[:, 1] > 0)\n", 222 | "y_xor = np.where(y_xor, 1, -1)\n", 223 | "\n", 224 | "plt.scatter(X_xor[y_xor == 1, 0],\n", 225 | " X_xor[y_xor == 1, 1],\n", 226 | " c='b', marker='x',\n", 227 | " label='1')\n", 228 | "plt.scatter(X_xor[y_xor == -1, 0],\n", 229 | " X_xor[y_xor == -1, 1],\n", 230 | " c='r',\n", 231 | " marker='s',\n", 232 | " label='-1')\n" 233 | ] 234 | } 235 | ], 236 | "metadata": { 237 | "kernelspec": { 238 | "display_name": "Python 3", 239 | "language": "python", 240 | "name": "python3" 241 | }, 242 | "language_info": { 243 | "codemirror_mode": { 244 | "name": "ipython", 245 | "version": 3 246 | }, 247 | "file_extension": ".py", 248 | "mimetype": "text/x-python", 249 | "name": "python", 250 | "nbconvert_exporter": "python", 251 | "pygments_lexer": "ipython3", 252 | "version": "3.6.0" 253 | } 254 | }, 255 | "nbformat": 4, 256 | "nbformat_minor": 2 257 | } 258 | -------------------------------------------------------------------------------- /MachineLearning/images/03_05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyakaap/notebooks/c339731f0eb26342250688f0d7f1486f7f1f6951/MachineLearning/images/03_05.png -------------------------------------------------------------------------------- /MachineLearning/images/03_09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyakaap/notebooks/c339731f0eb26342250688f0d7f1486f7f1f6951/MachineLearning/images/03_09.png -------------------------------------------------------------------------------- /MachineLearning/images/03_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyakaap/notebooks/c339731f0eb26342250688f0d7f1486f7f1f6951/MachineLearning/images/03_11.png -------------------------------------------------------------------------------- /MachineLearning/images/04_15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyakaap/notebooks/c339731f0eb26342250688f0d7f1486f7f1f6951/MachineLearning/images/04_15.png -------------------------------------------------------------------------------- /MachineLearning/images/06_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyakaap/notebooks/c339731f0eb26342250688f0d7f1486f7f1f6951/MachineLearning/images/06_01.png -------------------------------------------------------------------------------- /MachineLearning/images/06_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyakaap/notebooks/c339731f0eb26342250688f0d7f1486f7f1f6951/MachineLearning/images/06_02.png -------------------------------------------------------------------------------- /MachineLearning/images/06_03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyakaap/notebooks/c339731f0eb26342250688f0d7f1486f7f1f6951/MachineLearning/images/06_03.png -------------------------------------------------------------------------------- /MachineLearning/images/06_04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyakaap/notebooks/c339731f0eb26342250688f0d7f1486f7f1f6951/MachineLearning/images/06_04.png -------------------------------------------------------------------------------- /MachineLearning/images/06_05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyakaap/notebooks/c339731f0eb26342250688f0d7f1486f7f1f6951/MachineLearning/images/06_05.png -------------------------------------------------------------------------------- /MachineLearning/images/06_06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyakaap/notebooks/c339731f0eb26342250688f0d7f1486f7f1f6951/MachineLearning/images/06_06.png -------------------------------------------------------------------------------- /MachineLearning/images/06_07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyakaap/notebooks/c339731f0eb26342250688f0d7f1486f7f1f6951/MachineLearning/images/06_07.png -------------------------------------------------------------------------------- /MachineLearning/images/06_08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyakaap/notebooks/c339731f0eb26342250688f0d7f1486f7f1f6951/MachineLearning/images/06_08.png -------------------------------------------------------------------------------- /MachineLearning/images/06_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyakaap/notebooks/c339731f0eb26342250688f0d7f1486f7f1f6951/MachineLearning/images/06_10.png -------------------------------------------------------------------------------- /MachineLearning/images/07_06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyakaap/notebooks/c339731f0eb26342250688f0d7f1486f7f1f6951/MachineLearning/images/07_06.png -------------------------------------------------------------------------------- /MachineLearning/images/07_07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyakaap/notebooks/c339731f0eb26342250688f0d7f1486f7f1f6951/MachineLearning/images/07_07.png -------------------------------------------------------------------------------- /MachineLearning/images/07_08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyakaap/notebooks/c339731f0eb26342250688f0d7f1486f7f1f6951/MachineLearning/images/07_08.png -------------------------------------------------------------------------------- /MachineLearning/images/07_09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyakaap/notebooks/c339731f0eb26342250688f0d7f1486f7f1f6951/MachineLearning/images/07_09.png -------------------------------------------------------------------------------- /MachineLearning/images/07_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyakaap/notebooks/c339731f0eb26342250688f0d7f1486f7f1f6951/MachineLearning/images/07_10.png -------------------------------------------------------------------------------- /MachineLearning/images/07_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyakaap/notebooks/c339731f0eb26342250688f0d7f1486f7f1f6951/MachineLearning/images/07_11.png -------------------------------------------------------------------------------- /MachineLearning/images/11_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyakaap/notebooks/c339731f0eb26342250688f0d7f1486f7f1f6951/MachineLearning/images/11_11.png -------------------------------------------------------------------------------- /hikkoshi/dow_embedding.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyakaap/notebooks/c339731f0eb26342250688f0d7f1486f7f1f6951/hikkoshi/dow_embedding.png -------------------------------------------------------------------------------- /hikkoshi/month_embedding.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyakaap/notebooks/c339731f0eb26342250688f0d7f1486f7f1f6951/hikkoshi/month_embedding.png -------------------------------------------------------------------------------- /hikkoshi/subspace_method_example.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 19, 6 | "metadata": { 7 | "collapsed": true 8 | }, 9 | "outputs": [], 10 | "source": [ 11 | "import numpy as np\n", 12 | "from sklearn.decomposition import PCA\n", 13 | "from sklearn.base import BaseEstimator\n", 14 | "\n", 15 | "class SM(BaseEstimator):\n", 16 | " \"\"\"Subspace Method (SM)\n", 17 | " Classification method using Subspace.\n", 18 | " \n", 19 | " Parameters\n", 20 | " ----------\n", 21 | " n_dimension : int\n", 22 | " Number of dimension of subspace.\n", 23 | " Attributes\n", 24 | " ----------\n", 25 | " subspaces_ : array, shape (n_classes, n_features, n_features)\n", 26 | " Subspace of N classes.\n", 27 | " \n", 28 | " classes_ : array, shape (n_classes,)\n", 29 | " Unique labels of Classes.\n", 30 | " \"\"\"\n", 31 | " \n", 32 | " def __init__(self, n_dimension):\n", 33 | " self.n_dimension = n_dimension\n", 34 | " \n", 35 | " def fit(self, X, y):\n", 36 | " \"\"\"Fit the model with X.\n", 37 | " X should be normalized because this method uses PCA.\n", 38 | " \n", 39 | " Parameters\n", 40 | " ----------\n", 41 | " X : array-like, shape (n_samples, n_features)\n", 42 | " Training data, where n_samples in the number of samples\n", 43 | " and n_features is the number of features.\n", 44 | " y : array_like, shape (n_samples,)\n", 45 | " Label data, where n_samples in the number of samples\n", 46 | " Returns\n", 47 | " -------\n", 48 | " self : object\n", 49 | " Returns the instance itself.\n", 50 | " \"\"\"\n", 51 | " self.classes_ = np.unique(y)\n", 52 | " self.subspaces_ = []\n", 53 | " for class_name in self.classes_:\n", 54 | " idx = np.argwhere(y == class_name).squeeze()\n", 55 | " X_class_i = X[idx, :]\n", 56 | "\n", 57 | " pca = PCA(n_components=self.n_dimension)\n", 58 | " pca.fit(X_class_i)\n", 59 | "\n", 60 | " # define projection matrix (equal to subspace)\n", 61 | " P = pca.components_.T @ pca.components_\n", 62 | " self.subspaces_.append(P)\n", 63 | " \n", 64 | " self.subspaces_ = np.array(self.subspaces_)\n", 65 | " \n", 66 | " return self\n", 67 | "\n", 68 | " def predict(self, X):\n", 69 | " \"\"\"\n", 70 | " Perform classification on samples in X.\n", 71 | " Parameters\n", 72 | " ----------\n", 73 | " X : array-like, shape (n_samples, n_features)\n", 74 | " Returns\n", 75 | " -------\n", 76 | " y_pred : array, shape (n_samples,)\n", 77 | " Class labels for samples in X.\n", 78 | " \"\"\"\n", 79 | "\n", 80 | " #======#\n", 81 | "# n, d = X.shape\n", 82 | "# preds = []\n", 83 | "# for x in X:\n", 84 | "# similarities = []\n", 85 | "# for P in self.subspaces_:\n", 86 | "# similarities.append(x.T @ P @ x)\n", 87 | "# preds.append(np.argmax(similarities))\n", 88 | "# return self.classes_[preds]\n", 89 | "\n", 90 | " #======#\n", 91 | " # n: n_samples, d: n_features\n", 92 | " n, d = X.shape\n", 93 | "\n", 94 | " similarities = X.reshape((n, 1, 1, d)) @ \\\n", 95 | " np.expand_dims(self.subspaces_, axis=0) @ \\\n", 96 | " X.reshape((n, 1, d, 1))\n", 97 | " similarities = similarities.squeeze()\n", 98 | " \n", 99 | " return self.classes_[np.argmax(similarities, axis=1)]\n", 100 | " \n", 101 | " def score(self, X, y):\n", 102 | " return np.mean(self.predict(X) == y)\n", 103 | "\n", 104 | " def get_params(self, deep=True):\n", 105 | " return {'n_dimension': self.n_dimension}\n", 106 | "\n", 107 | " def set_params(self, **parameters):\n", 108 | " for parameter, value in parameters.items():\n", 109 | " setattr(self,parameter, value)\n", 110 | " return self" 111 | ] 112 | }, 113 | { 114 | "cell_type": "markdown", 115 | "metadata": {}, 116 | "source": [ 117 | "# Prepare the data" 118 | ] 119 | }, 120 | { 121 | "cell_type": "code", 122 | "execution_count": 3, 123 | "metadata": { 124 | "collapsed": false 125 | }, 126 | "outputs": [], 127 | "source": [ 128 | "import numpy as np\n", 129 | "from sklearn.datasets import load_digits\n", 130 | "from sklearn.model_selection import train_test_split\n", 131 | "\n", 132 | "digits_data = load_digits()\n", 133 | "x = digits_data.data\n", 134 | "y = digits_data.target\n", 135 | "\n", 136 | "x -= np.mean(x, axis=0)\n", 137 | "\n", 138 | "X_train, X_test, y_train, y_test = train_test_split(\n", 139 | " x, y, test_size=0.33, random_state=42)" 140 | ] 141 | }, 142 | { 143 | "cell_type": "code", 144 | "execution_count": 4, 145 | "metadata": { 146 | "collapsed": false 147 | }, 148 | "outputs": [ 149 | { 150 | "name": "stdout", 151 | "output_type": "stream", 152 | "text": [ 153 | "(1203, 64) (1203,)\n", 154 | "(594, 64) (594,)\n" 155 | ] 156 | } 157 | ], 158 | "source": [ 159 | "print(X_train.shape, y_train.shape)\n", 160 | "print(X_test.shape, y_test.shape)" 161 | ] 162 | }, 163 | { 164 | "cell_type": "markdown", 165 | "metadata": {}, 166 | "source": [ 167 | "# Training & Inference" 168 | ] 169 | }, 170 | { 171 | "cell_type": "code", 172 | "execution_count": 20, 173 | "metadata": { 174 | "collapsed": false, 175 | "scrolled": true 176 | }, 177 | "outputs": [ 178 | { 179 | "data": { 180 | "text/plain": [ 181 | "0.80808080808080807" 182 | ] 183 | }, 184 | "execution_count": 20, 185 | "metadata": {}, 186 | "output_type": "execute_result" 187 | } 188 | ], 189 | "source": [ 190 | "sm = SM(n_dimension=10)\n", 191 | "sm.fit(X_train, y_train)\n", 192 | "y_pred = sm.predict(X_test)\n", 193 | "sm.score(X_test, y_test)" 194 | ] 195 | }, 196 | { 197 | "cell_type": "markdown", 198 | "metadata": {}, 199 | "source": [ 200 | "# Grid Search" 201 | ] 202 | }, 203 | { 204 | "cell_type": "code", 205 | "execution_count": 91, 206 | "metadata": { 207 | "collapsed": false 208 | }, 209 | "outputs": [ 210 | { 211 | "data": { 212 | "text/plain": [ 213 | "{'n_dimension': 12}" 214 | ] 215 | }, 216 | "execution_count": 91, 217 | "metadata": {}, 218 | "output_type": "execute_result" 219 | } 220 | ], 221 | "source": [ 222 | "from sklearn.model_selection import GridSearchCV\n", 223 | "\n", 224 | "parameters = {'n_dimension': [i for i in range(X_train.shape[1])]}\n", 225 | "gs = GridSearchCV(sm, parameters, cv=5)\n", 226 | "gs.fit(X_train, y_train)\n", 227 | "\n", 228 | "gs.best_params_" 229 | ] 230 | }, 231 | { 232 | "cell_type": "code", 233 | "execution_count": 26, 234 | "metadata": { 235 | "collapsed": false 236 | }, 237 | "outputs": [ 238 | { 239 | "data": { 240 | "text/plain": [ 241 | "0.8232323232323232" 242 | ] 243 | }, 244 | "execution_count": 26, 245 | "metadata": {}, 246 | "output_type": "execute_result" 247 | } 248 | ], 249 | "source": [ 250 | "sm = SM(**gs.best_params_)\n", 251 | "sm.fit(X_train, y_train)\n", 252 | "y_pred = sm.predict(X_test)\n", 253 | "sm.score(X_test, y_test)" 254 | ] 255 | }, 256 | { 257 | "cell_type": "markdown", 258 | "metadata": {}, 259 | "source": [ 260 | "# Validation Curve" 261 | ] 262 | }, 263 | { 264 | "cell_type": "code", 265 | "execution_count": 89, 266 | "metadata": { 267 | "collapsed": false, 268 | "scrolled": true 269 | }, 270 | "outputs": [ 271 | { 272 | "data": { 273 | "image/png": "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\nrkJggg==\n", 274 | "text/plain": [ 275 | "" 276 | ] 277 | }, 278 | "metadata": {}, 279 | "output_type": "display_data" 280 | } 281 | ], 282 | "source": [ 283 | "%matplotlib inline\n", 284 | "from matplotlib import pyplot as plt\n", 285 | "import seaborn as sns\n", 286 | "from sklearn.learning_curve import validation_curve\n", 287 | "\n", 288 | "param_range = gs.get_params()['param_grid']['n_dimension']\n", 289 | "\n", 290 | "test_mean = [gs.grid_scores_[i][1] for i in range(len(gs.get_params()['param_grid']['n_dimension']))]\n", 291 | "test_std = np.std(\n", 292 | " [gs.grid_scores_[i][2] for i in range(len(gs.get_params()['param_grid']['n_dimension']))], \n", 293 | " axis=1)\n", 294 | "\n", 295 | "plt.plot(param_range, test_mean, \n", 296 | " color='blue', linestyle='--', \n", 297 | " label='validation accuracy')\n", 298 | "\n", 299 | "plt.fill_between(param_range, \n", 300 | " test_mean + test_std,\n", 301 | " test_mean - test_std, \n", 302 | " alpha=0.15, color='blue')\n", 303 | "\n", 304 | "plt.legend(loc='best')\n", 305 | "plt.xlabel('Subspace Dimension')\n", 306 | "plt.ylabel('Accuracy')\n", 307 | "plt.tight_layout()\n", 308 | "# plt.savefig('./figures/validation_curve.png', dpi=300)\n", 309 | "plt.show()" 310 | ] 311 | }, 312 | { 313 | "cell_type": "code", 314 | "execution_count": 21, 315 | "metadata": { 316 | "collapsed": true 317 | }, 318 | "outputs": [], 319 | "source": [ 320 | "import numpy as np\n", 321 | "from sklearn.decomposition import KernelPCA\n", 322 | "from sklearn.base import BaseEstimator\n", 323 | "\n", 324 | "class KSM(BaseEstimator):\n", 325 | " \"\"\"Subspace Method (SM)\n", 326 | " Classification method using Subspace.\n", 327 | " \n", 328 | " Parameters\n", 329 | " ----------\n", 330 | " n_dimension : int\n", 331 | " Number of dimension of subspace.\n", 332 | " Attributes\n", 333 | " ----------\n", 334 | " subspaces_ : array, shape (n_classes, n_features, n_features)\n", 335 | " Subspace of N classes.\n", 336 | " \n", 337 | " classes_ : array, shape (n_classes,)\n", 338 | " Unique labels of Classes.\n", 339 | " \"\"\"\n", 340 | " \n", 341 | " def __init__(self, n_dimension, gamma):\n", 342 | " self.n_dimension = n_dimension\n", 343 | " self.gamma = gamma\n", 344 | " \n", 345 | " def fit(self, X, y):\n", 346 | " \"\"\"Fit the model with X.\n", 347 | " X should be normalized because this method uses PCA.\n", 348 | " \n", 349 | " Parameters\n", 350 | " ----------\n", 351 | " X : array-like, shape (n_samples, n_features)\n", 352 | " Training data, where n_samples in the number of samples\n", 353 | " and n_features is the number of features.\n", 354 | " y : array_like, shape (n_samples,)\n", 355 | " Label data, where n_samples in the number of samples\n", 356 | " Returns\n", 357 | " -------\n", 358 | " self : object\n", 359 | " Returns the instance itself.\n", 360 | " \"\"\"\n", 361 | " self.classes_ = np.unique(y)\n", 362 | " self.subspaces_ = []\n", 363 | " for class_name in self.classes_:\n", 364 | " idx = np.argwhere(y == class_name).squeeze()\n", 365 | " X_class_i = X[idx, :]\n", 366 | "\n", 367 | " pca = KernelPCA(n_components=self.n_dimension, kernel='rbf', gamma=self.gamma)\n", 368 | " pca.fit(X_class_i.T)\n", 369 | "\n", 370 | " # define projection matrix (equal to subspace)\n", 371 | " P = pca.alphas_ @ pca.alphas_.T\n", 372 | " self.subspaces_.append(P)\n", 373 | " \n", 374 | " self.subspaces_ = np.array(self.subspaces_)\n", 375 | " \n", 376 | " return self\n", 377 | "\n", 378 | " def predict(self, X):\n", 379 | " \"\"\"\n", 380 | " Perform classification on samples in X.\n", 381 | " Parameters\n", 382 | " ----------\n", 383 | " X : array-like, shape (n_samples, n_features)\n", 384 | " Returns\n", 385 | " -------\n", 386 | " y_pred : array, shape (n_samples,)\n", 387 | " Class labels for samples in X.\n", 388 | " \"\"\"\n", 389 | "\n", 390 | " #======#\n", 391 | "# n, d = X.shape\n", 392 | "# preds = []\n", 393 | "# for x in X:\n", 394 | "# similarities = []\n", 395 | "# for P in self.subspaces_:\n", 396 | "# similarities.append(x.T @ P @ x)\n", 397 | "# preds.append(np.argmax(similarities))\n", 398 | "# return self.classes_[preds]\n", 399 | "\n", 400 | " #======#\n", 401 | " # n: n_samples, d: n_features\n", 402 | " n, d = X.shape\n", 403 | "\n", 404 | " similarities = X.reshape((n, 1, 1, d)) @ \\\n", 405 | " np.expand_dims(self.subspaces_, axis=0) @ \\\n", 406 | " X.reshape((n, 1, d, 1))\n", 407 | " similarities = similarities.squeeze()\n", 408 | " \n", 409 | " return self.classes_[np.argmax(similarities, axis=1)]\n", 410 | " \n", 411 | " def score(self, X, y):\n", 412 | " return np.mean(self.predict(X) == y)\n", 413 | "\n", 414 | " def get_params(self, deep=True):\n", 415 | " return {'n_dimension': self.n_dimension}\n", 416 | "\n", 417 | " def set_params(self, **parameters):\n", 418 | " for parameter, value in parameters.items():\n", 419 | " setattr(self,parameter, value)\n", 420 | " return self" 421 | ] 422 | }, 423 | { 424 | "cell_type": "code", 425 | "execution_count": 33, 426 | "metadata": { 427 | "collapsed": false 428 | }, 429 | "outputs": [ 430 | { 431 | "data": { 432 | "text/plain": [ 433 | "0.97138047138047134" 434 | ] 435 | }, 436 | "execution_count": 33, 437 | "metadata": {}, 438 | "output_type": "execute_result" 439 | } 440 | ], 441 | "source": [ 442 | "sm = KSM(n_dimension=10, gamma=1e-4)\n", 443 | "sm.fit(X_train, y_train)\n", 444 | "y_pred = sm.predict(X_test)\n", 445 | "sm.score(X_test, y_test)" 446 | ] 447 | }, 448 | { 449 | "cell_type": "code", 450 | "execution_count": null, 451 | "metadata": { 452 | "collapsed": true 453 | }, 454 | "outputs": [], 455 | "source": [] 456 | } 457 | ], 458 | "metadata": { 459 | "kernelspec": { 460 | "display_name": "Python 3", 461 | "language": "python", 462 | "name": "python3" 463 | }, 464 | "language_info": { 465 | "codemirror_mode": { 466 | "name": "ipython", 467 | "version": 3 468 | }, 469 | "file_extension": ".py", 470 | "mimetype": "text/x-python", 471 | "name": "python", 472 | "nbconvert_exporter": "python", 473 | "pygments_lexer": "ipython3", 474 | "version": "3.6.0" 475 | } 476 | }, 477 | "nbformat": 4, 478 | "nbformat_minor": 2 479 | } 480 | -------------------------------------------------------------------------------- /輪講/353.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyakaap/notebooks/c339731f0eb26342250688f0d7f1486f7f1f6951/輪講/353.png -------------------------------------------------------------------------------- /輪講/356.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyakaap/notebooks/c339731f0eb26342250688f0d7f1486f7f1f6951/輪講/356.png -------------------------------------------------------------------------------- /輪講/366.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyakaap/notebooks/c339731f0eb26342250688f0d7f1486f7f1f6951/輪講/366.png -------------------------------------------------------------------------------- /輪講/alg35.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyakaap/notebooks/c339731f0eb26342250688f0d7f1486f7f1f6951/輪講/alg35.png -------------------------------------------------------------------------------- /輪講/alg36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyakaap/notebooks/c339731f0eb26342250688f0d7f1486f7f1f6951/輪講/alg36.png -------------------------------------------------------------------------------- /輪講/ep.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyakaap/notebooks/c339731f0eb26342250688f0d7f1486f7f1f6951/輪講/ep.pdf -------------------------------------------------------------------------------- /輪講/ep.py: -------------------------------------------------------------------------------- 1 | import pandas as pd 2 | import numpy as np 3 | import numpy.linalg as la 4 | 5 | class EP: 6 | 7 | def __init__(self, n): 8 | self.sigma_tilde = np.ones((n, 1)) * 0.0003 9 | self.tau_tilde = 1.0 / self.sigma_tilde 10 | self.S_tilde = np.diag(self.tau_tilde.reshape(-1)) 11 | self.mu_tilde = np.ones((n, 1)) 12 | self.nu_tilde = self.S_tilde @ self.mu_tilde 13 | 14 | def fit(self, K, y, n_iter=5): 15 | Sigma = K 16 | mu = np.zeros((len(K), 1)) 17 | for j in range(n_iter): 18 | for i in range(len(K)): 19 | 20 | # eq. (3.56) 21 | tau_cavity = 1.0 / Sigma[i, i] - self.tau_tilde[i, 0] 22 | nu_cavity = mu[i, 0] / Sigma[i, i] - self.nu_tilde[i, 0] 23 | mu_cavity = nu_cavity / tau_cavity 24 | sigma_cavity = 1.0 / tau_cavity 25 | 26 | # eq. (3.58) 27 | zi = y[i, 0] * mu_cavity / np.sqrt(1.0 + sigma_cavity) 28 | Zi_hat = 1.0 / (1.0 + np.exp(-zi)) 29 | nd = np.exp(- 0.5 * zi**2) / np.sqrt(2.0 * np.pi) 30 | mu_hat = mu_cavity + (y[i, 0] * sigma_cavity * nd) / (Zi_hat * np.sqrt(1.0 + sigma_cavity)) 31 | sigma_hat = sigma_cavity - sigma_cavity**2 * nd * (zi + nd / Zi_hat) / (1.0 + sigma_cavity) / Zi_hat 32 | 33 | # eq. (3.59) 34 | delta_tau = 1.0 / sigma_hat - tau_cavity - self.tau_tilde[i, 0] 35 | self.tau_tilde[i, 0] = self.tau_tilde[i, 0] + delta_tau 36 | self.nu_tilde[i, 0] = 1.0 / sigma_hat * mu_hat - nu_cavity 37 | 38 | # eq. (3.53), (3.70) 39 | si = Sigma[:, i] 40 | Sigma = Sigma - (1.0 / (1.0 / delta_tau + Sigma[i, i])) * si @ si.T 41 | mu = Sigma @ self.nu_tilde 42 | 43 | # eq. (3.53), (3.68) 44 | S_root = self.S_tilde**0.5 45 | L = la.cholesky(np.eye(len(K)) + S_root @ K @ S_root) 46 | V = la.solve(L.T, S_root) @ K 47 | Sigma = K - V.T @ V 48 | mu = Sigma @ self.nu_tilde 49 | 50 | return(self.nu_tilde, self.tau_tilde) 51 | 52 | def predict(self, X, K, y, k, x_test): 53 | S_root = self.S_tilde**0.5 54 | L = la.cholesky(np.eye(len(K)) + S_root @ K @ S_root) 55 | 56 | # eq. (3.60) 57 | z = S_root @ (la.solve(L.T, (la.solve(L, S_root @ K @ self.nu_tilde)))) 58 | kx = np.array([k(X[:, i], x_test) for i in range(X.shape[1])]).reshape(-1, 1) 59 | f_bar_test = kx.T @ (self.nu_tilde - z) 60 | 61 | # eq. (3.61) 62 | v = la.solve(L, S_root @ kx) 63 | var_f_test = k(x_test, x_test) - v.T @ v 64 | 65 | # eq. (3.63) 66 | pi_bar_test = 1.0 / (1.0 + np.exp(-(f_bar_test / np.sqrt(1 + var_f_test)))) 67 | 68 | return pi_bar_test 69 | 70 | ## classification by using EP 71 | 72 | # The squared exponential covariance function k(x, x') 73 | sigmaf2 = 2500.0 74 | l2 = 8.0 75 | k = lambda x, x_dash: sigmaf2 * np.exp(-0.5 * (la.norm(x - x_dash))**2 / l2) 76 | 77 | # iris dataset(only 2 class) 78 | from sklearn.datasets import load_iris 79 | iris = load_iris() 80 | df = pd.DataFrame(iris.data, columns=iris.feature_names) 81 | 82 | y = np.array(iris.target[iris.target != 2]) 83 | y[y == 0] = -1 84 | y = y.reshape(-1, 1) 85 | n = y.shape[0] 86 | x = df.ix[:n - 1, [0, 2]] 87 | K = np.array([[k(x.ix[i], x.ix[j]) for i in range(n)] for j in range(n)]) 88 | 89 | ep = EP(n=n) 90 | ep.fit(K=K, y=y) 91 | pred = ep.predict(X=x.T.values, K=K, y=y, k=k, x_test=x.ix[0].reshape(-1, 1)) 92 | print(pred) --------------------------------------------------------------------------------