Open1

特徴ベクトルからのコサイン類似度 (COS similarity) とユークリッド類似度 (Euclidean similarity) の算出コードスニペット

PINTOPINTO
  • コサイン類似度は、2つのベクトルの内積を、それらのノルムの積で割ることで計算される。しかし、ここでのベクトルは既に正規化されているため、単に内積を計算するだけでコサイン類似度になる。
import torch
import torch.nn.functional as F

with torch.no_grad():
    f1 = model(image1)  # image1の特徴ベクトル
    f2 = model(image2)  # image2の特徴ベクトル
    # 正規化して各ベクトルを単位ノルム(長さが1)に変換
    A_feat = F.normalize(f1, dim=1).cpu()
    B_feat = F.normalize(f2, dim=1).cpu()
similarity = A_feat.matmul(B_feat.transpose(1, 0)) # 特徴ベクトルの内積
print("\033[1;31m The similarity is {}\033[".format(similarity[0, 0]))
  • ユークリッド距離は、二点間の「直線距離」を測るもの。しかし、類似度として使用する場合は、距離を何らかの方法で類似度スコアに変換する必要がある。一般的な方法の一つは、距離の逆数や、距離に基づいた他の関数を使用する。
import torch
import torch.nn.functional as F

# 画像から特徴ベクトルを取得
with torch.no_grad():
    f1 = model(image1)  # image1の特徴ベクトル
    f2 = model(image2)  # image2の特徴ベクトル

# ユークリッド距離の計算
euclidean_distance = F.pairwise_distance(f1, f2, p=2)

# 距離から類似度への変換(逆数を取る)
# 注意: 距離が非常に小さい場合、逆数は非常に大きくなるため、適切な処理が必要
similarity = 1.0 / euclidean_distance
print("\033[1;31m The similarity is {}\033[".format(similarity[0, 0]))