機械学習を1ヵ月で実践レベルにする #3 (Octave 編)

# 3日目です
今日の目標は、[Coursera でStanford が提供しているMachine Learning](https://www.coursera.org/learn/machine-learning/) の講座のWEEK 3 をやるということでしたが、実はまだWEEK 2 を終えることができておらず、引き続きWEEK 2 の残りをやりました。

## 過去記事一覧
* [1日目 とっかかり編](http://qiita.com/junichiro/items/ee50af10df77d52cd432)
* [2日目 オンライン講座](http://qiita.com/junichiro/items/7a5b95d7122176e94fe0)
* [3日目 Octave チュートリアル](http://qiita.com/junichiro/items/33954f08411e33d33506)
* [4日目 機械学習の第一歩、線形回帰から](http://qiita.com/junichiro/items/d4dc67bdebb9fccb7ef5)
* [5日目 線形回帰をOctave で実装する](http://qiita.com/junichiro/items/1a4b87e99b471cf5bea1)
* [6日目 Octave によるVectorial implementation](http://qiita.com/junichiro/items/7972b1b6ad3d087fbde0)
* [7日目 ロジスティック回帰 (分類問題) その1](http://qiita.com/junichiro/items/8de94c84c35e9851d42a)
* [8日目 ロジスティック回帰 (分類問題) その2](http://qiita.com/junichiro/items/5d20a40a3a282af422a3)
* [9日目 オーバーフィッティング](http://qiita.com/junichiro/items/4d2c91128c9bd850f580)
* [10日目 正規化](http://qiita.com/junichiro/items/8b1867201663c5af38a4)
* [11日目 ニューラルネットワーク #1] (http://qiita.com/junichiro/items/7794cedf834a4f6ef52c)
* [12日目 ニューラルネットワーク #2] (http://qiita.com/junichiro/items/b522ea41c02f90d23aa5)
* [13日目 機械学習に必要な最急降下法の実装に必要な知識まとめ](http://qiita.com/junichiro/items/527b1f211ed814528ded)
* [14日目 機械学習で精度が出ない時にやることまとめ](http://qiita.com/junichiro/items/7e2842c7afba2407c49b)
* [最終日 機械学習をゼロから1ヵ月間勉強し続けた結果](http://qiita.com/junichiro/items/3457e33e502086a200f1)

# Octave チュートリアル
今日は、WEEK 2 の残りでやったOctave チュートリアルが実りのあるものだったので、今後のOctave リファレンスとしても使えるように、ここにそれをまとめようと思います。

## 扱える型
Octave はscalar, vector, matrix を扱えますが、全部行列だと思ってしまったほうが理解しやすいかと思います。scalar は 1x1 の行列、vector は nx1 の行列だと考えれば全て行列であると考えられます。

### 起動
```shell-session
% octave-cli
```

この辺のディレクトリ操作はシェルのように使えます。

```octave
>> ls
>> pwd
>> cd hoge
```

### データの初期化、代入
```octave
>> a = 1
a =  1
>> a = [1 2]
a =

   1   2

>> a = [1;2;3]
a =

   1
   2
   3

>> a = [1 2; 3 4]
a =

   1   2
   3   4

>> a = pi;
>> a
a =  3.1416

>> v = 1:0.3:2 % 初期値:ステップ数:終値
v =

    1.0000    1.3000    1.6000    1.9000

>> v = 1:6 % 初期値:(ステップ数1を省略):終値
v =

   1   2   3   4   5   6

>> ones(2,3)
ans =

   1   1   1
   1   1   1

>> zeros(3,2)
ans =

   0   0
   0   0
   0   0

>> 2*ones(2,3)
ans =

   2   2   2
   2   2   2

>> w = rand(2,3)
w =

   0.958006   0.225452   0.932911
   0.039494   0.743074   0.607472

>>  m = magic(3) % nxn の魔法陣を作る
m =

   8   1   6
   3   5   7
   4   9   2

>> eye(5)
ans =

Diagonal Matrix

   1   0   0   0   0
   0   1   0   0   0
   0   0   1   0   0
   0   0   0   1   0
   0   0   0   0   1
```

### データのslice など(豊富なので重要)
```octave
>> A = [1 2; 3 4; 5 6]
A =

   1   2
   3   4
   5   6

>> size(A)
ans =

   3   2

>> size(A, 1)
ans =  3
>> size(A, 2)
ans =  2
>> v = [1 2 3 4]
v =

   1   2   3   4

>> length(v)
ans =  4
>> A(1,:)
ans =

   1   2

>> A(2,:)
ans =

   3   4

>> A(:,1)
ans =

   1
   3
   5

>> A(:,2)
ans =

   2
   4
   6

>> A(:)
ans =

   1
   3
   5
   2
   4
   6

>> A(1:1)
ans =  1
>> A(1:2)
ans =

   1   3

>> A(1:3)
ans =

   1   3   5

>> A([1,3], :)
ans =

   1   2
   5   6

>> A(:,2) = [10;11;12]
A =

    1   10
    3   11
    5   12

>> A = [A, [100; 101; 102]]
A =

     1    10   100
     3    11   101
     5    12   102

>> A' % 転置
ans =

     1     3     5
    10    11    12
   100   101   102

```

### 便利なもの
```octave
>> who % 定義されている変数の一覧
Variables in the current scope:

A    a    ans  m    v    w

>> whos % 定義されている変数の一覧とそのサイズなど
Variables in the current scope:

   Attr Name        Size                     Bytes  Class
   ==== ====        ====                     =====  ===== 
        A           3x2                         48  double
        a           1x1                          8  double
        ans         3x1                         24  double
        m           3x3                         72  double
        v           1x4                         32  double
        w           2x3                         48  double

Total is 29 elements using 232 bytes
```

# WEEK 2 修了テスト
WEEK 2 には修了テストがありました。各ビデオ講座は有志の方による日本語字幕がついているのが非常に助かるのですが、こういったテストなどは英語のままです。これも案の定、ちゃんと提出しないとこの週を修了したことにならないので頑張らないといけません。

内容は、まずこのテスト提出システムの使い方とそのチュートリアル。それからWEEK 1 で主に学んだ、単一変数の線形回帰を、Octave で実装する課題。最後に、WEEK 2 で学んだ多変量の線形回帰をOctave で実装する課題。

提出するとその場で正解が分かる仕組みでした。自分が理解できてるってことを客観的に再確認できるので、安心して修了して次に進むことが出来ました。A4にして15枚くらいのテスト課題で、持ち時間は3時間。結構本気のやつでしたから、これができるようになっているのは素直に嬉しくて、翌週へのモチベーションにつながります。

# 最後に目標の下方修正
* 12/17(土) WEEK 3(6h3m の前半)
* 12/18(日) WEEK 3(6h3m の後半)
* 12/19(月) WEEK 1 〜 WEEK 3 のReview とやり残し, WEEK 4 (4h42m)
* 12/20(火) WEEK 5 (5h8m)
* 12/21(水) WEEK 6 (5h46m)
* 12/22(木) WEEK 7 (4h57m)
* 12/23(金) 予備日
* 12/26(月) WEEK 4 〜 WEEK 7 のReview とやり残し
* 12/27(火) WEEK 8 (5h26m)
* 12/28(水) WEEK 9 (6h9m)
* 12/29(木) WEEK 10, WEEK 11 (2h39m), WEEK 8 〜 WEEK 11 のReview とやり残し

土日も少しずつやることにして挽回を図ることにしました。