スポンサーリンク

基本情報技術者試験 | 令和5年度(科目B) [問5] 過去問解説

問題

問5

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

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

[出典:基本情報技術者試験 令和5年度(科目B) 問5]

正解

正解は「」です。

解説

 この問題は「コサイン類似度」というベクトル同士の似ている度合いを求める指標について、その計算式をプログラムでどのように実装しているかを理解する問題です。難しそうに見えますが、一つ一つの計算処理を丁寧に追えば、仕組みはシンプルです。

 ず、コサイン類似度とは「ベクトルの方向がどれだけ似ているか」を数字で表したもので、例えば向きが同じであれば1、全く反対であれば-1、直角(関係がない)であれば0になります。

コサイン類似度は式で表すと次のようになります:
 cosθ = (a₁b₁ + a₂b₂ + … + aₙbₙ) ÷ (√(a₁² + a₂² + … + aₙ²) × √(b₁² + b₂² + … + bₙ²))

 この式に基づいてプログラムを見てみると、最初にnumerator(分子)を計算しており、これは各要素の積の合計(内積)にあたる部分です。したがって、変数 a に入るのは「vector1[i] × vector2[i]」であり、正解選択肢「エ」はこれに一致します。

 次にdenominator(分母)は2つのベクトルのノルム(大きさ)の積です。まず `vector1` の各要素を2乗し合計して平方根を取り、それを `denominator` に代入します。続けて、`vector2` の各要素を2乗して合計し、その平方根をさらに `denominator` に掛けることで、式にある「2つのベクトルの長さの積」が完成します。つまり b に入るべきは「denominator × (tempの正の平方根)」です。これも「エ」の内容と一致します。

 このようにして、分子(内積)÷分母(ノルムの積)を求めているため、コサイン類似度の式そのものを正しくプログラムに置き換えた処理であるとわかります。選択肢「エ」はこの2つの要件をどちらも満たしており、正解となります。

スポンサーリンク

難易度

 この問題はコサイン類似度の計算式と、その数式に対応するプログラムコードを結び付けて理解する必要があります。プログラミングと数学的な知識の両方が問われるため、初学者にとってはやや難しく感じる可能性があります。ただし、式と処理の対応が理解できれば解きやすくなる問題です。

用語補足

コサイン類似度:
2つのベクトル間の角度の違いによって、その類似度を測る手法です。値は -1~1 の範囲をとり、1に近いほど方向が似ていることを示します。

内積:
2つのベクトルを掛け算して足し合わせる操作です。例:{1,2}と{3,4}の内積は 1×3 + 2×4 = 11 です。

ノルム(ベクトルの大きさ):
ベクトル成分を2乗して合計し、それに平方根を取ることで算出されます。例:{3, 4} のノルムは √(9+16) = 5 です。

対策

 コサイン類似度やユークリッド距離など、ベクトルの類似性を測るアルゴリズムは情報処理試験で頻出です。公式を覚えるだけでなく、実装と結び付けて理解する練習が重要です。手書きで計算を行って、分子と分母の構造を意識しながらコードを読む訓練をしましょう。


タイトルとURLをコピーしました