機械学習レポート



# 機械学習



### 機械学習
トム・ミッチェル(1997)は、「コンピュータプログラムは、タスクTを性能指標Pで測定し、その性能が経験Eにより改善される場合、タスクTおよび性能指標Pに関して経験Eから学習すると言われている。」と機械学習について定義した。[^1]ここで、タスクTとは分類や回帰、機械翻訳などであり、性能指標Pとはモデルの精度や翻訳タスクにおけるBLEU値などのことである。また機械学習アルゴリズムは、学習過程においてどのような経験を獲得できるかによって、大きく教師なし(unsupervised)と教師あり(supervised)に分類できる。[^1]

## 第一章 線形回帰モデル
### 講義
#### 回帰モデル
ある入力(離散値あるいは連続値のスカラーまたはベクトル)から連続値のスカラーを出力するモデル。

この時の入力を説明変数または特徴ベクトルといい、出力を目的変数という。

- 説明変数 $\boldsymbol{x}=(x_1,x_2,\cdots,x_m)^T\in \mathbb{R}^m$
- 目的変数 $y\in \mathbb{R}^1$

#### 線形回帰モデル
入力とm次元パラメータの線形結合を出力するモデル

教師あり学習である。

- パラメータ $\boldsymbol{w}=(w_1,w_2,\cdots,w_m)^T\in \mathbb{R}^m$
- 線形結合 $\boldsymbol{w}^T\boldsymbol{x} + w_0 = \sum_{j=1}^{m}w_jx_j+w_0$

線形回帰モデルのパラメータは最小二乗法で推定する。
- 最小二乗法 $MSE_{train}=\frac{1}{n_{train}}\sum_{i=1}^{n_train}(\hat y_i^{(train)}-y_i^{(train)})^2$

$\frac{\partial}{\partial \boldsymbol{w}}MSE_{train}=0$を解くことで
$\hat w={\rm argmin} MSE_{train}$
を求める。

- 回帰係数 $\hat{\boldsymbol{w}}=(X^{(train)T}X^{(train)})^{-1}X^{(train)T}\boldsymbol{y}^{(train)}$
- 予測値 $\hat{\boldsymbol{y}}=X^{(input)}(X^{(train)T}X^{(train)})^{-1}X^{(train)T}\boldsymbol{y}^{(train)}$

### ハンズオン
ボストン住宅データセットを線形回帰モデルで分析する。

データを読み込み、pandasのdataframeで表示する。
![スクリーンショット 2020-11-27 11.43.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/50759156-ef42-1cff-42bb-9ab958297586.png)
scikit-learnとの比較用にnumpyで実装する
![スクリーンショット 2020-11-27 11.43.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/d5e92bde-9c55-e44e-3bf5-48a1a8a2ced9.png)
RM(部屋数)を特徴変数、PRICE(価格)を目的変数とする。
scikit-learnとnumpyでの結果を比較する。
![スクリーンショット 2020-11-27 11.46.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/2ccf149e-ca2f-dce0-ed5e-47fa0b22a09a.png)
ただし、このモデルでは部屋数が1の部屋の価格をマイナスにしてしまった。
![スクリーンショット 2020-11-27 11.49.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/ee3f2c9b-ae79-2711-c555-1443ce99112c.png)
次にCRIM(犯罪率)とRM(部屋数)を特徴変数、PRICE(価格)を目的変数とする。
![スクリーンショット 2020-11-27 11.51.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/3d9ce24b-2141-2d32-2283-c127a6d95dff.png)
しかし、これでもおかしな結果が出てしまった。
![スクリーンショット 2020-11-27 11.53.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/73a8660a-60c7-d8f1-c8a0-d0fbbafb7cb4.png)
回帰係数と切片の値を確認する。
![スクリーンショット 2020-11-27 11.59.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/a5fca696-ecef-f4c2-19f7-0298d85c8f3c.png)
精度を求めるため、学習データと検証データに分割し、モデルを学習させ、学習データと検証データそれぞれで予測する。
![スクリーンショット 2020-11-27 12.00.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/53a888ae-2016-98a1-0121-4c082c87c93a.png)
モデルが求めた結果と正解の差をプロットする。0の線から遠いほど正解からずれている。
![スクリーンショット 2020-11-27 12.04.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/f26e7920-4f86-db75-b56f-b446d79b7c34.png)
平均2乗誤差、R^2を計算する。
![スクリーンショット 2020-11-27 11.54.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/40f55c3b-914a-fe76-c981-e8f2b0de6006.png)




