令和5年度 科目B 問5
アルゴリズム
コサイン類似度に関する問題
次のプログラム中の[a]と[b]に入れる正しい答えの組合せを,解答群の中から選べ。ここで,配列の要素番号は 1 から始まる。
コサイン類似度は,二つのベクトルの向きの類似性を測る尺度である。関数 calcCosineSimilarity は,いずれも要素数が n(n≧1) である実数型の配列 vector1 と vector2 を受け取り,二つの配列のコサイン類似度を返す。配列 vector1 が {a₁, a₂, …, aₙ},配列 vector2 が {b₁, b₂, …, bₙ} のとき,コサイン類似度は次の数式で計算される。ここで,配列 vector1 と配列 vector2 のいずれも,全ての要素に 0 が格納されていることはないものとする。
コサイン類似度の数式:
(a₁b₁ + a₂b₂ + … + aₙbₙ)/(√(a₁^2 + a₂^2 + … + aₙ^2) √(b₁^2 + b₂^2 + … + bₙ^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
解答群は原典では a・b の組合せの表。
- アa:(vector1[i] × vector2[i])の正の平方根 / b:denominator × (tempの正の平方根)
- イa:(vector1[i] × vector2[i])の正の平方根 / b:denominator + (tempの正の平方根)
- ウa:(vector1[i] × vector2[i])の正の平方根 / b:tempの正の平方根
- エa:vector1[i] × vector2[i] / b:denominator × (tempの正の平方根)
- オa:vector1[i] × vector2[i] / b:denominator + (tempの正の平方根)
- カa:vector1[i] × vector2[i] / b:tempの正の平方根
- キa:vector1[i]の2乗 / b:denominator × (tempの正の平方根)
- クa:vector1[i]の2乗 / b:denominator + (tempの正の平方根)
- ケa:vector1[i]の2乗 / b:tempの正の平方根
答えと解説を見る
✓ これが正解エa:vector1[i] × vector2[i] / b:denominator × (tempの正の平方根)
解説
aは要素どうしの積、bはdenominatorに平方根を掛ける式です。
コサイン類似度の式は、分子が a₁b₁ + a₂b₂ + … + aₙbₙ、分母が vector1 の各要素の2乗の和の平方根と、vector2 の各要素の2乗の和の平方根との積です。プログラムが分子と分母をどの変数で組み立てているかを、式の各部分と1つずつ対応させるのが軸です。
最初の for は numerator に足し込んでいるので、分子を作る部分です。分子は同じ番号の要素どうしの積の和なので、a には vector1[i] × vector2[i] が入ります。2つ目の for で vector1 の2乗の和を temp に作り、その平方根を denominator に入れています。3つ目の for で temp を 0 に戻して vector2 の2乗の和を作るので、b ではすでに入っている denominator にその平方根を掛け、分母を完成させます。
具体的な値で確かめます。vector1 を {1, 0}、vector2 を {1, 1} とすると、numerator は 1×1 + 0×1=1 です。denominator は最初に 1 の平方根で 1、b で 1 × (2の正の平方根) となり約 1.414 です。similarity は約 0.707 で、二つのベクトルが45度をなすときのコサインの値と一致します。
数式をプログラムで計算する問では、式の各部分がどの変数のどの行で作られるかを線で結ぶように対応させると、紛らわしい組合せを見分けられます。
ほかの選択肢はなぜ違うのか
- 項番a:a は vector1[i] × vector2[i] で、分子の各項そのものです。積の正の平方根を足すと式の分子と違う値になり、積が負のときは平方根が求まりません。vector1[i]の2乗にすると vector2 が分子に入らず、二つのベクトルの比較になりません。
- 項番b:b は denominator × (tempの正の平方根) です。足し算にすると分母が二つの大きさの和になり、vector1 が {1, 0}、vector2 が {1, 1} の例では 1 ÷ 約2.414 で約 0.414 となり、正しい約 0.707 とずれます。tempの正の平方根だけにすると、先に入れた vector1 側の値が上書きされて分母から消えます。
出典:令和5年度 基本情報技術者試験 科目B 問5
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)