Featured image of post 行列の計算について備忘録

行列の計算について備忘録

目次

1.概要

あるコードのコサイン類似度の計算について疑問に思ったので備忘録もかねてメモ

2.実際のコード

2.1.間違ったコード

1
2
3
4
5
6
7
8
import numpy as np

vectors = np.array([[1, 2, 3], [1, 2.5, 3]])
norms = np.linalg.norm(vectors, axis=1)
numer = np.dot(vectors, vectors.T) 
denom = np.linalg.norm(vectors, axis=1) ** 2
cosine_similarities = numer / denom
print(cosine_similarities)

結果

1
2
3
4
[
  [1, 0.92307692],
  [1.07142857, 1]
]

2.2.正しいコード

1
2
3
4
5
6
7
8
import numpy as np

vectors = np.array([[1, 2, 3], [1, 2.5, 3]])
norms = np.linalg.norm(vectors, axis=1)
numer = np.dot(vectors, vectors.T) 
denom = np.outer(norms, norms)
cosine_similarities = numer / denom
print(cosine_similarities)

結果

1
2
3
4
[
  [1, 0.98974332],
  [0.98974332, 1]
]

3.記法

ベクトルは縦(列)が基本。好みにもよるが、次の書き方をする。

  • 太字記法(Bold Notation)
    • v=[v1v2vn]\mathbf{v} = \begin{bmatrix} v_1 \\ v_2 \\ \vdots \\ v_n \end{bmatrix}
  • 矢印記法(Arrow Notation)
    • v=[v1 v2  vn]\vec{v} = \begin{bmatrix} v_1 \ v_2 \ \dots \ v_n \end{bmatrix}

4.内積 (dot product)と外積(cross product)

4.1.内積と外積の戻り値

用語意味
内積2本のベクトルに対してスカラーを対応させる演算
外積2本のベクトルに対してベクトルを対応させる演算

4.2.幾何学的意味

用語意味
内積abcosθ|\overrightarrow{a}||\overrightarrow{b}|\cos\thetaの大きさを持つスカラ値
外積長さがabsinθ|\overrightarrow{a}||\overrightarrow{b}|\sin\thetaで、a\vec{a}b\vec{b}に垂直なベクトルのこと
  • ただし、θ\thetaはベクトルaとbのなす角
  • cosは横/斜めなので、acosθ|\overrightarrow{a}||\cos\thetab|\overrightarrow{b}|方向の正射影のベクトルを意味する

4.3.代数的意味

用語意味
内積 a  b =a1b1+a2b2\vec{\ a\ }\cdot\vec{\ b\ }=a_1b_1+a_2b_2のスカラ値
外積a×b=(aybzazby,azbxaxbz,axbyaybx)\vec{a} \times \vec{b} = (a_yb_z-a_zb_y,a_zb_x-a_xb_z,a_xb_y-a_yb_x) という成分で表されるベクトル

4.4.大きさの意味

用語意味
内積a\vec{a}の正射影とb\vec{b}の積の大きさ
外積a\vec{a}b\vec{b}のなす平行四辺形の積の長さを持つベクトル

4.5.記号的な違い

用語記号1記号2記号3
内積a,b\langle \textbf{a}, \textbf{b} \rangleab\vec{a} \cdot \vec{b}aTb\textbf{a}^{T} \textbf{b}
外積[a,b][\textbf{a}, \textbf{b}]a×b\vec{a} \times \vec{b}abT\textbf{a}\textbf{b} ^{T}(※これは外積ではなく直積(outer product)なので注意)

5.行列の積

演算日本語英語
ABAB行列の積matrix product / Matrix multiplication
ab\mathbf{a} \cdot \mathbf{b}内積, スカラー積(ドット積)dot product, inner product
a×b\mathbf{a} \times \mathbf{b}外積, ベクトル積(クロス積)cross product
ab\mathbf{a} \otimes \mathbf{b}直積, テンソル積outer product
ab\mathbf{a} \wedge \mathbf{b}楔積, ウェッジ積wedge product
Ab\mathbf{A} \otimes \mathbf{b}クロネッカー積kronecker product
ab\mathbf{a} \odot \mathbf{b}要素ごとの積、アダマール積/シューア積Hadamard product/Schur product / element-wise product
a(b×c)\mathbf{a} \cdot (\mathbf{b} \times \mathbf{c})スカラー三重積scalar triple product
A:B\mathbf{A} : \mathbf{B}フロベニウス積, フロベニウス内積Frobenius inner product

