courseraのMachine Learning(機械学習)学んだことメモ(1)


# はじめに

機械学習のために以下のコースを受講中です

* [courseraのMachine Learning](https://www.coursera.org/learn/machine-learning/home/info)

ただ見てるだけでは、忘れていくのでメモっていくことにしました。


モチベーションになったもの

* [数学を避けてきた社会人プログラマが機械学習の勉強を始める際の最短経路](http://qiita.com/daxanya1/items/218f2e3b922142550ef9)
この記事がなければ、そもそも上述のコースを知ることもなかったし、つまる部分を知らずに悩み続ける事になったと思います。

* [ニューラルネットワークと深層学習](http://nnadl-ja.github.io/nnadl_site_ja)
一番最初のきっかけです。ただ読んでいる時点では肝心の１章が翻訳中でした。翻訳に参加するにも、あんまりわかっていない状態で参加するのは
迷惑な予感がしたので、断念しました。[courseraのMachine Learning](https://www.coursera.org/learn/machine-learning/home/info) と同じく、初心者でもわかるようになっているので、こっちもオススメです。わかるようになったら翻訳に参加したい。


学習中＋数学を分かっていないので、色々間違えて記載してあるかと思います。
ご了承下さい。



# 理解したこと

けっこうちゃんと勉強すると、そんなに難しくない。(まだ、勉強中ですが)
機械学習の目的は、テストデータを元に、一番近い数式を導き出す。

たとえば、こんなグラフがあって。
![Figure_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/3844/3e1b5e9f-d59d-c82d-6e92-fc8f1eba8145.jpeg "Figure_1.jpg")


ここに、一番近い直線のグラフを書きます。
![Figure_1_2.jpg](https://qiita-image-store.s3.amazonaws.com/0/3844/d62dd8d3-8411-5ec1-7023-08f08a987ebe.jpeg "Figure_1_2.jpg")


直線のグラフは、$y=ax+b$ ですよね。
この時の、$a$ , $b$ の値を求めよう。ってことです。


そのための手法の勉強をひたすらしていくのが、[courseraのMachine Learning](https://www.coursera.org/learn/machine-learning/home/info)の内容みたいです。

これは、ニューラルネットワークの場合も同じで、
各ニューロンの入力の重み付け(どの入力を重要とみなすか。)を同じ手法で、
最適化していくってことみたいで、はやりのディープラーニングにつながっていくようです。


# 線形回帰(Linear Regression Model)

線形回帰の目標は、グラフに打ち込まれたデータに最適なライン(数式)を導くってことです。
数式ができれば、予測も可能になります。

訓練入力$x$ 対応する出力$y$があります。
求める直線の式をいかに定義します。
Hypothesis:
$h_\theta(x) =  \theta_0 x_0 + \theta_1 x_1 + ... +\theta_n x_n$   ($x_0 = 1$)

$n=1$であれば、$y=ax+b$と同じです。$\theta = [ \theta_0, \theta_1, ... \theta_n]$が、$a$,$b$に対応しており
つまり、$\theta$を求めるのが目的です。

## コスト関数(目的関数) (Cost Function)

コスト関数$J(\theta)$は簡単に書けば

$J(\theta) = |予測値 - 実値|$ってことです。
したがって予測値が近ければそれだけ0に近似します。


```math:CostFunction

J(\theta)=  \frac{1 }{ 2m}  \sum_{i=1}^{m} (h_\theta(x^{(i)})-y^{(i)})^2
```

上記コスト関数を最小にする$\theta$を探します。


## 最急降下法アルゴリズム(Gradient descent algorithm)

先の話で、コスト関数を具体的にどうやって最小に持っていくかという問題があります。
それをこのアルゴリズムで解決します。

値が平滑化するまで繰り返し

```math
\\
 
　　\theta_j := \theta_j - \alpha \frac{1}{m} \sum_{i=1}^{m}[(h_\theta(x^{(i)} - y^{(i)} )x_{j}^{(i)}]

\\学習率(learning rate): \alpha \\

```


## 正規方程式
こちらのほうが簡単に求められるようですが$\theta$の個数(features)が増えるにつけ上記の最急降下法を使ったほうがいいそうです。目安は$\theta $が1万を超えたあたり。

$\theta = (X^T X)^{-1} X^Ty$

```octave:code
theta = pinv(X' * X)*X' * X * y;
```

## Oataveを使う

数式のグラフ化に便利
ベクトル演算が得意。

![](http://www.gnu.org/software/octave/images/screenshot-small.png)

### Octaveインストール 
Mac限定です。

```
brew tap homebrew/science
brew update && brew upgrade
brew install octave
```

editコマンドでatomが使えるようにします。

```sh:~/.octaverc
EDITOR('atom')
```


### Hypothesisをベクトル演算

元々の定義

```math
h_\theta(x) =  \theta_0 x_0 + \theta_1 x_1 + ... +\theta_n x_n    
(x_0 = 1)
```

定義

```math
\theta = \begin{pmatrix} \theta_0  \\ \theta_1 \\ \dots \\ \theta_{n} \end{pmatrix}, x = \begin{pmatrix} x_0  \\ x_1 \\ \dots \\ x_{n} \end{pmatrix}
```

転置行列に

```math
\theta^T = \begin{pmatrix} \theta_0  & \theta_1 & \dots & \theta_{n} \end{pmatrix}
```

最終的にこうなる

```math
h_\theta(x) = \begin{pmatrix} \theta_0  & \theta_1 & \dots & \theta_{n} \end{pmatrix} \cdot  \begin{pmatrix} x_0  \\ 
x_1 \\ \dots \\ x_{n} \end{pmatrix} = \theta^T \cdot x 
```


# ロジスティック回帰 Logistic Regression Model

線形回帰の場合はデータのプロットに対応する関数を作るために作りました。未来予測など具体的な値を予測するために使います。
該当するデータを分類する分類問題を解くときに使うのがロジスティック回帰です。

## Hypothesis

$h_\theta(x) = g(\theta^Tx)$

gはシグモイド関数です。

### シグモイド関数 Sigmoid Function(Logistic Funtion)


```math
g(z) = \frac {1}{1 + e^{(-z)}}
```


$z \to \infty $ の時  $g(z) \to 1$に
$z \to -\infty$ の時  $g(z) \to 0$に

つまり $ 0 \geqq  g(z) \geqq  1$ の範囲になることが保証される。


## コスト関数(目的関数) Cost Function

```math
Cost(h_{(\theta)},y) = \begin{cases}  -log(h_{\theta}(x)) & (y=1)  \\  -log(1-h_{\theta}(x)) & (y = 0) \end{cases}
```


CostFunction:

```math

J(\theta)=  \frac{1 }{ m}  \sum_{i=1}^{m} Cost(h_{(\theta)},y) = \frac{1 }{ m}[\sum_{i=1}^{m} y^{(i)} log(h_{\theta}(x)) +(1-y^{(i)}) log(1-h_{\theta}(x)) ]
```



この関数の最小にする$\theta$を探す。

## 最急降下法アルゴリズム Gradient descent algorithm

値が平滑化するまで繰り返し 

```math
　　\theta_j := \theta_j - \alpha \frac{1}{m} \sum_{i=1}^{m}[(h_\theta(x^{(i)} - y^{(i)} )x_{j}^{(i)}]
\\
　　学習率(lerning rate): \alpha
```


##正規化
上記のまま利用するとあまりにもグラフがフィットしすぎるので、
コスト関数を弄ってペナルティを課す仕組みに変更します。


CostFunction:

```math

J(\theta)= \frac{1 }{ m}[\sum_{i=1}^{m} y^{(i)} log(h_{\theta}(x)) +(1-y^{(i)}) log(1-h_{\theta}(x)) ]
+ \frac{\lambda}{2m}\sum^{n}_{j=1} \theta_j^2

```

Gradient descent algorithm:
値が平滑化するまで繰り返し

```math
　　\theta_0 := \theta_0 - \alpha \frac{1}{m} \sum_{i=1}^{m}[ (h_\theta(x^{(i)} - y^{(i)} )x_{0}^{(i)} ] \\
　　\theta_j := \theta_j - \alpha \sum_{i=1}^{m}[ \frac{1}{m} (h_\theta(x^{(i)} - y^{(i)} )x_{j}^{(i)} + \frac{\lambda}{m}\theta_j]\\
学習率(lerning rate): \alpha,  \\
j = 1,2,3,\ldots,n

```




ページを分割することにしました。今回はここまでで、次は[ニューラルネットワーク](http://qiita.com/m0a/items/da2db182f9dc859b43a9)に入ります。