Coursera Machine Learningコースの2週目までの復習
Coursera Machine Learningコースの2週目プラグラミング課題を何とか終えて3週目に突入できたが、結構苦戦したので復習のメモをしておく。
Octaveの基本操作振り返り
行列操作周り
3x2行列を定義する場合は、以下のようにスペースorカンマで同じ行内の異なる列の数値を定義し、セミコロン(;)で行を分ける。
octave:5> A = [1 2; 3 4; 5 6;] A = 1 2 3 4 5 6
転置行列は ' をつけるだけ
ans = 1 3 5 2 4 6
逆行列は pinv関数を使う
octave:7> pinv(A) ans = -1.33333 -0.33333 0.66667 1.08333 0.33333 -0.41667
A行列の特定の値にアクセスしたい場合は、()で行番号と列番号を指定する。
A = 1 2 3 4 5 6 octave:9> A(3, 1) # Aの3行1列目の値を取得 ans = 5 octave:10> A(2, 2) # Aの2行2列目の値を取得 ans = 4
Octaveで行列のindexを示すときは 1 始まりなので注意(こういう配列系はよく0始まりの言語多いから)
octave:11> A(2, 4) error: A(I,J): column index out of bounds; value 4 out of bound 2
ここで、コロンがよく使われる特別な意味で、全てのを表す(正規表現でいうところのアスタリスク 的な)
A = 1 2 3 4 5 6 octave:11> A(2, :) # Aの2行目の全ての値 ans = 3 4 octave:12> A(:, 2) # Aの2列目の全ての値 ans = 2 4 6
行列の行数と列数は size関数を使って取得できる
octave:13> size(A, 1) # 行数取得 ans = 3 octave:14> size(A, 2) # 列数取得 ans = 2
ones, zeros 関数でそれぞれ全ての値が1, 0 の m * n 行列を生成してくれる。
octave:15> B = ones(3, 4) B = 1 1 1 1 1 1 1 1 1 1 1 1 octave:16> B = zeros(2, 1) B = 0 0
eye関数で単位行列を生成してくれる。
octave:17> eye(4) ans = Diagonal Matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1
magic関数で、どの行、列、斜めを足し合わせても同じ数になる特別な行列を生成してくれる(サンプルデータ生成に便利)
ans = 35 1 6 26 19 24 3 32 7 21 23 25 31 9 2 22 27 20 8 28 33 17 10 15 30 5 34 12 14 16 4 36 29 13 18 11
ドット演算が重要で、普通に行列演算したい場合は * だけでいいが、各行列の同じ行・列の値で掛け算をしたい場合はドットをアスタリスクの前につける。
A = 1 2 3 4 5 6 octave:31> B B = 3 octave:32> B = [3;4;5] B = 3 4 5 octave:33> A * B error: operator *: nonconformant arguments (op1 is 3x2, op2 is 3x1) octave:33> A .* B warning: product: automatic broadcasting operation applied ans = 3 6 12 16 25 30
octave:34> A A = 1 2 3 4 5 6 octave:35> B = [3 5] B = 3 5 octave:36> A * B error: operator *: nonconformant arguments (op1 is 3x2, op2 is 1x2) octave:36> A .* B warning: product: automatic broadcasting operation applied ans = 3 10 9 20 15 30
octave:38> A A = 1 2 3 4 5 6 octave:39> B B = 10 20 30 40 50 60 octave:40> A * B error: operator *: nonconformant arguments (op1 is 3x2, op2 is 3x2) octave:40> A .* B ans = 10 40 90 160 250 360
制御構文
for文は普通に使える。 1:10 とすることで、1 から インクリメントされて 10 まで i が代入されて実行される。endでくくる。
octave:41> for i=1:10 > A = A .* i > end
if文も使える。使い勝手は他の言語と同じ。
octave:48> for i=1:10 > if i == 5 > i > end > end i = 5
Octaveで単回帰分析(linear regression)の目的関数(cost function)を実装
これはプログラミング課題で悩んだところで、そのまま書くと答えバラシになるので自分用のヒントになるものをメモ。
シグマ計算はsum関数を使う。
octave:57> A A = 1 2 3 4 5 6 octave:58> B B = 1 2 3 octave:59> A + B warning: operator +: automatic broadcasting operation applied ans = 2 3 5 6 8 9 octave:60> sum(A + B) warning: operator +: automatic broadcasting operation applied ans = 15 18
Octaveで単回帰分析(linear regression)の最急降下法(gradient descent)を実装
上と同じくプログラミング課題でめちゃくちゃ悩んだところで、そのまま書くと答えバラシになるので自分用のヒントになるものをメモ。
gradient descentでは、thetaをそれぞれ同時に(simultaneously)計算する必要があるので、一旦 theta 値を外の値に退避しておく。
org_theta = theta; theta(1) = org_theta(1) - alpha / m * sum((X * org_theta - y) .* X(:,1));
ここは正直、ググらずにヒント無しでは解けなかった。
重回帰分析 (linear regression with multiple variables)の feature scaling をする方法
ここはテストで何度も間違えてお手上げ状態になったので、こちらのQiita記事を見て何とか正解することができた。
input の X が複数あって、それぞれの数値の範囲に大きな差がある場合(特徴1が 1 - 100 の範囲で、特徴2が0.001 - 0.002 の範囲など)は、feature scalingをして全てのXの値の範囲をおおよそにする必要がある。
その式が以下の通り。ここで mean(x) はベクトルxの平均値。
まとめ
プログラミング課題をやることで、自分がまだ全然理解できてないことを確かめられたので良かった。
最初の関門を通れた気がしてやる気も増したので、3週目以降も頑張ろう。