Webアプリケーションエンジニアがディープラーニングに挑戦する際にやったこと(Coursera Week2)

# Coursera Week2
## はじめに
CourseraのWeek2を実施しましたので、私のメモを公開します。
Courseraってなんだ？という方は[Week1](http://qiita.com/KirariGlock/items/d41bdcc6f5ec5ad255fb)から御覧ください。
Week2では線形回帰で使用する複数要素の最急降下法から、スケーリング、正規方程式を学びます。

## 重回帰分析(Multivariate Linear Regression)
### 複数の特徴量(Multiple Features)
線形回帰の新しいバージョンを$ X_n^i $で表す。
家のサイズやベットルームの数など特徴のベクトルの個数を$ X_i $~$ X_n $で表す。
データの数をiで表す。
$ X_n^i = 1 $
　→　特徴ベクトルは常に1をとる
$ \theta_0X_0 + \theta_1X_1 + .... = \theta^tX^t $と表す。
このように複数の変数を用いた線形回帰を多変量線形回帰という。

### 複数要素の最急降下法(Gradient descent for multiple variables)
下記の式が多変量線形回帰による再急降下法の式
$ \theta_j := \theta_j - a\frac{1}{m} \sum_{i=1}^m ( h_\theta(x^i - y^i)x_j^i) $
この式では$ j := 0...n$の範囲で繰り返す。
この式は最急降下法と同様である。($ j = 1 $の場合、$ x_0^i=1 $である。)

### 最急降下法1 : スケーリング(Gradient descent in practice 1 : Feature Scaling)
2つの変数があるとき、例えば家の大きさが1~2000、部屋の数が1~5など。
この変数で勾配降下を実行する場合、勾配が大きくなりすぎて最小値に達する前に時間がかかってしまう。
そこでスケーリングして、変数の範囲を0<= x <= 1としている。
一般的にはxの範囲は-1以上、1以下にする。（小さい範囲ならなんでもよい）

スケーリングと平均正規化を同時に実現するには以下の式を使用する。
$x_i = \frac{x - \mu_i}{s_i}$

この時$x$は求めたいもとの値
$\mu$は平均値
$s$は最大値、または標準偏差。　→　この演習では標準偏差を使用する。

(例)$xi$が100から2000の範囲で平均が1000の場合。
$x_i := \frac{price - 1000}{1900}$

### 最急降下法2 :学習率(Gradient descent in practice 2 : Learning Rate)
勾配降下を実施し、うまく行っていればグラフは右肩下がりになり０に限りなく近づく。（x軸は反復回数、y軸は目的関数：$J(\theta)$）
300回から400回反復すると目的関数が下がらなくなる。これにより勾配降下が収束したか判断できる。

もし右肩上がりになっていた場合、収束していないことがわかる。（上がったり下がったりする場合も。）
その時は小さい値の学習率$\alpha$を使用すべき。
大きすぎる学習率$\alpha$を使用した場合、オーバーシュートして収束しなくなる。
小さすぎると収束までの回数が多くなり遅くなってしまう。
学習率の大きさが適正か確認する最も有効な手段はグラフに$J(\theta)$をプロットしてグラフを確認すること。

### 多項式回帰 (Features and polynomial regression)
多項式回帰では複数の要素を1つにまとめて考えることができる。(x1とx２をまとめてx3という要素にする。)
仮定関数(hypothesis function)は必ず直線というわけではなく、2次関数、３次関数に変更することができる。
例えば仮定関数が$h_\theta(x)=\theta_0+\theta_1x_1$の場合、以下のような2次関数や3次関数に変更できる。
$h_\theta(x)=\theta_0+\theta_1x_1+\theta_2x_1^2$
$h_\theta(x)=\theta_0+\theta_1x_1+\theta_2x_1^2+\theta_3x_1^3$
さらに平方根にする場合は以下。
$h_\theta(x)=\theta_0+\theta_1x1+\theta_2\sqrt{x_1}$

変換する際に重要なことは$x_1$の範囲が変わってくること。

### 正規方程式 (Normal equation)
最急降下法を使用すると学習率$\alpha$を調整しながら反復して目的関数$J(\theta)$を求める必要があった。
正規方程式を用いると１ステップで目的関数$J(\theta)$を求めることができる。

以下の家の価格を予想するトレーニングデータにおいて、全て1の$x_0$を追加する。

| $x_0$ | Size $x_1$ | Number of bedrooms $x_2$ | Number of floors $x_3$ | Age of home $x_4$ | price $y$ |
|---|---|---|---|---|---|---|
| 1 | 2104 | 5 | 1 | 45 | 460 |
| 1 | 1416 | 3 | 2 | 40 | 232 |
| 1 | 1534 | 3 | 2 | 30 | 315 |
| 1 | 852 | 2 | 1 | 36 | 178 |
これら全ての訓練データ$x_n$を行列$X$にする。
このとき$X$は$m x (n + 1)$の行列となり、$y$は$m$のベクトルとなる
$$
X = 
\begin{bmatrix}
1 & 2104 & 5 & 1 & 45 \\\
1 & 1416 & 3 & 2 & 40 \\\
1 & 1534 & 3 & 2 & 30 \\\
1 & 852 & 2 & 1 & 36
\end{bmatrix}
$$
$$
y=
\begin{bmatrix}
460 \\\
232 \\\
315 \\\
178
\end{bmatrix}
$$
この状態から正規方程式を解くことで目的関数$J(\theta)$を求めることができる。
$$
\theta = (X^TX)^{-1}X^Ty
$$
この式の$(X^tX)^{-1}$は$X^tX$の逆行列になっている。
Octaveで逆行列を表す場合はpinv関数を使用する。
正規方程式はOctaveでは以下のように表せる。
```
pinv(X'*X)*X'*y
```
最急降下法と正規方程式の違い
・最急降下法は学習率$\alpha$を探して反復しながら目的関数$J(\theta)$を求める必要がある。
・正規方程式は$\alpha$を探す必要はなく、１回で目的関数$J(\theta)$を求めることができる。
・最急降下法は何百万もの要素($x$)があっても効率的に実行することができる。
・正規方程式は要素が多いと遅い。
・1万から10万くらいの要素数になると最急降下法か正規方程式か微妙なラインで、それより多くなったら確実に最急降下法を使用する、

###正規方程式と非可逆性 (Normal equation and non-invertibility)
Octaveには行列を反転させる関数はpinvとinvの２種類存在する。
pinvはXの転置行列が非可逆だったとしても計算可能。

一般的にmがn以下の場合、nを減らすか正規化する必要がある。
正規化すれば計算することができるが、フィートとメートルのような共通点があることを先に調べた方が良い。
共通点があればどちらかを削除できる。

## Octave Tutorial
### Basic operations
Octaveは効率的に機械学習のプログラミングをすることができる。
初めにOctaveでプログラミングをして、あとでJavaなどの言語で作り直したほうが早くものが作れるはず。

Octaveのコマンドで間違えそうなもの

| コマンド | 意味 |
|:-:|:-:|
| % | コメント |
| ~= | Notイコール(!=) |
| PS1('>>'); | コンソールをアンドリューさん好みにする |
| 文末のセミコロン | 結果をコンソールに出したくない場合に使用する |
| 1:0.1:2 | 1から2にになるまで0.1ずつ増やした数列 |
| 1:6 | 1から6になるまで１ずつ増やした数列 |
| eye | 単位行列を生成する |
| . | 要素単位の計算 |