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=⎣⎡v1v2⋮vn⎦⎤
- 矢印記法(Arrow Notation)
- v=[v1 v2 … vn]
4.内積 (dot product)と外積(cross product)
4.1.内積と外積の戻り値
用語 | 意味 |
---|
内積 | 2本のベクトルに対してスカラーを対応させる演算 |
外積 | 2本のベクトルに対してベクトルを対応させる演算 |
4.2.幾何学的意味
用語 | 意味 |
---|
内積 | ∣a∣∣b∣cosθの大きさを持つスカラ値 |
外積 | 長さが∣a∣∣b∣sinθで、aとbに垂直なベクトルのこと |
- ただし、θはベクトルaとbのなす角
- cosは横/斜めなので、∣a∣∣cosθ は∣b∣方向の正射影のベクトルを意味する
4.3.代数的意味
用語 | 意味 |
---|
内積 | a ⋅ b =a1b1+a2b2のスカラ値 |
外積 | a×b=(aybz−azby,azbx−axbz,axby−aybx) という成分で表されるベクトル |
4.4.大きさの意味
用語 | 意味 |
---|
内積 | aの正射影とbの積の大きさ |
外積 | aとbのなす平行四辺形の積の長さを持つベクトル |
4.5.記号的な違い
用語 | 記号1 | 記号2 | 記号3 |
---|
内積 | ⟨a,b⟩ | a⋅b | aTb |
外積 | [a,b] | a×b | abT(※これは外積ではなく直積(outer product)なので注意) |
5.行列の積
演算 | 日本語 | 英語 |
---|
AB | 行列の積 | matrix product / Matrix multiplication |
a⋅b | 内積, スカラー積(ドット積) | dot product, inner product |
a×b | 外積, ベクトル積(クロス積) | cross product |
a⊗b | 直積, テンソル積 | outer product |
a∧b | 楔積, ウェッジ積 | wedge product |
A⊗b | クロネッカー積 | kronecker product |
a⊙b | 要素ごとの積、アダマール積/シューア積 | Hadamard product/Schur product / element-wise product |
a⋅(b×c) | スカラー三重積 | scalar triple product |
A:B | フロベニウス積, フロベニウス内積 | Frobenius inner product |
NOTE:
- クロネッカー積と直積のオペレーターは同じ
- オペランド:
- クロネッカー積の場合は左オペランドは行列
- 直積の場合はベクトル
- 外積≠outer productなので注意!
- 行列の積
- 行列の積は結果の対応する要素の内積
- 左のオペランドの行と右のオペランドの列の要素の積の総和をとるもの
numpy.dot
でも引数が行列だと行列の積になる
5.1.内積
inner product: a⋅b
a⋅b=i=1∑naibi
5.2.外積
cross product:a×b
a×b=⎝⎛a1a2a3⎠⎞×⎝⎛b1b2b3⎠⎞=⎝⎛a2b3−a3b2a3b1−a1b3a1b2−a2b1⎠⎞
5.3.直積(テンソル積)
⎝⎛abc⎠⎞⊗⎝⎛def⎠⎞=⎝⎛a⊗⎝⎛def⎠⎞b⊗⎝⎛def⎠⎞c⊗⎝⎛def⎠⎞⎠⎞=⎝⎛adbdcdaebeceafbfcf⎠⎞
テンソル積を使わない場合
⎝⎛abc⎠⎞(def)=⎝⎛a(def)b(def)c(def)⎠⎞=⎝⎛adbdcdaebeceafbfcf⎠⎞
※右オペランドは横行列
5.4.ウェッジ積
a∧b:=a⊗b−b⊗a
つまりは、オペランドを反転した2つのテンソル積の差
5.5.クロネッカー積
Aはm×nの行列で、Aのij成分を Aijとすると、
A⊗B=⎝⎛A11BA21B⋮Am1BA12BA22B⋮Am2B⋯⋯⋱⋯A1nBA2nB⋮AmnB⎠⎞
例)
A=(1324)
B=(56)A⊗B=(51561810201224)
5.6.アダマール積
⎝⎛a11a21a31a12a22a32⎠⎞⊙⎝⎛b11b21b31b12b22b32⎠⎞=⎝⎛a11,b11a21,b21a31,b31a12,b12a22,b22a32,b32⎠⎞
6.ノルム(norm)
長さの概念を一般化したもの
n次元ベクトルx=(x1,x2,⋯,xn) および 1≤p<∞ なるpに対して
x の Lp ノルムと言い,∣∣x∣∣pと書く。
p∣x1∣p+∣x2∣p+⋯+∣xn∣p=(∣x∣p)p1=∣∣x∣∣p
ノルムは2本パイプで囲うので注意
ノルム | 式 |
---|
ユークリッドノルム(絶対値) | ∣x∣ |
ノルム | ∣∣x∣∣p |
6.1.ノルムの呼び名
ノルム | 式 |
---|
L1(マンハッタン距離) | ∣x1∣+∣x2∣+⋯+∣xn∣ |
L2(ユークリッド距離距離) | x12+x22+⋯+xn2 |
マンハッタン郷里では、図中の赤も青も緑も同じ値となる
6.2.ノルムの例
NOTE: 等高線なので値の大きさを表している。なので、色が重要
L1ノルム
∣x∣1=∣x1∣+∣x2∣
L1ノルムL2ノルム
∣x∣2=∣x1∣2+∣x2∣2
L2ノルム6.3.単位円
二次元ベクトルに対してノルムが1になる時の単位円を図示すると、
∣∣x∣∣p=1
単位円軸に張り付いていない場合は、pが大きくなるほど、ノルムが小さくなる。
x={2,2}∣∣x∣∣1=2+2=4∣∣x∣∣2=22+22=8∼2.828∣∣x∣∣3=23+231/3=161/3∼2.519
軸に張り付いている場合は、ノルムは値になる。
x2={3,0}∣∣x2∣∣1=3+0=3∣∣x2∣∣2=32+02=9=3∣∣x3∣∣2=(33+03)1/3=271/3=3
6.4.ユークリッド距離
ユークリッド距離=原点を平均とする二乗和平方根の事。
∣∣x∣∣2=(x1−0)2+(x2−0)2+⋯+(xn−0)2
分散(二乗平均平方根)が平均偏差(絶対偏差)と比べて優れている点は、分散はベクトルの距離を示しているため。
7.トレース
ある正方行列Aに対して、対角成分の和をAのトレース(tr A)という
7.1.例
A=(2−143)trA=5
8.次元
線形空間Vの基底を構成するベクトルの個数のことをいい、次のように表現する。
dimV
8.1.例
例えば、xy平面は「x軸ベクトル&y軸ベクトル」の2つのベクトルで基底をなすので、次元は2となる。
9.コサイン類似度(Cosine similarity)
二つのベクトル a=(a1,a2,⋯,an) と b=(b1,b2,⋯,bn) に対して、次をコサイン類似度という。
a12+⋯+an2b12+⋯+bn2a1b1+⋯+anbn
- コサイン類似度=2つのベクトルのなす角のコサイン
- 値域は[0,1]
- 直角の場合は0
分子は内積、分母はベクトルの絶対値の積なので、2つのベクトルのcosθを求めることに等しい
a12+⋯+an2b12+⋯+bn2a1b1+⋯+anbn=∣a∣∣b∣⟨a,b⟩=∣a∣∣b∣∣a∣∣b∣cosθ=cosθ
10.行列式
ある行列Aについて
A=(a11a21a12a22)
行列式Aは
detA=∣A∣=a11a22−a12a21
単位行列は
detI=∣I∣=1
10.1.行列式のやりかた
方法 | 制約 |
---|
サラスの方法(Sarrus' rule) | 3次元までOK |
余因子展開(cofactor expansion) | 4次元以上もOK |
11.ランク
ランク(階数,rank)は任意の行列に対して定義された量
いくつかの意味を持つ
- Aの正則(行列式が0でない)な小行列でサイズが最大なもののサイズ
- つまり、ある行列Aの小行列で、最もサイズが大きいもののサイズ
- Aの一次独立な行ベクトルの最大本数
- Aの一次独立な列ベクトルの最大本数
- 階段行列にしたときに 0でない成分が残る行の数
- ランク標準形にしたときに 1 が並ぶ数
- Aの像の次元
- Aの0でない特異値の数(AA⊤ の0でない固有値の数)
11.1.フルランク
あるm×nの行列で、次の条件が当てはまるとき、フルランクと呼ぶ。
rank(A)=min(m,n)
12.核(Kernel)と像(Image)
ある線形写像F:U→Vに置いて、次のように定義された部分集合
- ker(F)={u∈U∣F(u)=0}⊂U
- im(F)={F(u)∣u∈U}⊂V
※ ⊂は部分集合、 ∈は要素記号
12.1.カーネル
- カーネルはゼロベクトルにつぶれてしまう、写る前の集合(U)の部分集合のこと。
- つまり、ゼロベクトルに潰れてしまう元を寄せ集めたもの
- 「0以外のものも0に写る」場合,それは「この写像は単射ではない」ということになる。
- なぜなら、0を出力するための入力値が複数あるので,入力と出力が1対1対応ではなくなるため。
- カーネルが 0 以外の要素を含めば
- 「単射ではない」「ランク落ちしている」「行列式は 0 」などの有用な結論を引き出せる。
- カーネルは「単射からのずれ具合」
固有値問題について
- 固有値問題は「カーネルを求める作業」。
- 行列式を0とおく理由は,カーネルに0以外の要素が含まれるから
- 行列Aに関する固有値問題は,(A−λE)=0と書くことができ,
- この式は「ある写像の結果,入力xがゼロに写る」という関係を表す。
12.2.イメージ
- Im は「出力の取りうる幅」のこと。写した後の集合(V)の部分集合。
- rankの実体
- それに対し,Im は「出力の取りうる幅」のこと。
- 入力ではなく,出力に注目した情報である。
- y=Ax で,出力 y が取りうる領域のこと。
rank:A=dim(Im:A)
12.3.次元定理
m x n の行列Aに置いて、つぎの式が成り立つこと
rank:A+dim(Ker:A)=n
13.行列の種類
本当はもっと色々あるが、分かりやすいのは以下。
Type of Matrix14.REFERENCES