【RaspberryPi】機械学習

こちらの記事は以下の書籍を参考にアウトプットとして執筆しました。

[カラー図解　Ｒａｓｐｂｅｒｒｙ　Ｐｉではじめる機械学習　基礎からディープラーニングまで ](https://www.amazon.co.jp/%E3%82%AB%E3%83%A9%E3%83%BC%E5%9B%B3%E8%A7%A3-%EF%BC%B2%EF%BD%81%EF%BD%93%EF%BD%90%EF%BD%82%EF%BD%85%EF%BD%92%EF%BD%92%EF%BD%99-%EF%BC%B0%EF%BD%89%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92-%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%BE%E3%81%A7-%E3%83%96%E3%83%AB%E3%83%BC%E3%83%90%E3%83%83%E3%82%AF%E3%82%B9-%E9%87%91%E4%B8%B8%E9%9A%86%E5%BF%97-ebook/dp/B07B7JFKL2)


#特徴量を2つを用いた、3クラスへの分類
##1対他(one-vs-the-rest,ovr)方式
サーボベクトルはそのままでは2クラスへの分類しかできないが、この方式で3クラスへ分類を以下のように実現している。

1. クラス0、クラス1、クラス2とその他としたデータをベクトルとした3つのサポートベクトルマイシンを定義市、境界線を定める
2. 分類する場合は3つの境界線との距離で決まる

##カーネルトリック
曲線、曲面による境界が可能になった手法。

#多層ニューラルネットワークによる分類
これはディープラーニングの基礎となっている技術
##ニューラルネットワーク
この書籍でのニューラルネットワークは脳の仕組みに基づく手法で課題を解決することを目指すものを指すため、脳とニューロンについて理解する必要がある。
###脳とニューロン
脳はニューロンという神経細胞で構成されている。
ニューロンは電気信号で相互の情報通信を行う。

###人工ニューロン
ニューロンをモデル化したもの。
やり取りを0と1で行うものと考える。

##アヤメのデータをニューロンに与える
4つの特徴量をニューロンに与えて
0か1の出力を得る

出力とターゲットが一致しない場合、シナプス強度を調整する。
###シナプス強度とは

ニューロンの出力は原則**多数決**。
1つのシナプスに1つの票数ではなく、
1つのシナプスに複数の票数が持てる。
シナプス強度は小数点以下、負数が許される。

投票に基づいた入力の合計を重み付き和という

このような複数の入力と1つのニューロンというモデルを単純パーセプトロンという。

###多層ニューラルネットワーク
入力と出力の間に中間層を追加する形。

```
[入力層]─[中間層]─[出力層]
```

この中間層はいくつあってもいい。

```

       ┌[中間層1]┐
[入力層]┴[中間層2]┴[出力層]
```

この形は三層ニューラルネットワークとも多層パーセプトロンとも呼ばれる。

##多重ニューラルネットワークのデメリット

- 学習に時間がかかる
- 理想的な分類が必ずしもできるわけではない

##活性化関数
入力の重み付き和と出力の対応関係のことを活性化関数という

0か1の出力ではなく0と1の間の実数を出力する関数

##中間層の活性化関数
この書籍では中間層のニューロンの活性化関数としてReLU関数が用いられている。

##多クラスの分類
サポートベクトル同様、ニューロンは3クラス以上の分類が出来ない。

その場合は出力に3つのニューロンを配置する。
この書籍では出力層に活性化関数としてソフトマックス関数が用いられると述べています。

##損失関数
この書籍では以下のように説明されています。
>損失関数とは、すべての分類結果とそのターゲットが一致すると0となり、それ以外は性の値を取る関数のことです。

シナプス調整に損失関数が使われる。
損失関数が時間とともに減少していると言うことは、シナプス強度が時間ともに調整され、学習が進んでいることを示す。

##MLPClassifier
sklearnの多層ニューラルネットワークの定義であるMLPClassifierを使っていく。
###学習の終了条件

|パラメータ|説明|ポイント|例|
|---|---|---|---|
|max_iter|学習を継続する最大時間ステップ(エポック)|大きな値を設定する|10000|
|tol|指定関数がこの値より小さな量しか減らないエポックが3回続いたら学習を終了する|なるべく小さな値を設定する|0.00001|


tolが十分小さくないと収束が早く終わってしまって分類結果が甘くなる。

###random_stateパラメータについて
`random_state=1`とすると毎回同じ結果になる。
`random_state=None`とすると毎回違う結果になる。

###十分長い時間実行させるとどうなるか
`tol=-1`(損失関数が1増えることが3回あれば学習を終える)に設定すれば実質max_iterだけが終了条件となる。

その結果、境界線が複雑になる

##損失関数の減少とシナプス強度の調整
損失関数を縦軸、シナプス強度の調整を横軸としてグラフを読みとってみる

損失関数が0になるようにシナプス強度を調整することを続けていくということは以下を意味する。

- 損失関数とシナプス調整のグラフの谷(最小値)へ近づくこと
- 損失関数が減少すること

しかし**損失関数の減少が遅くなる領域がある**
つまり損失関数が収束したかに思えてもそれが谷底とは限らず区別がつかないということ。

##局所最適解
どの谷底に落ちるかは単数の系列で決まる。
一度谷底に落ちると損失関数は時間とともに減少するという学習の性質上、その谷底から抜け出すことは期待できなくなる。

また、複数の谷底がある中で最も低い谷底(最適解)ではない谷底がたくさんある(局所最適解)。

##最適解を見つけるには
一般的に最適解を見つける手法はなく、以下の操作をして良い結果を採用するほうが現実的

- 乱数系列をいじる(random_state)
- 学習条件をいじる(max_iter,tol)

##ニューラルネットワークで分類する場合の注意
分類が難しいなら最適解にこだわらないことが一般的。

#参考書籍
[カラー図解　Ｒａｓｐｂｅｒｒｙ　Ｐｉではじめる機械学習　基礎からディープラーニングまで ](https://www.amazon.co.jp/%E3%82%AB%E3%83%A9%E3%83%BC%E5%9B%B3%E8%A7%A3-%EF%BC%B2%EF%BD%81%EF%BD%93%EF%BD%90%EF%BD%82%EF%BD%85%EF%BD%92%EF%BD%92%EF%BD%99-%EF%BC%B0%EF%BD%89%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92-%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%BE%E3%81%A7-%E3%83%96%E3%83%AB%E3%83%BC%E3%83%90%E3%83%83%E3%82%AF%E3%82%B9-%E9%87%91%E4%B8%B8%E9%9A%86%E5%BF%97-ebook/dp/B07B7JFKL2)