基本情報技術者試験 科目Bの「令和5年度 サンプル問題 問5」(式の読解・コサイン類似度)を、図解で解説します。式がいかつくて飛ばしたくなりますが、問題文の式とプログラム中の式を1対1で照らし合わせる だけで、難しい数学の知識なしに解けます。
動画で見たい方はこちら▼
問題(令和5年度 サンプル問題 問5)
次のプログラム中の【 a 】と【 b 】に入れる正しい答えの組合せを,解答群の中から選べ。ここで,配列の要素番号は 1 から始まる。
コサイン類似度は,二つのベクトルの向きの類似性を測る尺度である。関数 calcCosineSimilarity は,いずれも要素数が n(n≧1)である実数型の配列 vector1 と vector2 を受け取り,二つの配列のコサイン類似度を返す。配列 vector1 が {a₁, a₂, …, aₙ},配列 vector2 が {b₁, b₂, …, bₙ} のとき,コサイン類似度は次の数式で計算される。ここで,配列 vector1 と配列 vector2 のいずれも,全ての要素に 0 が格納されていることはないものとする。
$$ \frac{\mathrm{a}_{1}\mathrm{b}_{1}+\mathrm{a}_{2}\mathrm{b}_{2}+\cdots+\mathrm{a}_{n}\mathrm{b}_{n}}{\sqrt{\mathrm{a}_{1}^{2}+\mathrm{a}_{2}^{2}+\cdots+\mathrm{a}_{n}^{2}}\sqrt{\mathrm{b}_{1}^{2}+\mathrm{b}_{2}^{2}+\cdots+\mathrm{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
解答群
| 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の正の平方根 |
本番さながらの環境で解いてみたい方はこちら↓
解説
正解は エ(a = vector1[i] × vector2[i],b = denominator × (tempの正の平方根)) です。
数式が複雑で身構えますが、やることは「問題文の式とプログラムの式を照らし合わせ、選択肢を1つに絞る」だけです。
①式と戻り値を確認
コサイン類似度を求める式が書かれており、二つの配列のコサイン類似度を返す より、式がそのまま戻り値となることも確認しておきます。
②解答群を確認
a・b それぞれ以下の3択です。
| aの候補 | bの候補 |
|---|---|
| vector1[i] × vector2[i] の正の平方根 | denominator × (tempの正の平方根) |
| vector1[i] × vector2[i] | denominator + (tempの正の平方根) |
| vector1[i] の2乗 | tempの正の平方根 |
(記述例)
| a | b |
|---|---|
| v1[i] × v2[i]の平 | deno × (tempの平) |
| v1[i] × v2[i] | deno + (tempの平) |
| v1[i]の2乗 | tempの平 |
③問われている内容を確認
numerator ← numerator + 【 a 】・denominator ← 【 b 】 なので、numerator と denominator が何を指すのかを確認します。
similarity ← numerator ÷ denominator のあと、similarity を return しています。よって、①で確認した式は、プログラム上 numerator ÷ denominator です。
$$ \frac{numerator}{denominator} $$
(問題文の式)
$$ \frac{\mathrm{a}_{1}\mathrm{b}_{1}+\mathrm{a}_{2}\mathrm{b}_{2}+\cdots+\mathrm{a}_{n}\mathrm{b}_{n}}{\sqrt{\mathrm{a}_{1}^{2}+\mathrm{a}_{2}^{2}+\cdots+\mathrm{a}_{n}^{2}}\sqrt{\mathrm{b}_{1}^{2}+\mathrm{b}_{2}^{2}+\cdots+\mathrm{b}_{n}^{2}}} $$
④numerator ← numerator + 【 a 】
numerator が使われているのは、以下の1箇所のみです。
for (i を 1 から vector1の要素数 まで 1 ずつ増やす)
numerator ← numerator + 【 a 】
endfor
式より、numerator の完成形は a₁b₁+a₂b₂+...+aₙbₙ です。a の候補は以下の3択なので、この中でどれを入れれば完成形になるかを考えます。
| aの候補 |
|---|
| vector1[i] × vector2[i] の正の平方根 |
| vector1[i] × vector2[i] |
| vector1[i] の2乗 |
問題文 配列 vector1 が {a₁, a₂, …, aₙ},配列 vector2 が {b₁, b₂, …, bₙ} のとき より、vector1 は a、vector2 は b です。b(vector2) が使われていない vector1[i]の2乗 が、候補から外れます。
残った候補は次の2つで、違いは「正の平方根を取るかどうか」だけです。
- vector1[i] × vector2[i]
- vector1[i] × vector2[i] の正の平方根
完成形 a₁b₁+a₂b₂+...+aₙbₙ を見ると、各項は aᵢ と bᵢ を単純に掛けたものを足し合わせた形です。vector1[i] × vector2[i] を繰り返し足していけば作れるので、正の平方根は必要ありません。よって【a】は vector1[i] × vector2[i] です。
⑤denominator ← 【 b 】
denominator の完成形の式は √(a₁²+a₂²+...+aₙ²) √(b₁²+b₂²+...+bₙ²)(式の分母)です。denominator はプログラム上、以下の2箇所で代入されています。
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 】
1つめの繰り返しで vector1(a) が、2つめの繰り返しで vector2(b) が使われています。よって1回目の繰り返しの denominator ← temp の正の平方根 によって、完成形 √(a₁²+...) √(b₁²+...) のうち、前半の a 部分 √(a₁²+a₂²+...+aₙ²) が代入されていると推測できます。
√(a₁²+...+aₙ²) が代入されている denominator を、完成形 √(a₁²+...+aₙ²) √(b₁²+...+bₙ²) にするには、denominator に √(b₁²+...+bₙ²) を かけ合わせれば 良いです。選択肢の中で denominator × があるのは1択なので、【b】には denominator × (tempの正の平方根) が入ります。
| 解答群 | 結果 |
|---|---|
| denominator + (tempの正の平方根) | √(a₁²+a₂²+...+aₙ²) + √(b₁²+b₂²+...+bₙ²) |
| tempの正の平方根 | √(b₁²+b₂²+...+bₙ²) |
以上より、a = vector1[i] × vector2[i]、b = denominator × (tempの正の平方根) の組合せ、正解は エ です。
Point: 難しい式でも「照合」と「絞り込み」で解ける
式読解は、コサイン類似度のような難しい式が出ても、数学的な意味を理解する必要はありません。問題文の式とプログラムの式を1対1で照らし合わせ、選択肢を消し込んでいけば、1つに絞れます。
関連リンク
式の読解の関連問題です。



関連動画
式の読解の基礎が学べる、同じ章の動画です。
講座の全動画はこちら(プレイリスト)。
6/30まで限定 無料プレゼント
サンプル問題だけ解いても、
合格できません
サンプル問題は応用ばかり。学習には不向きで、非効率です。段階的に学べるオリジナル問題50問を加えた学習専用サイトを、今だけ無料でプレゼント中
⏱ 2分で終わるアンケートに答えるだけ!
▶ アンケートに答えてサイトを受け取る
※ Googleフォーム(SSL)に移動します