NOTE:

  • クロネッカー積と直積のオペレーターは同じ
    • オペランド:
      • クロネッカー積の場合は左オペランドは行列
      • 直積の場合はベクトル
  • 外積≠outer productなので注意!
    • numpyでも次の関係
      • 外積: np.cross
      • 直積: np.outer
  • 行列の積
    • 行列の積は結果の対応する要素の内積
      • 左のオペランドの行と右のオペランドの列の要素の積の総和をとるもの
    • numpy.dotでも引数が行列だと行列の積になる

5.1.内積

inner product: ab inner\ product:\ {\bf a}\cdot {\bf b} ab=i=1naibi \hspace{50px}{\bf a}\cdot {\bf b}=\displaystyle \sum_{i=1}^{n}a_i b_i

5.2.外積

cross product:a×b cross\ product:{\bf a}\times {\bf b}\\

a×b=(a1a2a3)×(b1b2b3)=(a2b3a3b2a3b1a1b3a1b2a2b1) \mathbf{a} \times \mathbf{b} = \begin{pmatrix} a_1 \\ a_2 \\ a_3 \\ \end{pmatrix} \times \begin{pmatrix} b_1 \\ b_2 \\ b_3 \\ \end{pmatrix} = \begin{pmatrix} a_2 b_3 - a_3 b_2 \\ a_3 b_1 - a_1 b_3 \\ a_1 b_2 - a_2 b_1 \\ \end{pmatrix}

5.3.直積(テンソル積)

(abc)(def)=(a(def)b(def)c(def))=(adaeafbdbebfcdcecf) {\left(\begin{matrix}a\\ b\\ c\end{matrix}\right)\otimes\left(\begin{matrix}d\\ e\\ f\end{matrix}\right) \\ =\left(\begin{matrix}a\otimes\left(\begin{matrix}d\\ e\\ f\end{matrix}\right)\\ b\otimes\left(\begin{matrix}d\\ e\\ f\end{matrix}\right)\\ c\otimes\left(\begin{matrix}d\\ e\\ f\end{matrix}\right)\end{matrix}\right) \\ =\left(\begin{matrix}ad&ae&af\\ bd&be&bf\\ cd&ce&cf\end{matrix}\right)}

テンソル積を使わない場合

(abc)(def)=(a(def)b(def)c(def))=(adaeafbdbebfcdcecf) {\begin{align} \left(\begin{matrix}a\\ b\\ c\end{matrix}\right)\left(\begin{matrix}d&e&f\end{matrix}\right) =\left(\begin{matrix}a\left(\begin{matrix}d&e&f\end{matrix}\right)\\ b\left(\begin{matrix}d&e&f\end{matrix}\right)\\ c\left(\begin{matrix}d&e&f\end{matrix}\right)\end{matrix}\right) &=\left(\begin{matrix}ad&ae&af\\ bd&be&bf\\ cd&ce&cf\end{matrix}\right) \end{align} }

※右オペランドは横行列

5.4.ウェッジ積

ab:=abba \vec{a}\wedge\vec{b}:=\vec{a}\otimes\vec{b}-\vec{b}\otimes\vec{a}

つまりは、オペランドを反転した2つのテンソル積の差

5.5.クロネッカー積

AAm×nm \times nの行列で、AAijij成分を AijAijとすると、

AB=(A11BA12BA1nBA21BA22BA2nBAm1BAm2BAmnB) A\otimes B=\begin{pmatrix} A_{11}B&A_{12}B&\cdots&A_{1n}B\\ A_{21}B&A_{22}B&\cdots&A_{2n}B\\ \vdots&\vdots&\ddots&\vdots\\ A_{m1}B&A_{m2}B&\cdots&A_{mn}B \end{pmatrix}

例)

A=(1234) A=\begin{pmatrix}1&2\\ 3&4\end{pmatrix} B=(56)AB=(56101215182024) B=\begin{pmatrix}5&6\end{pmatrix} \\ A\otimes B=\begin{pmatrix}5&6&10&12\\ 15&18&20&24\end{pmatrix}

5.6.アダマール積

