画像が似ているかどうかの比較を行う際に、比較する方法がいくつかある。
ユークリッド距離
文字の通りユークリッド幾何学の距離。聞き慣れないかもしれないが一般的にイメージする距離はこれ。
xy座標があって、その座標上の異なる2点間の距離
\sqrt{(x_1-x_2)^2 + (y_1-y_2)^2}
numpyを使うと簡単です
# v1 v2の次元を揃えること
def get_euclid_dist(v1, v2):
return np.linalg.norm(v1 - v2)
cos類似度
2つの角度を見る。
大きさを無視するので、比較対象同士の量に違いがある時に使用すると効果的。(自然言語処理などで文章量が違う時などによく使用されるみたいです。)
角度が小さい方が近い。
\frac{ \sum_{i=1}^NA_iB_i}{\sqrt{\sum_{i=1}^NA_i^2}\sqrt{\sum_{i=1}^NB_i^2}}
こちらもnumpyを使うと簡単
def get_cos_sim(v1, v2):
return np.dot(v1 ,v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))
相関
データに相関があるかどうか。
1に近いほうが相関がある。
\frac{\sum_I(H_1(I) - \bar{H_1})(H_2(I) - \bar{H_2})}{\sqrt{\sum_I(H_1(I) - \bar{H_1})^2\sum_I(H_2(I) - \bar{H_2})^2}}
numpyは便利という記事になりそう
def get_correl(v1, v2):
ave_v1 = np.average(v1)
ave_v2 = np.average(v2)
return np.sum((v1 - ave_v1)*(v2 - ave_v2))/np.sqrt(np.sum(np.square(v1 - ave_v1)) * np.sum(np.square(v1 - ave_v1)))