問5 色の名前を One-⁠Hot 表現に変える

基本情報​技術者試験 令和8年度 公開問題 科目B、全6問のうちの問5。

出典:令和8年度 基本情報技術者試験 公開問題 科目B 問5(図とプログラムは原本の画像を文字に書き起こし、字下げは 1 段を空白 2 つで表した。図は 1 行ずつ並べ直した。空欄は[ a ][ b ]で、解答群の表は 1 行の文に組み直した)

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

一つの要素だけが 1 で他の要素が 0 であるような整数型の配列による表現を,本問では One-⁠Hot 表現という。関数 oneHotEncoding は,図のように,色の名前が格納されている要素数 1 以上の文字列型の配列を引数として受け取り,配列に含まれる色の名前(図の例では 3 種類)に基づいて,各要素を One-⁠Hot 表現に変換し,整数型配列の配列に格納して返す。関数 oneHotEncoding における変換の例を図に示す。

図 関数 oneHotEncoding における変換の例 (上から下へ)
  1. 引数の例 {"Red", "Green", "Blue", "Red"}
  2. "Red"の One-Hot 表現 {1, 0, 0}、"Green"の One-Hot 表現 {0, 1, 0}、"Blue"の One-Hot 表現 {0, 0, 1}
  3. 引数の例に対応する戻り値 {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}, {1, 0, 0}}
〔プログラム〕
○整数型配列の配列: oneHotEncoding(文字列型の配列: colors)
整数型: i, j, k
文字列型の配列: colorVector ← {} // 要素数0の配列
整数型の配列: tempVector
整数型配列の配列: oneHotVector ← {} // 要素数0の配列
 
/* 名前一覧の作成 */
for (i を 1 から colorsの要素数 まで 1 ずつ増やす)
if (colorVector の要素のいずれにも colors[i]の値 が格納されていない)
colorVectorの末尾 に [ a ] を追加する
endif
endfor
 
/* One-Hot表現への変換 */
for (j を 1 から colorsの要素数 まで 1 ずつ増やす)
tempVector ← {} // 要素数0の配列
for (k を 1 から colorVectorの要素数 まで 1 ずつ増やす)
if ([ b ])
tempVectorの末尾 に 1 を追加する
else
tempVectorの末尾 に 0 を追加する
endif
endfor
oneHotVectorの末尾 に tempVector を追加する
endfor
return oneHotVector
  1. アa colors[i]の値,b colors の要素のいずれかに colorVector[k]の値 が格納されている
  2. イa colors[i]の値,b colors[j] が colorVector[k] と等しい
  3. ウa 未定義の値,b colors の要素のいずれかに colorVector[k]の値 が格納されている
  4. エa 未定義の値,b colors[j] が colorVector[k] と等しい
答えと解説を開く

正解はイです。

前半は、重なりの無い色の名前の一覧 colorVector を作る所です。まだ一覧に無い名前を見つけたら、その名前 colors[i] を末尾に足すので、a は colors[i]の値 です。例なら一覧は {"Red", "Green", "Blue"} になります。後半は、j 番目の色ごとに、一覧の長さ分の 0 と 1 の並びを作ります。1 にするのは、j 番目の色が一覧の k 番目の名前と同じ所だけです。だから b は colors[j] が colorVector[k] と等しい、です。"Red" なら一覧の 1 番目だけが同じなので {1, 0, 0} になります。正解はイです。

ほかの選択肢が違う理由

  • アb の条件は、一覧の k 番目の名前が colors のどこかにあれば真になります。一覧の名前はどれも colors から作ったので、いつも真です。どの色も {1, 1, 1} になってしまいます。
  • ウ一覧に未定義の値を足すので、色の名前が一覧に残りません。一覧は未定義が 4 つになり、b の条件はいつも偽になって、どの色も {0, 0, 0, 0} になります。
  • エb は合っていますが、一覧に未定義の値を足すので、colors[j] と等しい名前が一覧に無く、どの色も全部 0 になります。

仕組み

One-⁠Hot 表現は、文字の分類を数の並びに直す方法です。機械学習で、色や地域のような種類のデータを計算に使える形にするときによく使います。

j が「今どの色を変換しているか」、k が「一覧の何番目と比べているか」を表します。2 重の繰返しでは、それぞれの変数が何を指すかを先に言葉にすると、空欄が埋めやすくなります。

この問に出る言葉