機械学習の情報を手法を中心にざっくり整理

# 概要
自分用のメモとして、機械学習に関する情報を浅く ( それなりに ) 広くをモットーに、ざっくり整理してみました。
少しでも、他の方の理解に役立ったら嬉しいです。


# 機械学習とは
コンピュータプログラムが経験によって自動的に出力結果を改善していく仕組み。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/105335/057768db-d72f-03d1-7629-f74769df5696.png)


# 手法
機械学習の代表的な手法について記載します。
１．教師あり学習　
２．教師なし学習
３．強化学習
に分けて記載しました。

※概要説明は一例です。


## 1．教師あり学習

### 1-1．線形回帰
予測したい値を算出する式を連続する多項式として表し、各係数を最小二乗法や最尤推定法で求めることでモデルとなる式を決定する

![line.png](https://qiita-image-store.s3.amazonaws.com/0/105335/219a2709-254c-ee59-86c2-1144b79486d2.png)


Pythonライブラリ：[scikit-learn（sklearn.linear_model.LinearRegression）](http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html)
参考：[最小二乗法による線形回帰のアルゴリズム (自身のQiitaの過去記事です)](http://qiita.com/ishizakiiii/items/72be4ce16a10f97d6183)
### 1-2．ロジスティック回帰
2択の予測において ( 負け / 勝ち , 売れない / 売れる ) 、ロジスティック曲線を使用して片方 ( 勝ち・売れる ) になる確率を0から1の値で算出する。


![ロジスティック関数.png](https://qiita-image-store.s3.amazonaws.com/0/105335/3137d6f0-342d-e785-ec61-15634d7935b8.png)

Pythonライブラリ：[scikit-learn（sklearn.linear_model.LogisticRegression）](http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html)
参考：[ロジスティック回帰分析（Mr. Masahiko Asano）](http://www.ner.takushoku-u.ac.jp/masano/class_material/waseda/keiryo/15_logit.html)

### 1-3．サポートベクターマシーン(SVM)
データを分類するための境界線を決定する際に、境界線から一番近いサンプルデータまでのマージンの和が最大になる線を境界線とする手法。分類も回帰にも利用できる。

![SVM.png](https://qiita-image-store.s3.amazonaws.com/0/105335/ad5a5cb7-e807-4492-08cd-26022a0a6290.png)



Pythonライブラリ：[scikit-learn（sklearn.svm.SVR）](http://scikit-learn.org/stable/modules/generated/sklearn.svm.SVR.html)
参考：[Qiita 機械学習入門～ハードマージンSVM編～](http://qiita.com/pesuchin/items/c55f40b69aa1aec2bd19)

### 1-4．パーセプトロン
2択の予測において ( 活性 / 非活性 ) 、要因となる入力値に重みを付けて合算し、それが閾値 ( バイアス ) を超えると片方 ( 活性 ) と判定する手法。脳のニューロンの仕組みを模している。

![パーセプトロン.png](https://qiita-image-store.s3.amazonaws.com/0/105335/2b0ada26-8b2a-87fb-5209-ba3604a171e3.png)

Pythonライブラリ：[scikit-learn（sklearn.linear_model.Perceptron）](http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Perceptron.html)
参考：[Qiita 単純パーセプトロンからの機械学習入門](http://qiita.com/pesuchin/items/fb3697cab3eb6e6f0fd0)

### 1-5．決定木
分岐処理をツリー状に形成し、トップから再帰的に対象データを分岐させて最終的なクラスを決定する手法。

![決定木.png](https://qiita-image-store.s3.amazonaws.com/0/105335/a3951c0c-f058-401c-014f-8e61e2325d72.png)

Pythonライブラリ：[scikit-learn（sklearn.tree.DecisionTreeClassifier）](http://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html)
参考：[Qiita 決定木とランダムフォレスト](http://qiita.com/yshi12/items/6d30010b353b084b3749)
### 1-6．ランダムフォレスト

訓練データからランダムにデータを選んで決定木を複数作り、それぞれの決定木で予測された結果の多数決により、最終的なクラスを判定する手法。回帰で使用する時は各予測の平均をとって数値を算出する。

このように、訓練データの一部を使用してモデルして予測し、それを何度も繰り返して最後に合わせる方法をバギングという。

![random forest.png](https://qiita-image-store.s3.amazonaws.com/0/105335/098b9687-ab3d-712f-a1e0-6ef0bca4ce22.png)
Pythonライブラリ：[scikit-learn（sklearn.ensemble.RandomForestRegressor）](http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html)


### 1-7．Ada Boost
弱分類器を複数作り、訓練データで1番精度が高いものを第1分類器として選ぶ。第1分類器が誤判断したデータに対して最も精度が高い分類器を第2分類器として1つ選ぶ。これを繰り返し、弱分類器からお互いに補完しあう弱分類器を選別し、最後に合算する手法。

前回の弱分類器の結果を利用して、分類を回繰り返す方法をブースティングという。

![aba boost.png](https://qiita-image-store.s3.amazonaws.com/0/105335/dc86a227-5dd3-8511-dd77-154422bb8dfa.png)

Pythonライブラリ：[scikit-learn（sklearn.ensemble.AdaBoostRegressor）](http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.AdaBoostRegressor.html)

### 1-8．ナイーブベイズ
対象データを独立的な各要素に区切り、各要素の条件付き確率をベイズの定理に当てはめることで、判定対象がどのクラスへ分類されるかを判定する手法。主に文章の分類で使用される。

![nb.png](https://qiita-image-store.s3.amazonaws.com/0/105335/21091112-87aa-fdd7-3809-0a91349ef160.png)




Pythonライブラリ：[scikit-learn（Naive Bayes）](http://scikit-learn.org/stable/modules/naive_bayes.html#naive-bayes)
参考：[ナイーブベイズ分類器のアルゴリズム (自身のQiitaの過去記事です)](http://qiita.com/ishizakiiii/items/72be4ce16a10f97d6183)


### 1-9．k近傍法 ( KNN )
自分から最も近い複数のデータのクラスの多数決で、分類する手法。
単純すぎて怠惰学習という異名を持つ。

![kNN.png](https://qiita-image-store.s3.amazonaws.com/0/105335/26f9fbf6-1080-ccd8-8701-edc1c8232e57.png)

Pythonライブラリ：[scikit-learn（sklearn.neighbors.KNeighborsClassifier）](http://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html)

### 1-10．ニューラルネットワーク ( NN )
パーセプトロンを入力層・隠れ層・出力層と階層型に構築したモデル。
入力層ユニットは予測対象の入力データを受け取り、出力先が隠れ層ユニットと結合している。出力層ユニットは隠れ層ユニットからのデータを元に、最終的な予測を出力する。

入力層・隠れ層・出力が単純な一方向の階層構造になっているものを単純ニューラルネットワークという。

![NN.png](https://qiita-image-store.s3.amazonaws.com/0/105335/38b62e7a-2919-bbf0-6269-6f6391bf0042.png)

Pythonライブラリ：[scikit-learn（sklearn.neural_network.MLPClassifier）](http://scikit-learn.org/stable/modules/generated/sklearn.neural_network.MLPClassifier.html)
フレームワーク：[Chinaer　公式サイト(英語)](http://chainer.org/)


### 1-11．畳み込みニューラルネットワーク ( CNN )
ニューラルネットワークにおいて、隠れ層が、畳み込み層＋プーリング層 から形成されているもの。
畳み込み層では、入力層からのデータをあらゆる部分でスキャンして、特徴との適合度を計算する。プーリング層では畳み込み層のデータをあるサイズに縮約する。
畳み込み層とプーリング層を交互に繰り返すことで、隠れ層を形成する。

例えば、ある画像を0~9に判断させたい場合、0との適合用「畳み込み層＋プーリング層」が1つ、1との適合用「畳み込み層＋プーリング層」が1つ・・・と10の隠れ層を必要とする。

![cnn.png](https://qiita-image-store.s3.amazonaws.com/0/105335/65fd497f-068f-f9f7-7a44-5cd909644cf3.png)





## 2．教師なし学習

### 2-1．k平均法 ( k-means )
クラスタの個数を決めておき、訓練データからクラスタ個数分、ランダムなデータを選び、一旦、代表点と定める。他のデータは代表点との距離が1番近いクラスタに属させる。
クラスタにデータが追加された時、その中心点を新しいクラスタの代表点とする。これを、代表点が動かなくなるまで繰り返すことで、クラスタが作られる。

未知のデータに対して、同じく、各代表点との距離が1番近いクラスタに分類する手法。

![k-means.png](https://qiita-image-store.s3.amazonaws.com/0/105335/1225ea93-b885-d5b8-0d56-1d3137cfd058.png)

Pythonライブラリ：[scikit-learn（sklearn.cluster.KMeans）](http://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html)

### 2-2．主成分分析 ( PCA ) 
結果に影響する複数の要因から、どの要因がどのくらい影響を及ぼすか、寄与率を算出して、主な要因を割り出す手法。
モデルの次元を落とすのに用いられる。

Pythonライブラリ：[scikit-learn（sklearn.decomposition.PCA）](http://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html)

### 2-3．自己組織化マップ ( SOM )
入力ノードに最も近いノードを勝者ノードとして選び、その周辺ノードを入力ノードに近づける。それを繰り返すことでクラスタが作られる。

大脳皮質の視覚野を模した。

![SOM.png](https://qiita-image-store.s3.amazonaws.com/0/105335/10934be7-3a06-64a7-3600-1091fdab01f6.png)

## 3．強化学習
### 3-1．Q学習
全ての状態(s)とその時に取りうる全ての行動(a)のセットの行動価値(Q値)を、一旦、ランダムに決める。初期状態からランダムに行動を決めて、得られた即時報酬(r)と遷移先で推測される最大値の行動価値Q値によって、遷移前の状態のQ値を更新する。これを繰り返すことで、全ての状態とその時に取りうる全ての行動の行動価値を決定する。

そして、必ずその状態における行動価値が最大になるような選択をする。


## 4．手法のあれこれ

##### 4-1.「回帰」と「分類」
回帰は数値を予測する。分類はクラスを判定する。

##### 4-2．「教師あり学習」と「教師なし学習」
教師あり学習は入力と出力の関係を学習するもので、人間がラベル付けを行う必要がある。教師なし学習はデータの構造を学習するもので、人間によるラベル付けをしない。

##### 4-3．過学習
訓練データに対して過剰に適用した状態となり、未知のデータに対する予測が正しく測定できなくなること。

##### 4-4．アンサンブル学習
個々にモデリングした複数の学習器を利用し、平均・多数決などで最終的な予測をする方法。
上記のバギングやブースティングはアンサンブル学習の一種。

# 言語
### 1. Python
機械学習において、最も支持されている言語。オブジェクト指向が強いが、マルチパラダイムであり手続き型・関数型としても実装可能。習得が容易であり、教育用の言語としても好まれている。科学計算系のライブラリも豊富。
私もPythonで機械学習の勉強をして、アプリを作ってます。なので、贔屓目に書いてます。
[Python 公式サイト(英語)](https://www.python.org/)

### 2. R言語
統計学に強く、Pythonに続いて支持されている言語。こちらもマルチパラダイムであるが関数型が強く、また、データをベクトルとして扱うことができる。統計解析系のライブラリが豊富。
[R言語 公式サイト(英語)](https://www.r-project.org/)

### 3. MATLAB
技術計算・数値分析に特化したソフトウェアで、工学および科学分野でよく使用されている。オブジェクト指向で書けて、行列計算が得意。フリーではなく、使用するにはMathWorks社のラセンス認証が必要。
[ MathWorks社 - MATLAB (日本語) ](https://jp.mathworks.com/products/matlab.html)

### 4. Octave
MATLABと同じ文法で書ける数値計算用のフリーソフト。MATLABよりもパッケージやツールが少ないが、実装が簡単なのでプロトタイプ作成などによく使用される。デジタル信号処理用の関数が豊富で、音声のノイズ除去処理などが得意。
私はCourseraのMachine Learningコースで、初めて使用して知りました。
[GNU Octave 公式サイト(英語)](https://www.gnu.org/software/octave/)

### 5. Julia
比較的新しい、科学計算用のプログラミング言語。感覚的に書きやすく、処理速度が極めて高速。高速なのは、[LLVM](http://llvm.org/Logo.html) ( コンパイラー作成用のライブラリーやツール群 ) を使った実行時コンパイラー ( JIT ) によるもの。
[Julia 公式サイト(日本語)](https://julialang.org/)

# クラウドベースのAPI
### 1. Google Prediction API
Google Cloud Platform ベースの機械学習API。東京リージョンが2016年冬にできて注目をあびた。
機械学習系技術は他より数歩先を行っている印象。

[Prediction API 公式サイト](https://cloud.google.com/prediction/?hl=ja)

### 2. Microsoft Azure Machine Learning
Azureベースの機械学習API
機械学習のアルゴリズムが多数あるのが特徴。

[Azure Machine Learning 公式サイト](https://azure.microsoft.com/ja-jp/services/machine-learning/)

### 3.  Amazon Machine Learning
AWSベースの機械学習API。
クラウドとしては最大手のため、AWS上の既存アプリに機械学習を取り入れるのに便利。

[Amazon Machine Learning 公式サイト](https://aws.amazon.com/jp/machine-learning/)


# 関連情報
### 1.  シンギュラリティ
人工知能が人間の能力を超えること。予想では2045年とされている。

### 2. 強いAI弱いAI
脳科学や神経科学のアプローチを使用して、人間の脳を模した形で処理を行うAIを強いAIという。
脳の仕組みとは関係なしに、結果的に人間が行うことと同じ結果となるように処理を行うAIを弱いAIという。

### 3.  CourseraのMachine Learningコース
言わずと知れた、Courseraの機械学習の講義。
無料動画で、スタンフォード大学のアンドリュー先生の講義が受けられる。テストやコード提出の課題がある。
修了までの時間制限はなし。
[Coursera - Machine Learning](https://www.coursera.org/learn/machine-learning)

アンドリュー先生は優しいですが、やはり高度なアルゴリズムや公式理解はなかなか簡単にはいきません。
私も頑張って修了を目指してますが、なかなか終わりません。

### 4.  arXivTimes
機械学習関係の論文を調査し、日本語によって一言でまとめているチーム。
TwitterのBotをフォローしています。
初心者の私には難易度が高いなぁ～、と思いながら読んでます。

[Qiita まだ機械学習の論文を追うのに消耗してるの？それBotで解決したよ] (http://qiita.com/Hironsan/items/ca0b176fd859490dde08)


# おわり
手法や関連情報について、随時、追加していきたいです。
また、手法の参考リンクを自身のQiita記事に置き換えられるように、本格的なアルゴリズム理解を進めていきたいです。
誤った記載がありましたら、指摘いただけたら嬉しいです。