2025年9月6日土曜日

🧙‍♂️補完ページ|アキネーターの仕組みと決定木(ジニ不純度・情報利得の可視化)

補完ページ|アキネーターの仕組みと決定木(ジニ不純度・情報利得の可視化)

補完ページ|アキネーターの仕組みと決定木

note本編: 『アキネーターの仕組みと決定木アルゴリズム』へ

このページは学術・教育目的の補助資料です。Akinator™はELOKENCE社の登録商標であり、本ページは非公式・非営利の解説です。

このページでできること

  • ジニ不純度 $G=1-\sum_k p_k^2$ とエントロピー $H=-\sum_k p_k\log_2 p_k$ の式と意味を確認
  • 分割後の加重ジニ・情報利得のインタラクティブ計算
  • 小さなデータで最良の質問(はい/いいえ)を自動提案するミニデモ
  • 擬似コードをJavaScriptの最小実装で確認

数式リファレンス(表示はMathJax)

ジニ不純度

クラス確率 $p_k$ の集合に対して:

$$ G = 1 - \sum_{k=1}^{K} p_k^2 $$

$G=0$ は完全純粋(1クラスのみ)、最大は多クラスが均等なとき。

情報利得(エントロピー基準)

親ノードのエントロピー $H(\text{parent})$ と、分割後の加重エントロピー $\sum_i w_i H(\text{child}_i)$ の差:

$$ IG = H(\text{parent}) - \sum_i w_i H(\text{child}_i),\quad H=-\sum_k p_k\log_2 p_k $$

ジニ/情報利得 計算ツール

2クラス想定(拡張可)。左右の子ノードの件数を入力すると、親分布→ジニ/エントロピー→加重平均→利得を計算します。

左ノード


右ノード


結果

指標

例は本編の説明(アニメ/非アニメ)に合わせた初期値。利得が大きいほど良い質問です。

最良質問サジェスタ(ミニ・アキネーター)

下の小データ(6キャラ×属性)から、はい/いいえで最も分割効果(ジニ減少)が高い質問を提示します。回答するとフィルタされ、次の最良質問を更新します。

名前アニメ?人間?魔法?20世紀登場?

※データは教育目的のフィクション/一般概念です。

擬似コード → JavaScript(最小実装)

最小ループ
// yes/no三値(yes/no/unknown)対応の最小実装
function bestQuestion(rows, attrs){
  // 各属性でジニ減少(親G - 加重子G)を評価
  const parentG = gini(rows.map(r=>r.cls));
  let best = {attr:null, gain:-Infinity, split:null};
  for(const a of attrs){
    const left = rows.filter(r=>r[a]===true);
    const right = rows.filter(r=>r[a]===false);
    if(left.length===0 || right.length===0) continue; // 無効な分割
    const wL = left.length/rows.length, wR = right.length/rows.length;
    const gL = gini(left.map(r=>r.cls));
    const gR = gini(right.map(r=>r.cls));
    const gain = parentG - (wL*gL + wR*gR);
    if(gain > best.gain) best = {attr:a, gain, split:{left,right}};
  }
  return best;
}
ジニ/エントロピー関数
function gini(classes){
  const n = classes.length; const counts = {};
  for(const c of classes) counts[c] = (counts[c]||0) + 1;
  let sumSq = 0; for(const k in counts){ const p = counts[k]/n; sumSq += p*p; }
  return 1 - sumSq;
}
function entropy(classes){
  const n = classes.length; const counts = {};
  for(const c of classes) counts[c] = (counts[c]||0) + 1;
  let h=0; for(const k in counts){ const p = counts[k]/n; h += -p*Math.log2(p); }
  return h;
}

用語ミニ辞典

  • ジニ不純度:ノード内の混ざり具合(0=純粋)。分割の良さは「親ジニ − 加重子ジニ」。
  • 情報利得:エントロピー基準の利得。決定木ではID3/C4.5系で使用。
  • 刈り込み(Pruning):過学習を避けるために木を縮める操作。

ライセンスと注意

この補完ページは CC BY-SA 4.0 相当での再利用を許諾します(本文・コード部)。Akinator™等の商標・画像は各権利者に帰属します。

© 2025 補完ページ / Educational add-on. Not affiliated with ELOKENCE.