概要
皆さん, アキネーターというゲームはご存知でしょうか.
特定の人物を, 質問から当てるゲームです.
やったことある人はわかると思うのですが, 何回かの質問で目的の答えまでたどり着けるのはすごいですよね.
そんなアキネーターなのですが内部のアルゴリズムは秘密となっているそうです.
面白そうなので, 内部のアルゴリズムを妄想し, 実際に組んでみました!!
題材としては, 種類の多くデータのまとまっているポケモンをターゲットにしました.
よければ遊んでやってください
アルゴリズム編と実装編の2つを予定しています.
アルゴリズム編の復習
アルゴリズム編の結果から,
- 質問と実際の解答のデータセット
- ユーザーの回答
の2つがわかれば, 式をこねくり回すことで
- どのポケモンが選ばれるのか
- 次の質問をどれにすればいいのか
の2つが概算できることが示せました.
そのため, 残る課題は
- 式中のハイパーパラメータをどう決めるのか
- 質問と実際の解答のデータセットをどう作るか
が挙げられます
ハイパーパラメーターをどう決めたか
自分の数式の場合では, softmaxの中の$\beta$がハイパーパラメータになります.
実際のユーザーログというのが得られない以上. ヒューリスティックに決め打ちするしかありません.
今回は, 「ユーザーの回答」と「実際の状態」の誤答率が5%くらいになるようにハイパーパラメータを調整しました.
(ユーザーは20回に一回くらい, 間違った答えを入力するだろうと)
この誤答率を高く見積もりすぎると, 特定するまでの質問の回数が多くなります.
逆に誤答率を低く見積もりすぎると, ユーザーが一問でも間違えにると, 必要な質問が急増します.
質問と実際の解答のデータセットをどう作るか
データセットの縦幅としては, 全ポケモン
横幅としては, 全質問になります
そのため, イメージとしては
赤色? | 青色? | 緑色? | 黄色? | … | |
---|---|---|---|---|---|
ヒトカゲ | ○ | ✗ | ✗ | ✗ | |
フシギバナ | ✗ | ✗ | ○ | ✗ | |
ゼニガメ | ✗ | ○ | ✗ | ✗ | |
… |
といった表を作ればいいことになります.
ポケモンは1000匹程度いることを考えると, これを人力で行うのは不可能です.
そのため, ポケモンのデータベースであるpokeAPIを使いました
このapiを叩くことで, ポケモンの必要な情報が得られます.
このapiで得られる情報などから質問を以下のように生成しました
- 種族について
- 性別の偏りについて
- 伝説・幻ポケモンか
- 身長体重について
- 世代について
- タイプやタイプ相性について
- 進化について
- 体色について
- 身体的特徴について
- 名前について
実装について
flutter×pythonなライブラリである, fletで実装を行いました
GUIだけだと2時間ぐらいで, 完成しました.
気軽にサクッとpythonでwebアプリを組みたい方にオススメです!!