基本情報【科目B】令和5年度サンプル問題問5(コサイン類似度・式の読解):式とプログラムを照らし合わせるだけ

Uncategorized

基本情報技術者試験 科目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の正の平方根
候補をトレース表に書いておくと、解きやすいです。書く際は、v1[i]、deno、などわかる形で省略しましょう。

(記述例)

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}}} $$

`配列 vector1 が {a₁, a₂, …, aₙ},配列 vector2 が {b₁, b₂, …, bₙ} のとき` とあるので、a が vector1、b が vector2 であることも、このタイミングで確認しておけるとスムーズです。

④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 】
実際には2つの処理は連続しています。わかりやすいようにブロックを分けています。

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の正の平方根) が入ります。

(参考:他の選択肢) 他の2つを選ぶと、完成形になりません。
解答群 結果
denominator + (tempの正の平方根) √(a₁²+a₂²+...+aₙ²) + √(b₁²+b₂²+...+bₙ²)
tempの正の平方根 √(b₁²+b₂²+...+bₙ²)

以上より、a = vector1[i] × vector2[i]、b = denominator × (tempの正の平方根) の組合せ、正解は です。

Point: 難しい式でも「照合」と「絞り込み」で解ける

式読解は、コサイン類似度のような難しい式が出ても、数学的な意味を理解する必要はありません。問題文の式とプログラムの式を1対1で照らし合わせ、選択肢を消し込んでいけば、1つに絞れます。

関連リンク

式の読解の関連問題です。

基本情報【科目B】令和4年度サンプル問題問12(式の読解・類似度):cntを式と照合する
基本情報技術者試験 科目Bの「令和4年度 サンプル問題 問12」(式の読解・配列の類似度 simRatio)を、図解で解説します。穴埋めの中身は、cnt が何を数えている変数なのかを、戻り値の式と照らし合わせる だけで決まります。 動画で見...
基本情報【科目B】令和6年度サンプル問題問5(注文データ):式とプログラムを照らし合わせる
基本情報技術者試験 科目Bの「令和6年度 サンプル問題 問5」(式の読解・商品の関連度)を、図解で解説します。情報量の多い問題ですが、問題文の式とプログラム中の計算式を1対1で照らし合わせる だけで、3つの空欄が決まります。 動画で見たい方...
基本情報科目B-サンプル問題【全44問をがっつり解説】
※サンプル問題だけを解くのは,非効率です。詳細は以下の動画をご確認ください。 おすすめの学習順 サンプル問題(過去問・公開問題)だけを順に解くと、基礎を飛ばしがちになります。そこで、サンプル問題(★)を骨格にしつつ、合間に基礎固め(−)を挟...

関連動画

式の読解の基礎が学べる、同じ章の動画です。

講座の全動画はこちら(プレイリスト)。

6/30まで限定 無料プレゼント

サンプル問題だけ解いても、
合格できません

サンプル問題は応用ばかり。学習には不向きで、非効率です。段階的に学べるオリジナル問題50問を加えた学習専用サイトを、今だけ無料でプレゼント中

⏱ 2分で終わるアンケートに答えるだけ!

科目B 学習専用サイト ▶ アンケートに答えてサイトを受け取る

※ Googleフォーム(SSL)に移動します

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