(a11a12a21a22a31a32)(b11b12b21b22b31b32)=(a11,b11a12,b12a21,b21a22,b22a31,b31a32,b32) \left({\begin{array}{cc} \\ a_{11}&a_{12}\\ a_{21}&a_{22}\\ a_{31}&a_{32}\\ \end{array}}\right) \odot \left({\begin{array}{cc} b_{11}&b_{12}\\ b_{21}&b_{22}\\ b_{31}&b_{32} \\ \end{array}}\right) = \left({\begin{array}{cc} a_{11},b_{11}&a_{12},b_{12}\\ a _{21},b _{21}&a _{22},b _{22}\\ a _{31},b _{31}&a _{32},b _{32} \\ \end{array}}\right)

6.ノルム(norm)

長さの概念を一般化したもの

nn次元ベクトルx=(x1,x2,,xn)\vec{x}=(x_1,x_2,⋯,x_n) および 1p<1≤p<∞ なるppに対して x\vec{x}LpL^p ノルムと言い,xp||\vec{x}||_pと書く。

x1p+x2p++xnpp=(xp)1p=xp \sqrt[p]{|x_1|^p+|x_2|^p+\cdots +|x_n|^p} = (|\vec{x}|^{p})^{\frac{1}{p}} = ||\vec{x}||_{p}

ノルムは2本パイプで囲うので注意

ノルム
ユークリッドノルム(絶対値)x|x|
ノルムxp||x||_{p}

6.1.ノルムの呼び名

ノルム
L1(マンハッタン距離)x1+x2++xn|x_1|+|x_2|+\cdots +|x_n|
L2(ユークリッド距離距離)x12+x22++xn2\sqrt{x_1^2+x_2^2+\cdots +x_n^2}

マンハッタン郷里では、図中の赤も青も緑も同じ値となる

6.2.ノルムの例

NOTE: 等高線なので値の大きさを表している。なので、色が重要

L1ノルム

x1=x1+x2 {| {\bf x} |_1 = |x_1| + |x_2| }

L2ノルム

x2=x12+x22 {| {\bf x} |_2 = \sqrt{|x_1|^2 + |x_2|^2} }

6.3.単位円

二次元ベクトルに対してノルムが1になる時の単位円を図示すると、 xp=1 ||\overrightarrow{x}||_p=1

軸に張り付いていない場合は、pが大きくなるほど、ノルムが小さくなる。

x={2,2}x1=2+2=4x2=22+22=82.828x3=23+231/3=161/32.519 \vec{x} = \{2, 2\} \\ ||\vec{x}||_1 = 2 + 2 = 4 \\ ||\vec{x}||_2 = \sqrt{2^2 + 2^2} = \sqrt{8} \sim 2.828 \\ ||\vec{x}||_3 = {2^3 + 2^3}^{1/3} = {16}^{1/3} \sim 2.519 \\

軸に張り付いている場合は、ノルムは値になる。

x2={3,0}x21=3+0=3x22=32+02=9=3x32=(33+03)1/3=271/3=3 \vec{x_2} = \{3, 0\} \\ ||\vec{x_2}||_1 = 3 + 0 = 3 \\ ||\vec{x_2}||_2 = \sqrt{3^2 + 0^2} = \sqrt{9} = 3 \\ ||\vec{x_3}||_2 = (3^3 + 0^3)^{1/3} = 27^{1/3} = 3 \\

6.4.ユークリッド距離

ユークリッド距離=原点を平均とする二乗和平方根の事。

x2=(x10)2+(x20)2++(xn0)2 ||\vec{x}||_2 = \\ \sqrt{(x_1 - 0)^2+(x_2 - 0)^2+\cdots +(x_n - 0)^2}

分散(二乗平均平方根)が平均偏差(絶対偏差)と比べて優れている点は、分散はベクトルの距離を示しているため。

7.トレース

ある正方行列Aに対して、対角成分の和をAのトレース(tr A)という

7.1.

A=(2413)trA=5 A=\begin{pmatrix}2&4\\-1&3\end{pmatrix} \\ tr A = 5

8.次元

線形空間VVの基底を構成するベクトルの個数のことをいい、次のように表現する。

dimV dim V

8.1.

例えば、xy平面は「x軸ベクトル&y軸ベクトル」の2つのベクトルで基底をなすので、次元は2となる。

9.コサイン類似度(Cosine similarity)

二つのベクトル a=(a1,a2,,an)\vec{a}=(a_1,a_2,⋯,a_n)b=(b1,b2,,bn)\vec{b}=(b_1,b_2,⋯,b_n) に対して、次をコサイン類似度という。

