補完ページ|アキネーターの仕組みと決定木
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):過学習を避けるために木を縮める操作。
参考リンク(外部)
- Akinator 公式(ELOKENCE): jp.akinator.com
- OpenAkinator(C言語): GitHub
- akinator.py(Pythonライブラリ): ドキュメント
- 商標情報(例): Justia
商標には各国での状態差があり得ます。名称利用は十分にご留意ください。
ライセンスと注意
この補完ページは CC BY-SA 4.0 相当での再利用を許諾します(本文・コード部)。Akinator™等の商標・画像は各権利者に帰属します。