問5 コサイン類似度を求めるプログラム

基本情報​技術者試験 令和5年度 公開問題 科目B、全6問のうちの問5。

出典:令和5年度 基本情報技術者試験 公開問題 科目B 問5(分数の式は 1 行に書き直し、分数の横線を ÷、根号を √( ) で表し、添字は a1 のように並べて書き、2 乗は ² で表した。プログラムは原本の画像を文字に書き起こし、字下げは 1 段を空白 2 つで表した。関数の宣言の 2 行目は、原本どおり引数の位置にそろえた。空欄は[ a ][ b ]で、解答群の表は 1 行の文に組み直した)

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

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

(a1b1 + a2b2 + … + anbn) ÷ (√(a1² + a2² + … + an²) × √(b1² + b2² + … + bn²))

〔プログラム〕
○実数型: 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
  1. アa (vector1[i] × vector2[i])の正の平方根,b denominator × (tempの正の平方根)
  2. イa (vector1[i] × vector2[i])の正の平方根,b denominator + (tempの正の平方根)
  3. ウa (vector1[i] × vector2[i])の正の平方根,b tempの正の平方根
  4. エa vector1[i] × vector2[i],b denominator × (tempの正の平方根)
  5. オa vector1[i] × vector2[i],b denominator + (tempの正の平方根)
  6. カa vector1[i] × vector2[i],b tempの正の平方根
  7. キa vector1[i]の2乗,b denominator × (tempの正の平方根)
  8. クa vector1[i]の2乗,b denominator + (tempの正の平方根)
  9. ケa vector1[i]の2乗,b tempの正の平方根
答えと解説を開く

正解はエです。

式の分子は a1b1 + a2b2 + … + anbn で、同じ番号の要素どうしの積を全部足した値です。1 つ目の for で numerator に足していくのは vector1[i] × vector2[i] なので、a はこれです。分母は、vector1 の 2 乗の和の平方根と、vector2 の 2 乗の和の平方根の積です。プログラムでは、2 つ目の for のあと denominator に vector1 の側の平方根を入れ、temp を 0 に戻して 3 つ目の for で vector2 の 2 乗の和を temp に作ります。最後に 2 つを掛けるので、b は denominator × (tempの正の平方根) です。vector1 = {1, 0}、vector2 = {1, 1} で追います。numerator は 1 × 1 + 0 × 1 = 1 です。temp は 1 + 0 = 1 で denominator = 1 です。temp を 0 に戻して 1 + 1 = 2 になり、denominator = 1 × √2 です。similarity = 1 ÷ √2 で約 0.7⁠0⁠7 です。正解はエです。

ほかの選択肢が違う理由

  • ア積の平方根を足しても、分子の a1b1 + … + anbn になりません。上の例では √(1 × 1) + √(0 × 1) = 1 でたまたま同じですが、{2, 0} と {2, 1} では √4 = 2 になり、本来の 4 と合いません。
  • イa は積の平方根で分子が合わず、b は 2 つの平方根を足していて分母も合いません。
  • ウa が分子に合わないうえに、b で denominator を vector2 の側の平方根だけで上書きし、vector1 の側を捨てています。
  • オa は合っていますが、分母を 2 つの平方根の和にしています。式は積です。上の例では 1 ÷ (1 + √2) で約 0.4⁠1⁠4 になります。
  • カa は合っていますが、denominator を vector2 の側の平方根だけで上書きしています。vector1 の側の平方根が分母から消えます。
  • キa に vector1[i] の 2 乗を足すので、分子が vector1 だけの 2 乗の和になり、vector2 を使いません。
  • ク分子が vector1 だけの 2 乗の和になり、分母も 2 つの平方根の和で、どちらも式と合いません。
  • ケ分子が vector1 だけの 2 乗の和になり、分母も vector2 の側の平方根だけになります。

仕組み

コサイン類似度は、2 つのベクトルが同じ向きなら 1、直角なら 0、逆向きなら -1 になる値です。長さではなく向きだけを比べたいときに使います。

分子を内積、分母の平方根の部分をベクトルの長さ (大きさ) と呼びます。文章や画像の特徴をベクトルにして、似ているものを探す仕組みでよく使われます。

この問に出る言葉