基本情報技術者試験 令和5年度 科目B 公開問題 問5
次のプログラム中の「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
選択肢を押すと答え合わせができます。
正解と解説を見る
【正解】エ
コサイン類似度の分子は、対応する要素同士を掛けて合計した内積です。したがって、aはvector1[i]×vector2[i]です。例えば3要素なら、numerator=vector1[1]×vector2[1]+vector1[2]×vector2[2]+vector1[3]×vector2[3]となります。
分母は、二つのベクトルの大きさの積です。最初の繰返しでtempにvector1の各要素の2乗和を求め、その平方根をdenominatorに代入しています。次にtempを0へ戻し、vector2の2乗和を求めています。よってbでは、既に求めたvector1の大きさとtempの平方根、すなわちvector2の大きさを掛けます。
アは誤りです。bは正しいですが、積の平方根の合計は内積ではありません。
イは誤りです。aが内積にならず、bも二つの大きさを加算しています。正しくは要素積の合計と大きさの積です。
ウは誤りです。aが内積にならず、bではvector1の大きさを失ってvector2の大きさだけを分母にしています。
オは誤りです。aは正しいですが、分母は二つの大きさの和ではなく積です。
カは誤りです。aは正しいですが、bでdenominatorを上書きし、vector1の大きさを分母に含めていません。
キは誤りです。bは正しいですが、aはvector1の2乗和であり、二つのベクトルの内積ではありません。
クは誤りです。aが内積ではなく、bも大きさを加算しています。
ケは誤りです。aがvector1の2乗和となり、bもvector2の大きさだけになっています。
【ポイント】 コサイン類似度は「内積÷二つの大きさの積」で求めます。 内積では対応要素を掛けて合計し、大きさでは各要素の2乗和の平方根を取ります。 全要素が0のベクトルを除外するのは、分母が0になることを防ぐためです。
【参考】擬似言語の記述形式(基本情報技術者試験用)
擬似言語を使用した問題では、各問題文中に注記がない限り、次の記述形式が適用されているものとする。
〔擬似言語の記述形式〕 ・○手続名又は関数名 手続又は関数を宣言する。 ・型名: 変数名 変数を宣言する。 ・/* 注釈 */ 、 // 注釈 注釈を記述する。 ・変数名 ← 式 変数に式の値を代入する。 ・手続名又は関数名(引数, …) 手続又は関数を呼び出し、引数を受け渡す。
・if (条件式1) 処理1 elseif (条件式2) 処理2 elseif (条件式n) 処理n else 処理n + 1 endif 選択処理を示す。条件式を上から評価し、最初に真になった条件式に対応する処理を実行する。以降の条件式は評価せず、対応する処理も実行しない。どの条件式も真にならないときは、処理n + 1を実行する。各処理は、0以上の文の集まりである。elseifと処理の組みは、複数記述することがあり、省略することもある。elseと処理n + 1の組みは一つだけ記述し、省略することもある。
・while (条件式) 処理 endwhile 前判定繰返し処理を示す。条件式が真の間、処理を繰返し実行する。処理は、0以上の文の集まりである。
・do 処理 while (条件式) 後判定繰返し処理を示す。処理を実行し、条件式が真の間、処理を繰返し実行する。処理は、0以上の文の集まりである。
・for (制御記述) 処理 endfor 繰返し処理を示す。制御記述の内容に基づいて、処理を繰返し実行する。処理は、0以上の文の集まりである。
〔演算子と優先順位〕(上ほど優先度が高い) ・式:() . ・単項演算子:not + - ・二項演算子(乗除):mod × ÷ ・二項演算子(加減):+ - ・二項演算子(関係):≠ ≦ ≧ < = > ・二項演算子(論理積):and ・二項演算子(論理和):or 注記 演算子 . は、メンバ変数又はメソッドのアクセスを表す。 演算子 mod は、剰余算を表す。
〔論理型の定数〕 true, false
〔配列〕 配列の要素は、"["と"]"の間にアクセス対象要素の要素番号を指定することでアクセスする。なお、二次元配列の要素番号は、行番号、列番号の順に","で区切って指定する。 "{"は配列の内容の始まりを、"}"は配列の内容の終わりを表す。ただし、二次元配列において、内側の"{"と"}"に囲まれた部分は、1行分の内容を表す。
〔未定義、未定義の値〕 変数に値が格納されていない状態を、"未定義"という。変数に"未定義の値"を代入すると、その変数は未定義になる。
出典:令和5年度 基本情報技術者試験 科目B 公開問題 問5
※ 解説は SkillStack 編集部が作成したものです。Web 表示のため、図表の配置や表記を一部改めています。