コサイン類似度の計算アルゴリズム

■ 解き方の方針 コサイン類似度の式を「分子」と「分母」に分け、プログラムの各ループがどちらを計算しているか対応させます。 ■ 空欄a:分子の内積 分子は$a_1b_1+a_2b_2+…+a_nb_n$です。同じ要素番号の値を掛けて足し合わせるので、aは vector1[i] × vector2[i] です。各積の平方根を取る必要はありません。 ■ 分母の前半 二つ目のループでvector1の各要素の2乗和をtempに求め、その正の平方根をdenominatorへ代入しています。この時点でdenominatorは$\sqrt{a_1^2+\cdots+a_n^2}$、すなわちvector1の大きさです。 ■ 空欄b:二つの大きさの積 tempを0へ戻した後、三つ目のループでvector2の2乗和を求めます。分母を完成させるには、既にあるvector1の大きさと、tempの正の平方根であるvector2の大きさを掛けます。したがってbは denominator × (tempの正の平方根) です。 ■ 正解と誤答の見分け方 したがって、正解は エ です。 ベクトルの大きさ同士は加算ではなく乗算します。また、bでdenominatorを使わない選択肢はvector1の大きさを失ってしまいます。

次のプログラム中の  a  と  b  に入れる正しい答えの組合せを、解答群の中から選べ。ここで、配列の要素番号は1から始まる。

コサイン類似度は、二つのベクトルの向きの類似性を測る尺度である。関数calcCosineSimilarity は、いずれも要素数が n(n≥1)n(n \ge 1) である実数型の配列 vector1と vector2 を受け取り、二つの配列のコサイン類似度を返す。配列 vector1 が {a1,a2,...,ana_1, a_2, ..., a_n},配列 vector2 が {b1,b2,...,bnb_1, b_2, ..., b_n} のとき、コサイン類似度は次の数式で計算される。ここで、配列 vector1 と配列 vector2 のいずれも、全ての要素に0が格納されていることはないものとする。

a1b1+a2b2+...+anbna12+a22+...+an2b12+b22+...+bn2\frac{a_1 b_1 + a_2 b_2 + ... + a_n b_n}{\sqrt{a_1^2 + a_2^2 + ... + a_n^2} \sqrt{b_1^2 + b_2^2 + ... + b_n^2}}

[プログラム]
○実数型: calcCosineSimilarity(実数型の配列: vector1, 実数型の配列: vector2)
実数型: similarity, numerator, denominator, temp ← 0
整数型: i
numerator ← 0
for (iを1から vector1の要素数まで1ずつ増やす)
numerator ← numerator +  a 
endfor
for (iを1から vector1の要素数まで1ずつ増やす)
temp ← temp + vector1[i]の2乗
endfor
denominator ← tempの正の平方根
temp ← 0
for (iを1から vector2の要素数まで1ずつ増やす)
temp ← temp + vector2[i]の2乗
endfor
denominator ←  b 
similarity ← numerator / denominator
return similarity

出典令和5年度 公開問題 基本情報技術者試験 科目B 問5

a

b

ア

(vector1[i] * vector2[i])の正の平方根

denominator * (tempの正の平方根)

イ

(vector1[i] * vector2[i])の正の平方根

denominator + (tempの正の平方根)

ウ

(vector1[i] * vector2[i])の正の平方根

tempの正の平方根

エ

vector1[i] * vector2[i]

denominator * (tempの正の平方根)

オ

vector1[i] * vector2[i]

denominator + (tempの正の平方根)

カ

vector1[i] * vector2[i]

tempの正の平方根

キ

vector1[i]の2乗

denominator * (tempの正の平方根)

ク

vector1[i]の2乗

denominator + (tempの正の平方根)

ケ

vector1[i]の2乗

tempの正の平方根