a1b1++anbna12++an2b12++bn2 \dfrac{a_1b_1+\cdots +a_nb_n}{\sqrt{a_1^2+\cdots +a_n^2}\sqrt{b_1^2+\cdots +b_n^2}}

  • コサイン類似度=2つのベクトルのなす角のコサイン
  • 値域は[0,1]
  • 直角の場合は0

分子は内積、分母はベクトルの絶対値の積なので、2つのベクトルのcosθcos \thetaを求めることに等しい

a1b1++anbna12++an2b12++bn2=a,bab=abcosθab=cosθ \dfrac{a_1b_1+\cdots +a_nb_n}{\sqrt{a_1^2+\cdots +a_n^2}\sqrt{b_1^2+\cdots +b_n^2}} = \frac{\langle \vec{a}, \vec{b} \rangle}{|\vec{a}||\vec{b}|} = \frac{|\vec{a}||\vec{b}| cos \theta }{|\vec{a}||\vec{b}|} = cos \theta

10.行列式

ある行列Aについて

A=(a11a12a21a22) A=\left( \begin{array}{cc} a_{11} & a_{12} \\ a_{21} & a_{22} \\ \end{array} \right)

行列式Aは

detA=A=a11a22a12a21 det A = |A|=a_{11}a_{22}-a_{12}a_{21}

単位行列は

detI=I=1 det I = |I| = 1

10.1.行列式のやりかた

方法制約
サラスの方法(Sarrus' rule)3次元までOK
余因子展開(cofactor expansion)4次元以上もOK

11.ランク

ランク(階数,rank)は任意の行列に対して定義された量
いくつかの意味を持つ

  1. Aの正則(行列式が0でない)な小行列でサイズが最大なもののサイズ
    • つまり、ある行列Aの小行列で、最もサイズが大きいもののサイズ
  2. Aの一次独立な行ベクトルの最大本数
  3. Aの一次独立な列ベクトルの最大本数
  4. 階段行列にしたときに 0でない成分が残る行の数
  5. ランク標準形にしたときに 1 が並ぶ数
  6. Aの像の次元
  7. Aの0でない特異値の数(AAAA^{⊤} の0でない固有値の数)

11.1.フルランク

あるm×nm \times nの行列で、次の条件が当てはまるとき、フルランクと呼ぶ。

rank(A)=min(m,n) rank(A) = min(m, n)

12.核(Kernel)と像(Image)

ある線形写像F:UVF: U \rightarrow Vに置いて、次のように定義された部分集合

  • ker(F)={uUF(u)=0}Uker(F) = \{u ∈ U | F(u) = 0\} ⊂ U
  • im(F)={F(u)uU}Vim(F) = \{F(u) | u ∈ U\} ⊂ V

※ ⊂は部分集合、 ∈は要素記号

12.1.カーネル

  • カーネルはゼロベクトルにつぶれてしまう、写る前の集合(U)の部分集合のこと。
    • つまり、ゼロベクトルに潰れてしまう元を寄せ集めたもの
    • 「0以外のものも0に写る」場合,それは「この写像は単射ではない」ということになる。
      • なぜなら、0を出力するための入力値が複数あるので,入力と出力が1対1対応ではなくなるため。
  • カーネルが 0 以外の要素を含めば
    • 「単射ではない」「ランク落ちしている」「行列式は 0 」などの有用な結論を引き出せる。
  • カーネルは「単射からのずれ具合」

固有値問題について

  • 固有値問題は「カーネルを求める作業」。
  • 行列式を0とおく理由は,カーネルに0以外の要素が含まれるから
  • 行列Aに関する固有値問題は,AλE)=0(A-λE)=0と書くことができ,
  • この式は「ある写像の結果,入力xがゼロに写る」という関係を表す。

12.2.イメージ

  • Im は「出力の取りうる幅」のこと。写した後の集合(V)の部分集合。
  • rankの実体
  • それに対し,Im は「出力の取りうる幅」のこと。
  • 入力ではなく,出力に注目した情報である。
  • y=Axy = A x で,出力 y が取りうる領域のこと。

rank:A=dim(Im:A) \mathrm{rank:A}=\dim (\mathrm{Im} :A)

12.3.次元定理

m x n の行列Aに置いて、つぎの式が成り立つこと

rank:A+dim(Ker:A)=n \mathrm{rank}:A+\dim (\mathrm{Ker}:A)=n

13.行列の種類

本当はもっと色々あるが、分かりやすいのは以下。

14.REFERENCES

Built with Hugo
テーマ StackJimmy によって設計されています。