## 第二章 非線形回帰モデル
### 講義
#### 非線形回帰モデル
複雑な非線形構造を非線形関数により表現するモデル
- 基底展開法
線形回帰モデルと基本は同じだが、入力を基底関数と呼ばれる既知の非線形関数で変換しておく。
未知パラメータは線形回帰モデルと同様に最小2乗法や最尤法により推定できる。

- パラメータ $\boldsymbol{w}=(w_1,w_2,\cdots,w_m)^T\in \mathbb{R}^m$
- 線形結合 $y_i = \sum_{j=1}^{m}w_j\phi_j(x_i)+w_0+\epsilon_i$
$\phi()_j$には多項式関数やガウス型基底関数、スプライン関数が用いられる。

- 説明変数  $\boldsymbol{x}\_{i} = (x\_{i1}, x\_{i2}, \cdots, x_{im}) \in \mathbb{R}^{m}$

- 非線形関数ベクトル$\boldsymbol{\phi}(\boldsymbol{x_i}) = (\phi_{1}(\boldsymbol{x}\_{i}), \phi_{2}(\boldsymbol{x}\_{i}), \cdots, \phi_{k}(\boldsymbol{x}_{i}))^{T} \in \mathbb{R}^k$

- 非線形関数の計画行列 $\Phi^{(train)} = (\phi(x_{1}), \phi(x_{2}), \cdots , \phi(x_{n})) \in \mathbb{R}^{n \times k}$

- 最尤法による予測値 $\hat{y} = \Phi(\Phi^{(train)T}\Phi^{(train)})^{-1}\Phi^{(train)T} \boldsymbol{y}^{(train)}$


#### 未学習(underfitting)と過学習(overfitting)
- 未学習
学習データに対して、十分小さな誤差が得られないモデル
- 過学習
小さな誤差は得られたけど、テスト集合誤差との差が大きいモデル
#### 正則化
モデルが複雑になると過学習になってしまう
->「モデルの複雑さに伴って、その値が大きくなる正則化項(罰則項)を課した関数」を最小化する
$S_{\gamma} = (\boldsymbol{y} - \Phi\boldsymbol{w})^{T}(\boldsymbol{y} - \Phi\boldsymbol{w}) + \gamma\boldsymbol{R}(\boldsymbol{w})$
$\gamma\boldsymbol{R}(\boldsymbol{w})$が正則化項
- 正則化項の役割
	- なし⇒最小二乗推定量  
	-   L2ノルム：Ridge推定量（縮小推定）  
    パラメータを0に近づけるよう推定  
	-   L1ノルムを利用⇒Lasso推定量（スパース推定）
	いくつかのパラメータを0にすることで、計算上も有利

#### 汎化性能
- 汎化性能 
	学習に使用した入力だけでなく、これまで見たことのない新たな入力に対する予測性能
	- 訓練誤差もテスト誤差もどちらも小さい▶汎化しているモデルの可能性
	- 訓練誤差は小さいがテスト誤差が大きい▶過学習
	- 訓練誤差もテスト誤差もどちらも大きい▶未学習
- ホールドアウト法
	有限のデータを学習用とテスト用の2つに分割し、「予測精度」や「誤り率」を推定する為に使用
- クロスバリデーション(交差検証)
	データを複数のブロックに分割しそれぞれのブロックを一度ずつ検証データとして使いホールドアウト法を行う。
- グリッドサーチ
	全てのチューニングパラメータの組み合わせで評価値を算出

### ハンズオン
線形回帰モデル、非線形回帰モデル、サポートベクター回帰モデル、ニューラルネットワークを比較する。

