Coursera機械学習入門コース(2週目 - 重回帰、多項式回帰、正規方程式)

[Courseraの機械学習コース](https://www.coursera.org/learn/machine-learning/home/welcome)の2週目です。
重回帰、多項式回帰、正規方程式について学びます。また、プログラミング演習が始まり、それに伴ってOctave/MATLABインストールがあります。
記事[「Coursera機械学習入門オンライン講座虎の巻(文系社会人にオススメ)」](https://qiita.com/FukuharaYohei/items/b2143413063376e97948)を最初に読むことをお勧めします。

# サマリ
実績時間：約7.5時間
目安時間：7時間(正確に計算しても420分ぴったり)
※コースに各章の時間目安が書かれています。Windos環境の場合の目安ですが、MacでもLinuxでも大差ないです。

## 一覧
|No.|章|目安時間|内容|
|:-:|:-:|:-:|:-:|
|1.|Linear Regression with Multiple Variables|144分|多変数の線形回帰|
|1.1|Environment Setup Instructions|24分|※目安時間はWindowsの場合の計算|
|1.2|Multivariate Linear Regression|51分|重回帰と多項式回帰|
|1.3|Computing Parameters Analytically|26分|正規方程式|
|1.4|Submitting Programming Assignments|13分|プログラム演習の提出方法|
|1.5|Review|30分|ここまでのレビュー|
|2.|Octave/Matlab Tutorial|276分|Octave/Matlabのチュートリアル|
|2.1|Octave/Matlab Tutorial|76分|Octave/Matlabのチュートリアルビデオ|
|2.2|Review|200分|問題と線形単回帰のプログラム演習|

# 講義内容
## 1. Linear Regression with Multiple Variables
### 1.1. Environment Setup Instructions
#### 1.1.1. Setting Up Your Programming Assignment Environment
Reading：8分
このコースをやるには[Octave](https://ja.wikipedia.org/wiki/GNU_Octave)か[MATLAB](https://ja.wikipedia.org/wiki/MATLAB)をインストールしろと書かれています。両ソフトは互換性があって、このコースの内容上はどちらでもOK。MATLABはこのコースをやる限定では無償だが、コース完了後は有償。
取り急ぎ[Octave](https://ja.wikipedia.org/wiki/GNU_Octave)をインストールします。286MBあるのでネットワーク環境が遅い場合には注意してください。

#### 1.1.2. Access MATLAB Online
Reading：3分
やってません。MatWorksのアカウントを作るらしく、新アカウントは管理が面倒なのでやりませんでした。

#### 1.1.3. Installing Octave on Windows
Reading：3分
私のローカルPCはWindows8.1 64bitです。
[Octave for Microsoft Windows](http://wiki.octave.org/Octave_for_Microsoft_Windows)に従います。
[インストーラーのリンク](https://ftp.gnu.org/gnu/octave/windows/)から[octave-5.1.0-w64-installer.exe](https://ftp.gnu.org/gnu/octave/windows/octave-5.1.0-w64-installer.exe)をクリックしてインストーラーをダウンロード。
インストーラーを実行。以下はスクリーンショットです。そのままウィザードを進んだだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/c31bcb3f-635c-f5e5-ef3b-3f9de69a228a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/cfab26d9-3625-c6ab-9403-6562b6378dd5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/3442d03c-0546-12b3-1e19-445f90a79125.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/a6fffe11-e8b0-fce6-577f-0f592d1d03d0.png)

#### 1.1.4. Installing Octave on Mac OS X(10.10 Yosemite and 10.9 Mavericks)
Reading：10分
#### 1.1.5. Installing Octave on Mac OS X (10.8 Mountain Lion and Earlier)
Reading：3分
#### 1.1.6. Installing Octave on GNU/Linux
Reading：7分
OS関係ないので1.4から1.6はやってません。

#### 1.1.7. More Octave/MATLAB resources
Reading：10分
[Tutorialを含めたOctaveの文書リンク](https://octave.org/doc/interpreter/)があり。チュートリアルはやらずに先に進みました。

### 1.2. Multivariate Linear Regression
#### 1.2.1. Multiple Features
Video:8分, Reading:3分
複数の特徴量ということで、重回帰モデルについて説明。
まず、以下の仮説があって。

```math
h_\theta(x)=\theta_0+\theta_1x_1+\theta_2x_2+\theta_3x_3+・・・+\theta_nx_n\\
```

線形代数で表します。その時に式を簡略化するために$x_0$という変数を1と定義しておきます。

```math
h_\theta(x)=  
  \left(
    \begin{array}{ccc}
      \theta_0 & \theta_1 & \cdots & \theta_n
    \end{array}
  \right)
  \left(
    \begin{array}{ccc}
      x_0  \\
      x_1  \\
      \vdots \\
      x_n 
    \end{array}
  \right)
```

#### 1.2.2. Gradient Descent for Multiple Variables
Video:5分, Reading:2分
最急降下法(Gradient Descent)を使い、重回帰の線形回帰モデルの式がどのように最適化されていくかを説明。
[1週目が単回帰](https://qiita.com/FukuharaYohei/items/44d97f411f0b1baaa42c#53-gradient-descent-for-linear-regressionvideo10%E5%88%86-reading6%E5%88%86)なのに比べて今回は重回帰版です。こんな式でパラメータを最適化していきます。

```math
\theta_0 := \theta_0-\alpha\frac{1}{m}\sum_{i=1}^{m}(({h}_\theta(x^{(i)} - y^{(i)})x_0^{(i)}))\\
\theta_1 := \theta_1-\alpha\frac{1}{m}\sum_{i=1}^{m}(({h}_\theta(x^{(i)} - y^{(i)})x_1^{(i)}))\\
\theta_2 := \theta_2-\alpha\frac{1}{m}\sum_{i=1}^{m}(({h}_\theta(x^{(i)} - y^{(i)})x_2^{(i)}))\\
```

#### 1.2.3. Gradient Descent in Practice I - Feature Scaling
Video:8分, Reading:3分
最急降下法(Gradient Descent)が早く収束するためのTipsとしてFeature Scalingを説明。
Featureの値が採る幅をScaleし、一定幅に収めます。
このコースと関係ないですが、[記事「Feature Scalingはなぜ必要？」](https://qiita.com/ttskng/items/2a33c1ca925e4501e609)がわかりやすいです。
このコースでは下記の「標準化」を説明($\mu_i$は平均、$s_i$は標準偏差)。

```math
x_i := \frac{x_i-\mu_i}{s_i}
```

#### 1.2.4. Gradient Descent in Practice II - Learning Rate
Video:8分, Reading:4分
最急降下法(Gradient Descent)のLearning Rateについてです。
"Debugging gradient descent":イテレーション回数に対して誤差がグラフ上で収束しているかを見る。
"Automatic convergence test":1回の試行で誤差が一定数以上減っているかをテストする。

#### 1.2.5. Features and Polynomial Regression
Video:7分, Reading:3分
多項式回帰についてです。こんなやつ。

```math
h_\theta(x)=\theta_0+\theta_1 x_1+\theta_2 x_1^2+\theta_3 x_1^3 \\
h_\theta(x)=\theta_0+\theta_1 x_1+\theta_2\sqrt{x_1}
```

多項式回帰の場合は、[Feature Scaling](#23-gradient-descent-in-practice-i---feature-scalingvideo8%E5%88%86-reading3%E5%88%86)に注意しましょう。

### 1.3. Computing Parameters Analytically
#### 1.3.1. Normal Equation
Video:16分, Reading:3分
Normal Equation(正規方程式)について。[記事「線形回帰の Normal Equation（正規方程式）について」](https://qiita.com/antimon2/items/ac1ebaed75ad58406b94)に詳しい説明があります。
機械学習ではなく、方程式で一発でコスト関数の値を0にする解(パラメータ)を求める方法です。

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

最急降下法(Gradient Descent)との比較です。

|最急降下法(Gradient Descent)|正規方程式(Normal Equation)|
|:--|:--|
|Learning Rateを選択する**必要がある**|Learning Rateを選択する**必要がない**|
|何度も繰り返し学習が**必要がある**|繰り返す**必要はない**|
|パラメータ数が多くても機能する|パラメータ数が多いと遅い|

#### 1.3.2. Normal Equation Noninvertibility
Video:5分, Reading:2分
正規方程式(Normal Equation)の非正則性について。
$X^TX$の逆行列がない場合でもOctaveで`pinv`関数を使えば近似値を見つけてくれます。
ただ、$X^TX$の逆行列がない場合は以下の2点に留意する。

1. Redundant Features: 複数の関連性のある特徴量
2. Too many features: 特徴量が多すぎる場合には減らすか標準化を行う 

### 1.4. Submitting Programming Assignments
#### 1.4.1. Working on and Submitting Programming Assignments
Video:3分
プログラム演習のやり方について。

#### 1.4.2. Programming tips from Mentors
Reading:10分
プログラム演習のTips。

### 1.5. Review
#### 1.5.1. Lecture Slides
Reading:20分
ここまでのレビュースライドPDF。

#### 1.5.2. Linear Regression with Multiple Variables(Quiz:5問, 10分
始めて100%とりました！
Feature ScalingのMean normalizationを覚えていなくて20分近くかけてしまいました。

## 2. Octave/Matlab Tutorial
### 2.1. Octave/Matlab Tutorial
この章はOctave/Matlabのチュートリアルです。
とりあえず全部見るだけにしました(手で動かすことはしていません)。自分でも実行しようか迷ったのですが、今後仕事でOctave使わないだろうし、あまり手間をかけないようにしました。

#### 2.1.1. Basic Operations
Video:13分
Octave/Matlabの基本的な操作法。やはり行列の扱いに優れている印象。

#### 2.1.2. Moving Data Around
Video:16分
変数の扱い方。ファイルI/Oや行列変数への追加方法など。

#### 2.1.3. Computing on Data
Video:13分
行列、ベクトルの計算。

#### 2.1.4. Plotting Data
Video:9分
データをグラフにプロットして表示します。Pythonでのmatplotlibパッケージの世界です。

#### 2.1.5. Control Statements: for, while, if statement
Video:12分
制御文として`for`、`while`と`if`を説明。書き方はともかく、意味はPythonのそれぞれのコマンドと同じです。
また、外部関数の呼び方を説明。ワーキングディレクトリにあるファイルを勝手に読み込んでくれるところが新鮮でした。

#### 2.1.6. Vectorization
Video:13分
"Vectorization"は計算をベクトル化した実装しましょうということで、反対の"Unvectorize Implementaion"はループを使った計算です。計算の効率化とスピードアップのためです。"Numpy"パッケージやR言語の世界でよく言われていることですね。

### 2.2. Review
#### 2.2.1. Lecture Slides
Reading:10分
6章「Octave/Matlab Tutorial」のスライドPDF。

#### 2.2.2. Octave/Matlab Tutorial
Quiz:5問, 10分
Octaveでの操作に関するQuiz。簡単です。100%とれました。

#### 2.2.3. Linear Regression
Programming Assignment:3時間
3時間はかかりませんでした。いい問題で、考え理解しながら解きました。Octaveの練習にもなりました。
Optionの演習(重回帰)は説明を読みましたが、やりませんでした。

# 感想
プログラムも入って本格的になった気がします。とはいえ、内容的には機械学習の入り口でそんなに深く、複雑ではないでしょう。
前回よりも目安時間と実績時間の差が少なかったのは、ブログ書くのに慣れてきたからでしょう(特に数式パート)。

# 関連記事
私より詳しくまとめてくれています。

- [【機械学習】Stanford University Machine Learning / Week2【学習メモ】](http://forgetzimbnot.com/2014/03/post-134.html)
- [Coursera Machine Learning (2): 重回帰分析、スケーリング、正規方程式](https://qiita.com/katsu1110/items/6a6d5c5a6b8af8fbf813)
- [カンニング用GitHub](https://github.com/atinesh-s/Coursera-Machine-Learning-Stanford/tree/master/Week%202)

他の週のリンクです。

- [Coursera機械学習入門コース(1週目 - 線形回帰と線形代数)](https://qiita.com/FukuharaYohei/items/44d97f411f0b1baaa42c)
- Coursera機械学習入門コース(2週目 - 重回帰、多項式回帰、正規方程式) <- 本記事
- [Coursera機械学習入門コース(3週目 - ロジスティック回帰、正則化)](https://qiita.com/FukuharaYohei/items/270c629fd74a7da4b9da)
- [Coursera機械学習入門コース(4週目 - ニューラルネットワーク)](https://qiita.com/FukuharaYohei/items/6337dd992ebde6a744fa)
- [Coursera機械学習入門コース(5週目 - ニューラルネットワークと誤差逆伝播法)](https://qiita.com/FukuharaYohei/items/e7d60e371c076a0c215a)
- [Coursera機械学習入門コース(6週目 - 様々なアドバイス)](https://qiita.com/FukuharaYohei/items/25a76132b420cea901f2)
- [Coursera機械学習入門コース(7週目 - SVM)](https://qiita.com/FukuharaYohei/items/a67a8ae381b54e4ee0ea)
- [Coursera機械学習入門コース(8週目 - 教師なし学習(K-MeansとPCA))](https://qiita.com/FukuharaYohei/items/7a71be58818719cdf73c)
- [Coursera機械学習入門コース(9週目 - 異常検知、レコメンデーション)](https://qiita.com/FukuharaYohei/items/32caeaca6f77bf6f92dd)
- [Coursera機械学習入門コース(10週目 - ビッグデータ対応)](https://qiita.com/FukuharaYohei/items/1e33cb05a5833d22fe4b)
- [Coursera機械学習入門コース(11週目 - 写真OCR)] (https://qiita.com/FukuharaYohei/items/46c60cf591223915e6b4)