線形代数(行列、ベクトル)の復習
線形代数(linear algebra)
プログラミング、特に機械学習の処理を実装するのに線形代数である行列やベクトルの基本は知っておく必要があります。これから機械学習を実装する上で必要な情報を簡単にまとめておきました。
行列とベクトル(Matrix and Vector)
下に記載したものが行列になります。
$$A = \left(\begin{array}{ccc}
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
10 & 11 & 12
\end{array}\right)$$
$$\boldsymbol{ A }^{43}$$
この場合「4×3行列」になります。左側が行数を表し、右側が列数を表しています。また中の数値は下記で表すことができます。これも左側が行番、右側が列番です。
$$A_{11} = 1, A_{12} = 2, A_{41} = 10, A_{43} = 12 $$
ベクトルについてですが、ベクトルは行列の一種に過ぎません。それは行列のなかで列が1つのものをベクトルとして表すことができます。つまり「n×1行列」=「ベクトル」なのです。
$$y = \left(\begin{array}{ccc}
1\\
4\\
7\\
10
\end{array}\right)$$
$$\boldsymbol{ Y }^4 y_{1} = 1, y_{3} = 7$$
四則演算
加減法は同じ行と列の数値同士に対してのみに計算をします。注意点としては同じ次元の行列でないと計算ができないことです。そのケースを実装上で行った場合はエラーが起きます。
$$\left(\begin{array}{ccc}
1 & 2 \\
3 & 4 \\
5 & 6
\end{array}\right) +
\left(\begin{array}{ccc}
1 & 2 \\
3 & 4 \\
5 & 6
\end{array}\right) =
\left(\begin{array}{ccc}
2 & 4 \\
6 & 8 \\
10 & 12
\end{array}\right)$$
スカラー値との乗除法は全ての値に対して行います。
$$4 ×
\left(\begin{array}{ccc}
1 & 2 \\
3 & 4 \\
5 & 6
\end{array}\right) / 2 =
\left(\begin{array}{ccc}
2 & 4 \\
6 & 8 \\
10 & 12
\end{array}\right)$$
行列同士の掛け算を見る前に行列とベクトルの掛け算を見てみます。行列の掛け算は1行目の各値を次の1列目の各値と掛け合わせて、足したものになります。
$$\left(\begin{array}{ccc}
1 & 2 \\
3 & 4 \\
5 & 6
\end{array}\right) ×
\left(\begin{array}{ccc}
1 \\
2
\end{array}\right) =
\left(\begin{array}{ccc}
1×1 + 2×2 \\
1×3 + 2×4 \\
1×5 + 2×6
\end{array}\right) =
\left(\begin{array}{ccc}
5 \\
11 \\
17
\end{array}\right)$$
このとき注目してほしいのは「3×2行列」×「2×1行列」=「3×1行列」になっています。実は、
「m×n行列」×「n×o行列」=「m×o行列」
「m×n行列」と「n×1行列」を掛け合わせるとmベクトルになるのです。
このことを利用して、ここで線形回帰のことを踏まえて考えます。下記の入力値(x)があり、h関数が決まっている状態だとします。
x | 10 | 15 | 20 | 25 |
$$h_θ(x) = -10 + 2x$$
これらをプログラミング上で計算する場合に行列とベクトルに考えると簡単に計算することができます。そのときに少し工夫が必要です。先ほどの行列とベクトルの掛け算の方法を利用するために、行列の次元数を合わせて、下記の数式のように書き換えます。
$$\left(\begin{array}{ccc}
1 & 10 \\
1 & 15 \\
1 & 20 \\
1 & 25
\end{array}\right) ×
\left(\begin{array}{ccc}
-10 \\
2
\end{array}\right) =
\left(\begin{array}{ccc}
10 \\
20 \\
30\\
40
\end{array}\right)$$
これができることによってプログラミング上での冗長さがだいぶ解消されます。行列の計算ができる言語であれば、上記のように1行で書くことができます。しかし、上記のように行列にしなかった場合は入力のデータ数分だけh関数との式の計算を記載しないといけないので、だいぶ処理が簡略できることがわかると思います。
これは上記のように行列とベクトルだけでなく、行列同士でも利用することができます。
x | 10 | 15 | 20 | 25 |
$$h_θ(x) = -10 + 2x$$
$$h_θ(x) = -15 + 2x$$
$$h_θ(x) = -10 + 3x$$
$$\left(\begin{array}{ccc}
1 & 10 \\
1 & 15 \\
1 & 20 \\
1 & 25
\end{array}\right) ×
\left(\begin{array}{ccc}
-10 & -15 & -10\\
2 & 2 & 3
\end{array}\right) =
\left(\begin{array}{ccc}
10 & 5 & 20 \\
20 & 15 & 35 \\
30 & 25 & 50 \\
40 & 35 & 65
\end{array}\right)$$
これにより複数の計算処理が一回でできるので非常に便利です。ただし、ここで注意点があります。それは行列の掛け算は順番を入れ替えると答えがかわってしまうということです。
$$A × B \neq B × A$$
計算してみるとわかると思いますが、答えが違います。順番を勝手に入れ替えないように注意する必要があります。
単位行列(Identity matrix)
単位行列とは正方行列であり、右下がりの対角線上の値がすべて1で、残りの値がすべて0であるもののことを言います。この単位行列は上記で掛け算の順番を入れ替えができない話をしましたが、それが可能なものとなり、また元の行列と同じ答えを出します。
$$A × I = I × A = A$$
$$I_2 =
\left(\begin{array}{ccc}
1 & 0 \\
0 & 1
\end{array}\right)$$
$$\left(\begin{array}{ccc}
a & b \\
c & d
\end{array}\right) ×
\left(\begin{array}{ccc}
1 & 0 \\
0 & 1
\end{array}\right) =
\left(\begin{array}{ccc}
1 & 0 \\
0 & 1
\end{array}\right) ×
\left(\begin{array}{ccc}
a & b \\
c & d
\end{array}\right) =
\left(\begin{array}{ccc}
a & b \\
c & d
\end{array}\right)$$
逆行列(Inverse matrix)
逆行列は単位行列を返すことのできる行列です。まず逆数を見てみましょう。逆数は1を返すことのできるものになります。
$$3 × (3^{-1}) = 3 × \frac {1}{3}= 1$$
上記の行列の場合が逆行列になります。注意点として、全ての数に逆数があるわけではないです。0の場合は、0の除算は未定義なので逆数はなしです。また条件として、掛ける対象の行列(A)は正方行列の必要があります。
$$A × A^{-1} = A^{-1} × A = I$$
$$\left(\begin{array}{ccc}
3 & 4 \\
2 & 16
\end{array}\right) ×
\left(\begin{array}{ccc}
0.4 & -0.1 \\
-0.05 & 0.075
\end{array}\right) =
\left(\begin{array}{ccc}
1 & 0 \\
0 & 1
\end{array}\right)$$
ここでは逆行列の値を既に記載しました。実際、手で計算する方法はありますが、プログラミング上であれば、1行コードを書けば実装して値を算出できるため割愛します。
(例えばOctave言語であれば「pinv(A)」で算出できます。)
転置行列(Transpose matrix)
転置行列とは対角線で成分を折り返した行列のことであり、それは要素内の値(i,j)を(j,i)に置き換え、それによって「m×n」行列を「n×m」行列に置き換えられたものです。
$$A=\left(\begin{array}{ccc}
1 & 2 & 3 \\
4 & 5 & 6
\end{array}\right)、
B = A^{T}=\left(\begin{array}{ccc}
1 & 4 \\
2 & 5 \\
3 & 6
\end{array}\right)$$
$$A_{ij} = B_{ji} $$
これらの基本的な計算方法を用いて、機械学習を今後実装していきます。
ディスカッション
コメント一覧
まだ、コメントがありません