質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

2685閲覧

高次元の行列のコサイン類似度において、一行一列の値を算出したいです。

zumasan

総合スコア2

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2022/07/22 06:42

編集2022/07/22 09:22

前提

高次元の行列のコサイン類似度を求めていますが、高次元の行列のコサイン類似度が算出されてしまいます。

実現したいこと

高次元の行列のコサイン類似度において、一行一列のコサイン類似度の値を求めたいです。

発生している問題

以下の二つの高次元の行列のコサイン類似度を求めると、
X=desc1=[[ 64 29 2 ... 253 255 31]
[ 1 0 14 ... 253 255 63]
[ 1 8 30 ... 123 255 56]
...
[ 32 6 6 ... 255 255 53]
[ 33 50 108 ... 249 255 32]
[ 52 79 119 ... 255 143 62]]

Y=desc2=[[ 1 22 118 ... 253 255 60]
[ 33 6 124 ... 255 255 32]
[ 3 130 253 ... 40 245 10]
...
[192 13 2 ... 255 255 32]
[ 32 6 7 ... 255 255 53]
[ 33 238 5 ... 253 255 32]]

cos_similarity(X, Y)=
[[4.93989218e-06 1.52681294e-05 3.31346771e-06 ... 3.03287671e-07
1.38625918e-05 3.90736928e-06]
[9.87978435e-06 9.05116654e-06 9.17575673e-06 ... 4.54931506e-06
2.54944217e-06 7.48360558e-06]
[2.17528585e-05 2.92562959e-06 1.16396173e-05 ... 9.09863012e-06
1.48186326e-05 1.10598419e-05]
...
[1.51663356e-05 2.02965553e-05 9.94040312e-06 ... 6.44486300e-06
1.26675408e-05 1.55632505e-05]
[1.62929777e-05 1.45367220e-05 9.17575673e-06 ... 3.03287671e-06
4.78020407e-06 8.07964496e-06]
[9.18646615e-06 1.21596480e-05 3.48338913e-06 ... 6.52068492e-06
4.78020407e-07 1.35102260e-05]]

全体のソースプログラム

import cv2
import numpy as np
import matplotlib.pyplot as plt

img1 = cv2.imread('/content/drive/My Drive/kaokao.png', cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread('/content/drive/My Drive/masatoshikaoryouiki.png', cv2.IMREAD_GRAYSCALE)

akaze = cv2.AKAZE_create()
matcher = cv2.BFMatcher(cv2.NORM_HAMMING)

特徴量検出
kp1, desc1 = akaze.detectAndCompute(img1, None)
kp2, desc2 = akaze.detectAndCompute(img2, None)

コサイン類似度計算
import numpy as np

def cos_similarity(X, Y):
Y = Y.T
return np.dot(X, Y)/(np.linalg.norm(X) * np.linalg.norm(Y, axis=0))

X = np.array(desc1)
Y = np.array(desc2)

print(cos_similarity(X, Y))

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

can110

2022/07/22 07:08

値を求めているコードを提示ください(cos_similarityという関数を使っている?)。
zumasan

2022/07/22 08:50

以下のコードを使っています。aはX、bはYに該当します。 import cv2 import numpy as np import matplotlib.pyplot as plt img1 = cv2.imread('/content/drive/My Drive/kaokao.png', cv2.IMREAD_GRAYSCALE) img2 = cv2.imread('/content/drive/My Drive/masatoshikaoryouiki.png', cv2.IMREAD_GRAYSCALE) akaze = cv2.AKAZE_create() matcher = cv2.BFMatcher(cv2.NORM_HAMMING) akaze = cv2.AKAZE_create() matcher = cv2.BFMatcher(cv2.NORM_HAMMING) # 特徴量検出 kp1, desc1 = akaze.detectAndCompute(img1, None) kp2, desc2 = akaze.detectAndCompute(img2, None) import numpy as np def cos_similarity(X, Y): Y = Y.T return np.dot(X, Y)/(np.linalg.norm(X) * np.linalg.norm(Y, axis=0)) X = np.array(desc1) Y = np.array(desc2) print(cos_similarity(X, Y))
can110

2022/07/22 09:11 編集

この欄は目につきにくくコードも崩れるので質問本文の修正にて追記ください。 なお、そのさいソースコードはコードブロックで囲んでください(詳細はヘルプ参照ください) また、可能であれば単純なdesc1,desc2の具体的なサンプルデータ値と、欲しい計算結果(行列)を提示すると回答得られやすくなると思います。
zumasan

2022/07/22 09:18

修正致します。ありがとうございます。
guest

回答2

0

ベストアンサー

以下のような感じで複数行のベクトルの類似度を一括で算出できます。
なおnumpy.dotの挙動は入力値の次元数により異なる結果となり、理解するのが大変なので利用を避けています。

Python

1import numpy as np 2 3# 行毎に正規化(l2ノルムで割る) 4def norm(x, eps=1e-8): 5 xs = (np.sqrt(np.sum(x**2,axis=1)) + eps) 6 return (x.T/xs).T 7 8# shape=(r,c) r個のc次元ベクトルの類似度を計算 9def cos_similarity(x, y, eps=1e-8): 10 # 2.3.5-6:ベクトル間の類似度【ゼロつく2のノート(実装)】 11 # https://www.anarchive-beta.com/entry/2020/09/07/190000#%E3%82%B3%E3%82%B5%E3%82%A4%E3%83%B3%E9%A1%9E%E4%BC%BC%E5%BA%A6 12 13 nx = norm(x, eps) 14 ny = norm(y, eps) 15 16 # how to calculate the dot product of two arrays of vectors in python? [duplicate] 17 # https://stackoverflow.com/questions/35090401/how-to-calculate-the-dot-product-of-two-arrays-of-vectors-in-python 18 return (nx*ny).sum(1) 19 20# 2d 21xs = np.array([[1,0],[1,0],[2,3]]) 22ys = np.array([[0,2],[2,2],[4,6]]) 23ret = cos_similarity(xs,ys) 24print(ret)# [0. 0.70710677 1. ] 25 26# 3d 27xs = np.array([[1,0,0],[1,1,0],[1,2,3]]) 28ys = np.array([[0,0,2],[2,2,2],[3,6,9]]) 29ret = cos_similarity(xs,ys) 30print(ret) # [0. 0.81649657 1. ]

投稿2022/07/23 05:25

can110

総合スコア38266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zumasan

2022/07/23 18:01

ありがとうございます。
guest

0

1行ごとのcosine類似度を出したたいということですかね?

python

1def cos_similarity(X, Y): 2 cos_sim = (X * Y).sum(axis=1) / (np.linalg.norm(X, axis=1) * np.linalg.norm(Y, axis=1)) 3 return cos_sim.reshape(-1, 1)

投稿2022/07/22 10:47

East_san

総合スコア407

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問