必要な設定をする。
![スクリーンショット 2020-11-27 12.30.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/189f41a0-fe59-c0da-eafc-84e3e3a60626.png)
ランダムなノイズを加えた関数を作成する。
![スクリーンショット 2020-11-27 12.31.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/47c81bd1-ee65-3f78-53f1-0ebd92e1e1b3.png)
線形回帰をする
![スクリーンショット 2020-11-27 12.33.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/1eaf865c-0f3c-d9f1-12e1-415ae27a9bcb.png)
Ridge推定量を用いて回帰した非線形モデル
![スクリーンショット 2020-11-27 12.33.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/9bc43d2d-8d0f-2b03-6c96-4250a97fa86d.png)
Ridge推定量を用いて回帰した非線形モデル(scikit-learnのkernel.ridgeを用いない）
![スクリーンショット 2020-11-27 12.36.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/4331f001-1f3c-af31-a21f-5d3d7f0edf8f.png)
多項式を用いた回帰モデル
![スクリーンショット 2020-11-27 12.37.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/9d626aec-e2dc-a2f9-47b1-e599287fb788.png)
Lassoを用いた非線形モデル
![スクリーンショット 2020-11-27 12.39.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/2f6ee337-8a8d-adfe-8c8b-aabb2c96359b.png)
SVM
![スクリーンショット 2020-11-27 12.39.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/e7e53474-6f3b-10e7-a3fd-a9f6871254a0.png)
ニューラルネットワークモデル
![スクリーンショット 2020-11-27 12.40.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/17ca7ace-6144-3f71-b231-0f1c6cb04d48.png)
![スクリーンショット 2020-11-27 12.42.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/0fe280ab-60c3-f6f5-201b-aa4cced22183.png)







## 第三章 ロジスティック回帰モデル
### 講義
#### 2値分類問題(クラス分類)
ある入力(数値のベクトル)からクラス(0 or 1)に分類する問題
- 説明変数 $\boldsymbol{x} = (x_{1}, x_{2}, ... , x_{m})^{T} \in \mathbb{R}^{m}$
- 目的変数 $y\in\{0,1\}$
#### ロジスティック線形回帰モデル
分類問題を解くための教師あり機械学習モデル(教師データから学習)
線形回帰の結果をシグモイド関数に入力することでy=1である確率を出力する。
#### シグモイド関数
入力は実数・出力は必ず0~1の値
$\sigma(x)=\frac{1}{1+exp(-ax)}$
#### 最尤推定
データは固定し、パラメータを変化させる
尤度関数を最大化するようなパラメータを選ぶ推定方法
- 一回の試行で$y=y_1$になる確率
$P(y)=p^y(1-p)^{1-y}$
- n回の試行で$y_1$~$y_n$が同時に起こる確率(p固定)
$P(y_1,y_2,\cdots,y_n;p)=\prod_{i=1}^n{p^y_i}(1-p)^{1-y_i}$
(pは既知)
- $y_1$~$y_n$のデータが得られた際の尤度関数
$P(y_1,y_2,\cdots,y_n;p)=\prod_{i=1}^n{p^y_i}(1-p)^{1-y_i}$
($y_i$は既知、pは未知)

- 尤度関数
$E(\boldsymbol{w})=-log L(\boldsymbol{w})$
- 勾配降下法
反復学習によりパラメータを逐次的に更新するアプローチの一つ。
解析的に求めるのが困難なパラメータを探索する。
- 確率的勾配降下法
データをひとつずつランダムに選んでパラメータを逐次的に更新していくアプローチ。

#### 混同行列
-  真陽性(TP)
	正しくpositiveと判別した個数
- 偽陰性(FP)
	間違えてpositiveと判別した個数
- 偽陽性(FN)
	間違えてNegativeと判別した個数
- 真陰性(TN)
	正しくNegativeと判別した個数
- 正解率
	正解した割合
- Recall
	陽性のうち陽性と判別した割合
- Precision
	陽性と判別した物のうち陽性だった物の割合
- F値
	RecallとPrecisionの調和平均
	
### ハンズオン
タイタニックの乗客の生死を分類する。
必要な設定をし、データを読み込む。
![スクリーンショット 2020-11-27 12.46.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/72ae9571-3eff-94c1-5b3e-2493596ca6d8.png)
不要な列を削除する。
![スクリーンショット 2020-11-27 12.49.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/a3b3422f-3faf-3442-ad8f-ac0901398628.png)
NaNが含まれるデータを表示する。Ageの部分がNaNになっていることが多いことがわかる。
![スクリーンショット 2020-11-27 12.50.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/5387c980-a7d7-24d5-1ca7-0fba2bda2c4b.png)
Nanを平均値で置き換えたAgeFillという列を追加する。
![スクリーンショット 2020-11-27 12.51.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/38df3056-464d-f381-c8ee-e49ad9af3b87.png)
乗船料金を特徴量とし、生死フラグを目的変数としたロジスティック回帰を学習させる。
![スクリーンショット 2020-11-27 12.55.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/fd28d281-266c-ea4c-5231-c8b4f4121fd1.png)
料金が61の人は死亡し、62の人は生存すると予測した。
![スクリーンショット 2020-11-27 12.58.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/7bff3c96-8027-1304-99e7-9da89bd69e14.png)
切片と回帰係数を表示
![スクリーンショット 2020-11-27 13.01.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/716dfbe3-1603-2e1a-6a3c-262cba0bdbd2.png)
求めたシグモイド関数がどれだけデータと一致しているかプロットする。
![スクリーンショット 2020-11-27 13.02.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/8b345747-2cc1-25d3-cdad-78258f8f4369.png)
多変数を用いて予測する。性別を01に変換し、Pclassとgenderの和であるPclass_Genderという特徴量を追加する。
![スクリーンショット 2020-11-27 13.05.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/75d8d140-97ca-669e-2dc4-f3bcbb4b685f.png)
Pclass_GenderとAgeFillを使って、予測可能であるか可視化する。重なっている部分はあるがうまく予測できそう。
![スクリーンショット 2020-11-27 13.10.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/05d99bc8-5807-af39-5136-79d5b5dd359a.png)
Pclass_GenderとAgeFillを使って学習する。
![スクリーンショット 2020-11-27 13.13.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/fc1d0fb6-7df6-54ef-af05-78265a8ad856.png)
年齢が10歳、Pclass_Genderが1の場合96%の確率で生存すると予測した。
![スクリーンショット 2020-11-27 13.14.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/1585d771-423e-0b8c-ee34-b0eb8dc14b65.png)
求めたモデルを可視化する。
![スクリーンショット 2020-11-27 13.19.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/54aea1e2-c950-bcae-fa26-ecc44e1a582a.png)
評価のため、学習データ、検証データに分割し、学習させる。
![スクリーンショット 2020-11-27 13.23.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/67120380-f77a-8c79-7d4f-4bc79623c39e.png)
精度を求める。複数の特徴料を使った方がスコアが高い。
![スクリーンショット 2020-11-27 13.24.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/8367b119-ac7c-4729-ecfd-fd84c2daabe1.png)
適合率、再現率、F値を求める。また、混合行列を求める。
![スクリーンショット 2020-11-27 13.27.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/bd530ad7-0c1e-dd07-79ef-32d92ac5ab7c.png)
混合行列を可視化する。
![スクリーンショット 2020-11-27 13.31.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/ad73572c-0d12-0a2a-dff3-8e8f437438f6.png)
![スクリーンショット 2020-11-27 13.32.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/b557cb06-1ec2-99b0-fab0-5e8f3d59175f.png)
各項目で生存率がどのように違うか可視化する。
![スクリーンショット 2020-11-27 13.32.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/11af27d6-b868-97f2-e778-6d602715a957.png)
男女別で年齢と生存率の関係を可視化する。
![スクリーンショット 2020-11-27 13.34.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/17135d20-e040-39e0-77bc-eb4ba7267eb0.png)











## 第四章 主成分分析
### 講義

多変量データの持つ構造をより少数個の指標に圧縮する。
- 次元を削っても情報の損失が少ない。
- 4次元以上のものを2次元や3次元に圧縮することで可視化できる。

数式
- 学習データ
$\boldsymbol{x}\_{i} = (x_{i1}, x_{i2}, ... , x_{im}) \in \mathbb{R}^{m}$

- 平均（ベクトル）
$\bar{\boldsymbol{x}} = \dfrac{1}{n} \sum_{i=1}^{n}\boldsymbol{x}_{i}$
- データ行列 
$\bar{\boldsymbol{X}} = (x_{1} - \bar{x}, x_{2} - \bar{x}, ... , x_{n} - \bar{x})^{T} \in \mathbb{R}^{ n \times m}$

- 分散共分散行列 
$\Sigma = Var(\bar{\boldsymbol{X}}) = \dfrac{1}{n}\bar{\boldsymbol{X}^{T}}\bar{\boldsymbol{X}}$

- 線形変換後のベクトル 
$\boldsymbol{s}\_{j}=(s_{1j}, \cdots ,s_{nj})^{T} = \bar{\boldsymbol{X}} \boldsymbol{a}_{j}$

- 線形変換後の分散 
$Var(\boldsymbol{s}\_{j}) = \dfrac{1}{n}\boldsymbol{s}\_{j}^{T}\boldsymbol{s}\_{j} = \dfrac{1}{n}(\bar{\boldsymbol{X}}\boldsymbol{a}\_{j})^{T}(\bar{\boldsymbol{X}}\boldsymbol{a}\_{j}) = \dfrac{1}{n}\boldsymbol{a}\_{j}^{T}\bar{\boldsymbol{X}}^{T}\bar{\boldsymbol{X}}\boldsymbol{a}\_{j} = \boldsymbol{a}\_{j}^{T} Var(\bar{X})\boldsymbol{a}\_{j}$

無限に解がないよう$\boldsymbol{a}\_{j}^T\boldsymbol{a}\_{j}=1$となるように$arg\ max\ \boldsymbol{a}\_{j}^TVar(\bar{\boldsymbol{X}})\boldsymbol{a}\_{j}$を求める。

- 制約つき最適化問題の解き方
ラグランジュ関数を最大にする係数ベクトルを探索(微分して0になる点)
ラグランジュ関数 $\smash{ E(\boldsymbol{a}\_{j}) = \boldsymbol{a}\_{j}^{T} Var(\bar{X})\boldsymbol{a}\_{j}  - \lambda(\boldsymbol{a}\_{j}^{T}\boldsymbol{a}\_{j} - 1) }$
ラグランジュ関数を微分して最適解を求める
ラグランジュ関数の微分$\smash{ \dfrac{\partial E(\boldsymbol{a}\_{j})}{\partial \boldsymbol{a}_{j}} =  2 Var(\bar{X})\boldsymbol{a}\_{j} -2 \lambda \boldsymbol{a}\_{j} = 0 }$
解 $Var(\bar{X})\boldsymbol{a}\_{j} = \lambda \boldsymbol{a}\_{j}$

寄与率
- 第1~元次元分の主成分の分散は、元のデータの分散と一致
  - 2次元のデータを2次元の主成分で表示した時、固有値の和と元のデータの分散が一致 
  - 第k主成分の分散は主成分に対応する固有値
- 寄与率:　第k主成分の分散の全分散に対する割合(第k主成分が持つ情報量の割合)
- 累積寄与率: 第1-k主成分まで圧縮した際の情報損失量の割合

### ハンズオン
モジュールをインポートし、データを読み込む。
![スクリーンショット 2020-11-27 13.47.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/247d8a09-195f-3446-c1b2-237d0e847ccd.png)
不要な列を削除する
![スクリーンショット 2020-11-27 13.48.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/5ec5b194-b10f-0214-3d72-155de689eb54.png)
学習データ、テストデータに分割し、学習データを用いてモデルを学習させ、検証する。
学習データで98.8%、テストデータで97.2%の結果が出ている。
![スクリーンショット 2020-11-27 13.49.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/4f3ae990-c3e3-9e50-e1e8-17f2f01884ba.png)
![スクリーンショット 2020-11-27 13.50.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/69d336b6-806c-908a-882c-3d112fcdd1a2.png)
PCAを使ってどれだけ次元圧縮できそうか可視化する。2次元から3次元程度に設定するのが良さそう。
![スクリーンショット 2020-11-27 13.57.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/bbdefc32-f839-9ba1-7d76-e4e9a01fbcff.png)
2次元に圧縮してプロットする。
![スクリーンショット 2020-11-27 13.57.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/a2507a8f-6a62-663f-83a2-a1a2a9698c6d.png)




## 第五章 アルゴリズム（k近傍法・k-平均法）
### 講義
#### k近傍法
- 分類問題のための機械学習手法
- 教師あり学習
- 最近傍のデータをk個グループにする。
- 最も多く所属するクラスに識別する。
- kがハイパーパラメータとなる。

#### k-means
- 教師なし学習
- クラスタリング手法の一つ
- 与えられたデータをk個のクラスタに分類する。

### ハンズオン
#### k近傍法
必要なモジュールをインポートし、データを生成する。
![スクリーンショット 2020-11-27 14.11.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/f61cec81-8df8-0371-0677-fb51b5bbfe38.png)
knnを実装し、実行する。
![スクリーンショット 2020-11-27 14.40.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/e9adce56-03a2-dfc2-b6fa-387f7e860416.png)
scikit-learnのKNeighborsClassifierを使ってクラスタリングする。
![スクリーンショット 2020-11-27 14.41.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/aee444b4-4c2c-4b24-38f9-afb0cd26f2fa.png)


#### k-means
必要なモジュール、データの読み込みをする。
![スクリーンショット 2020-11-27 14.04.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/087fb900-8025-acc6-8fbe-b25a3744ff61.png)
kmeansでk=3で学習させ、予測させる。
![スクリーンショット 2020-11-27 14.07.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/697ff53f-782b-47d9-cd16-9f2bc0399ecc.png)
結果を行列にして表示する。
![スクリーンショット 2020-11-27 14.09.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/e86687fb-4776-b27a-983a-e438b95bdbb8.png)


## 第七章 サポートベクターマシン
### 講義
- 2クラス分類のための機械学習手法
- 線形モデルの正負で2値分類
- 線形判別関数ともっとも近いデータ点との距離を最大化する線形関数を求める。

目的関数 $\smash{ min_{w, b}\dfrac{1}{2}||w||^{2} }$
制約条件 $\smash{ t_{i}(\boldsymbol{w}^{T}\boldsymbol{x}_{i} + b) \geq 1} \space (i=1,2,...,n)$
この最適化問題をラグランジュ未定乗数法で解く。

ラグランジュの未定乗数法
- 制約付き最適化問題を解くための手法
制約$ g_{i}(\boldsymbol{x}) \geq 0(i = 1,2, \cdots , n) $の下で、$ f(\boldsymbol{x}) $が最小になる$ \boldsymbol{x} $は、変数$ \lambda\_{i} \geq 0(i = 1,2, \cdots , n) $を用いて新たに定義したラグランジュ関数$ \smash{ L(\boldsymbol{x}, \boldsymbol{\lambda}) = f(\boldsymbol{x}) - \sum_{i=1}^{n}\lambda_{i}g(\boldsymbol{x}) } $において$ \smash{ \dfrac{\partial L}{\partial x_{j}} = 0(j = 1,2, \cdots , m) } $を満たす

KKT条件
- 制約付き最適化問題において最適解が満たす条件
制約$g_i(\boldsymbol{x})\geq 0$のもとで、$f(\boldsymbol{x})$が最小となる$\boldsymbol{x^*}$は、以下の条件を満たす


### ハンズオン
必要なモジュールをインポートし、線形分離可能なデータを生成する。
![スクリーンショット 2020-11-27 14.55.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/2844261b-e476-75b7-b72f-a68304358517.png)
線形SVMを実装し、学習させる。
![スクリーンショット 2020-11-27 14.55.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/c29a68e1-10a5-0927-4ebe-19ced2107ba4.png)
マージンと決定境界を可視化する。
![スクリーンショット 2020-11-27 14.56.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/1eeaee29-8ea5-8a76-8bd9-b9cfec152d8e.png)
線形分離不可能なデータを生成する。
![スクリーンショット 2020-11-27 14.56.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/7321792f-f314-6161-44be-d3976e15d6a3.png)
RBFカーネルを使って非線形SVMで決定境界を決定する。
![スクリーンショット 2020-11-27 14.56.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/836f8f7d-8dd9-a627-02c4-2ae2d04b90bf.png)
マージンと決定境界を可視化する。
![スクリーンショット 2020-11-27 14.56.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/b7243ced-8e77-20b9-61d1-b95e2ae9ef22.png)
重なりがあるデータを生成する。
![スクリーンショット 2020-11-27 14.57.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/fd071efc-4d5c-3a80-1c4f-4c713e7356c7.png)
線形SVMを使って決定境界を決める。
![スクリーンショット 2020-11-27 14.57.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/88e1fa3d-e7a7-c7ae-acac-b8ca9998e237.png)
マージンと決定境界を可視化する。
![スクリーンショット 2020-11-27 14.57.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/891f7cb0-eb30-0986-a7d6-a84626764e49.png)




## 参考文献
[^1]: 深層学習 / Ian Goodfellow, Yoshua Bengio, Aaron Courville著 ; 岩澤有祐 [ほか] 監訳