ふたくちおとこ

クチート大好きな私が、主にポケモンやボドゲに関して書くブログ

SSD + Keras でクチート認識するぞ。モデル作成編

みなさまこんにちは。さっちんです。

最近PokemonGOを再開しました。リリース後1ヶ月位しか遊んでいなかったのでクチートを捕まえていませんでしたが、最近はレイドバトルばかりを探してクチートをお出迎えしています。

さて、今回は画像認識のお話です。前回の記事で、ポケモンの選出画面を画像認識することでパーティーを簡単に登録できるようにする試みがあることをご紹介しました。 これを実現するためには、画像のどの箇所にどのポケモンが写っているかを判定する必要があります。

私もパーティー記録ツールを作りたいなと思っていましたので、勉強のため、まずクチートを認識するモデルを作ってみようと決心しました。以下で、モデル構築までの手順を記載していこうと思います。

下記に今回の記事で説明するコードを置いていますので、適宜参照してください。 github.com

利用する手法

リアルタイムに物体検出したかったので、SSD(Single Shot Multibox Detector)を利用しました。 以下のgithubレポジトリが広く使われていたので、私も下記を利用しました。

github.com

手順

手順は以下になります。

データの準備

まずは画像を用意します。「ワシのクチート画像は百八式まであるぞ」ということで、 秘蔵のクチート画像フォルダから108枚の画像を選出してきました。

まずは、画像のどこにクチートが写っているのかという教師データを作成する必要があります。 今回、以下のサイトを参考にさせて頂き、AnnotationTool.exeを利用しました。 このツールを利用して、108枚すべての画像に手作業で丁寧にアノテーションしていきます。 すると、108個のxmlファイルが生成されます。

arkouji.cocolog-nifty.com

次に、画像のData Augmentationで画像を増やしていきます。 image_augmentation.ipynb が、Data Augmentationを実施しているコードになります。 ガウシアンノイズやソルトペッパーノイズを付与したり、画像を白黒化したりして、 1つの画像から6枚の画像を生成しています。これにより、108枚の画像が756枚になりました。

最後に、xmlファイルをonehot表現に変換して、pickle形式で出力します。 create_mawile_pkl.py の中にある _to_one_hot(self, name) で判定したいクラスを定義しているので、ここを編集します。 (今回は、44行目に書かれていたaeroplaneという文字列を、アノテーションで付与したラベルと同じ文字列 kucheat に変更しました。)

以上で、データの準備は完了です。

コーディング

詳しい説明は上記の参考資料を参照してください。下記のソースコード群が学習に利用しているソースコードになります。

training.ipynb
ssd.py
ssd_layers.py
ssd_training.py
ssd_utils.py
kucheat_training.py

training.ipynb を実行すると、学習が始まります。 特にカスタマイズしていないPCだと、かなり時間がかかりますので、下記にAWSを利用する方法を記載します。

クラウドで学習環境を構築する

お安くするため、スポットインスタンスを活用した構築方法を記載します。 (最近、Amazon SageMakerという便利なサービスが登場したので、そちらを利用しても良いかもしれません。)

インスタンスの作成

まず、EC2インスタンスを作成して、SSHで接続します。

  • ステップ1
    • AMI:AmazonLinux2を選択
  • ステップ2
    • GPU コンピューティング: p2.xlargeを選択
  • ステップ3: インスタンスの詳細の設定
    • スポットインスタンスのリクエストにチェックを入れる
    • 最大価格の設定
      • 現在の価格という欄が現れて、ap-northeast-1a:$0.4626といった情報が表形式で表示される
      • この表示価格より高い金額を設定する
        • 上記の場合、0.5だとエラーとなり、0.6でうまく作成できたので、ギリギリを攻めすぎるとダメかも
  • セキュリティグループの8000を許可
  • 作成されたインスタンスのグローバルアドレスにSSHする

環境の構築

下記のコマンドを実行していきます。

[ec2-user@ip-x-x-x-X ~]$ sudo yum -y upgrade
[ec2-user@ip-x-x-x-X ~]$ sudo yum -y install git tmux emacs gcc gcc-c++ python-setuptools python-devel 
[ec2-user@ip-x-x-x-X ~]$ sudo git clone https://github.com/yyuu/pyenv.git /usr/bin/.pyenv
[ec2-user@ip-x-x-x-X ~]$ cd /usr/bin/.pyenv
[ec2-user@ip-x-x-x-X ~]$ sudo mkdir shims
[ec2-user@ip-x-x-x-X ~]$ sudo mkdir versions
[ec2-user@ip-x-x-x-X ~]$ sudo chown -R ec2-user:ec2-user /usr/bin/.pyenv
[ec2-user@ip-x-x-x-X ~]$ vi ~/.bashrc

# 下記を末尾に追記
# from
export PYENV_ROOT="/usr/bin/.pyenv"
if [ -d "${PYENV_ROOT}" ]; then
export PATH=${PYENV_ROOT}/bin:$PATH
eval "$(pyenv init -)"
fi
# to

[ec2-user@ip-x-x-x-X ~]$ source ~/.bashrc
[ec2-user@ip-x-x-x-X ~]$ pyenv install --list

ここまで実行して、ズラッと一覧が表示されればOKです。 上記の一覧からanacondaの最新バージョンを確認します。私の場合は3-5.2.0 が最新だったので、それをインストールします。

[ec2-user@ip-x-x-x-X ~]$ pyenv install anaconda3-5.2.0
[ec2-user@ip-x-x-x-X ~]$ pyenv global anaconda3-5.2.0
[ec2-user@ip-x-x-x-X ~]$ python --version

ここで、Python 3.6.5 :: Anaconda, Inc. と表示されていればOKです。 残りのライブラリをインストールしていきます。

[ec2-user@ip-x-x-x-X ~]$ conda install keras
[ec2-user@ip-x-x-x-X ~]$ conda install tensorflow
[ec2-user@ip-x-x-x-X ~]$ conda install -c conda-forge jupyterhub
[ec2-user@ip-x-x-x-X ~]$ cd /home/ec2-user/
[ec2-user@ip-x-x-x-X ~]$ mkdir jupyterhub
[ec2-user@ip-x-x-x-X ~]$ cd jupyterhub/
[ec2-user@ip-x-x-x-X ~]$ jupyterhub --generate-config
Writing default config to: jupyterhub_config.py
[ec2-user@ip-x-x-x-X ~]$  vi jupyterhub_config.py
# 下記を書き換える
#c.Spawner.notebook_dir = ''"
c.Spawner.notebook_dir = '~/notebook'

[ec2-user@ip-x-x-x-X ~]$ sudo passwd ec2-user
[ec2-user@ip-x-x-x-X ~]$ sudo reboot

再起動するまで待ち、再びSSHします。

[ec2-user@ip-x-x-x-X ~]$ jupyterhub -f /etc/jupyterhub/jupyterhub_config.py &

これでJupyteが動きます。インスタンスIPアドレス:8000にWebブラウザからアクセスするとjupyterhubのログイン画面が表示されます。 ec2-userでログイン(パスワードは上記で設定したもの)できたらOKです。

レーニングの実行

まずはソースコードをダウンロードします。

[ec2-user@ip-x-x-x-X ~]$ git clone https://github.com/sacchin/mawile_ssd_keras.git
[ec2-user@ip-x-x-x-X ~]$ cd mawile_ssd_keras/
[ec2-user@ip-x-x-x-X ~]$ git checkout add_training_code

用意した画像とxmlファイルをzipファイルにまとめて送信します。

[ec2-user@ip-x-x-x-X ~]$ mv /home/ec2-user/images.zip /home/ec2-user/mawile_ssd_keras/data
[ec2-user@ip-x-x-x-X ~]$ cd /home/ec2-user/mawile_ssd_keras/data
[ec2-user@ip-x-x-x-X ~]$ rm images/ -r
[ec2-user@ip-x-x-x-X ~]$ unzip images.zip

再びjupyterhubにログインして、kucheat_training.py を開きます。 下記を任意の値に編集します。

* 211行目: batch_size = 10
* 260行目: nb_epoch = 50
* 269行目: nb_worker = 1

その後、jupyterにある training.ipynb を開きます。 2行目までを実行すると学習が始まります。 最終結果が /home/ec2-user/mawile_ssd_keras/data/weights に、途中の結果が /home/ec2-user/mawile_ssd_keras/data/checkpoints に格納されたら成功です。

画像の判定

jupyterにある、 predictor.py を開きます。 こちらも9行目までを実行すると、画像を認識します。

f:id:sacchin13:20181101172724p:plain

学習の画像を増やしていくと、この判定の精度が向上していきます。

まとめ

今回は、SSD + Keras でクチートの画像認識するモデルを学習する流れを説明しました。 バッチサイズを10で実行すると、1つのEpochが30分くらいました。数百円くらいの出費でした。 この辺のノウハウが無くて、もっと早く安くする方法あるのか分かっていないので、誰か教えて頂けると嬉しいです!

p.s. Let's Go ピカチュウ予約しました。オリジナルコースターを貰うため、ノジマオンラインを選んでおります。

ポケモンデータ分析学会できるのでは?

みなさんこんにちは。さっちんです。

最近はダンジョンメーカーに手を出してしまい、非常に時間を盗まれております。 ポケモンが好きな人は多分ハマると思いますので、ぜひともオススメします。

さて、今回はポケモンに関する分析記事を集めてみました。 私自身も分析するのですが、下記にもある@poke_odanさんの記事を見つけて、「同士が多いのでは?!」と思ったのがきっかけです。 みんなどんどん分析して学会開きましょう。温泉街とかで。

ということで時間順に並べてみました。

2016/12/23

haripo.com

LDAトピックモデルの「文書」と「単語」の関係性を「ポケモン」と「技」に置き換えて分析しています。 ポケモンが覚える技リストをデータセットとしてモデルを作ることで、技のタイプが強く関連しているトピックや爪や剣のような特徴を捉えたトピックなどを発見しています。 「文書」と「単語」の関係性を「ポケモン」と「技」に置き換えたところがミソだと感じました!

2017/03/04

qiita.com

ポケモン対戦のログを取るために、画像処理をしたという記事です。 対戦中に相手のパーティを見返すために写メを撮るのは、レート対戦したことがある人は覚えがあるでしょう。 この写メを収集することでどんなパーティが流行っているのか分かるので、助かる人も多いと思います。

この研究分野?は非常に課題意識があり、多く人が研究していました。 私も興味ある分野なので、次やるとしたここかなぁ。

2017/09/26

sacchin13.hatenablog.com

私の過去記事です。かえんほうしゃ - ほのお + みず = ハイドロポンプ を実現させたいというモチベーションのみでやりました。 一部、特徴を捉えてベクトル化できていたので満足しています。(もうちょっとデータセットをキレイにしても良かったとは思っていますが…。)

2017/12/10

rautaku.hatenablog.com

ポケモンAとBが戦ってどちらが勝つか?を予測した記事になります。 種族値の差やタイプ相性など、どの因子が勝率に貢献しているのかを見ています。

ランダムフォレストが一番精度良くなったそうで、素早さ種族値が一番勝率に貢献しているようです。 データからみても、やはり素早さは重要のようですね。

2018/03/26

qiita.com

こちらも非常に面白いアイデアでした。 あるポケモンの画像を与えたときに、勾配ブースティング決定木を利用してそのポケモン種族値を予測しています。 結果は芳しくなかったようですが、画像からタイプを予測するなど、いろいろ流用できそうな気がしました。

2018/04/08

odanpoyo.github.io

私の過去記事は技に注目していましたが、こちらはパーティに注目してword2vecを活用した記事でした。 Pokémon Showdown(オンライン上のポケモン対戦シミュレータ)から対戦に使われたパーティを抽出して、ポケモンの役割をベクトル化するという試みでした。対戦経験者も納得するような結果が得られています。

コメント欄の議論も良く、「水タイプ+地面タイプ+鋼タイプ+メガシンカポケモン+残り2匹でパーティーが構成されている」のような解釈がされたりしていました。

2018/06/26

www.hands-lab.com

種族値からタイプを予測するという問題を、ロジスティック回帰で取り組んだ記事でした。 87%の精度で判定することができたということで、種族値からタイプを予測できるんだという新たな発見がありました。 ポケモン自体の知識が必要という考察も非常に共感しました。

まとめ

今回はポケモンのデータ分析に関する記事を一覧化しました。 ちょっと探しただけでこれだけ見つかったので、まだまだ多くの方が分析していると思います。 定期的にサーベイしているので、また集まったら公開したいですね。

p.s. 百ポケ夜行のクチート可愛すぎて、めっちゃグッズ買ってしまった。

ポケモンのデータセットを公開しました。

みなさんこんにちは。さっちんです。

最近はモンスターハンターワールドやっていました。初めてのモンハンでしたが、めちゃくちゃ良かったです。シリーズで数千時間やる人がいるのも頷けます。

さて、今回は第7世代までのポケモンのデータを分析に使いやすい形に整形しました。下記のレポジトリで公開していますので、必要な方はどうぞ。

github.com

[2018/5/08 追記] Kaggleに投稿しました。

Pokemon with stats. Generation 7 | Kaggle

データ定義

列名 詳細
No 図鑑番号です。
Japanese 日本語名です。
English 英語名です。
German ドイツ語名です。
French フランス語名です。
Korean 韓国語名です。
Simplified Chinese 中国語の簡体字での名前です。
Traditional Chinese 中国語の繁体字での名前です。
Generation 初登場した世代です。
Form フォルムチェンジ、メガシンカゲンシカイキなどの名前です。
H HPの種族値です。
A 物理攻撃の種族値です。
B 物理防御の種族値です。
C 特殊攻撃の種族値です。
D 特殊防御の種族値です。
S すばやさの種族値です。
Ability1 1つ目の特性です。
Ability2 2つ目の特性です。
Ability3 隠れ(夢)特性です。
Type1 1つ目のタイプです。
Type2 2つ目のタイプです。
Weight 体重です。
Evolve Flag 最終進化系である場合1を、そうでない場合0を割り当てています。

利用例

下記のように、いくつかお試しで分析して見ました。参考にして頂ければ幸いです。

まとめ

簡単になりましたが、分析しやすいポケモンのデータセットとお試し分析について記載しました。 暇を見つけてKaggleにもあげたいと思います。

p.s. Switch版のポケモンの期待が高まる…。

ビビリS+が実践している、ガチアサリで勝てるようになる方法

みなさんこんにちは、さっちんです。

年末も近いですが、まだまだスプラトゥーンを楽しみたいと思ってる今日この頃です。さて、今回はスプラトゥーン2の201712月時点のガチアサリの基本的な戦略について書いていこうと思います。

私自身が敗北を極力減らすことで勝率を上げるタイプなので、消極的な戦略と感じる方も多いと思います。また、ガチパワーが1800~1900で実践している戦略なので、それ以外では通用しないかもしれないということを前置きとさせて頂きます。

(ちなみに今は、A帯1800~1900, A-帯1700~1800, C帯1300くらいの感じです。)

全ルール共通の考え方

まず、FPSでよく言われる「オブジェクトに絡む行動」が防衛につながります。 ガチエリアであればエリア(床)、ガチヤグラであればヤグラ、ガチホコであればホコ、ガチアサリであればアサリとゴールがオブジェクトです。 スプラトゥーンにおける「オブジェクトに絡む行動」とは、

  • これらを塗る
  • これらのカウントを進める
  • これらをキープする
  • 相手からこれらを奪う

ことだと考えてください。 裏取りを嫌う人がいるのは、裏取りをするとオブジェクトに絡む行動ができなくなるためです。 (私もあまり裏取りしない派です。)

ガチアサリ

まずは、逆転負けを減らす

今日までプレイしていて一番気になったのは、逆転で勝敗が決まることが多いことです。 勝つにせよ負けるにせよ、逆転の発生する率が他のルールよりも非常に多いです。 これは、防衛方法が確立されていないことが原因だと思われます。

他のルールであれば、ゲームの終了間際に優位チームが負けないためにする行動が概ね固まってきています。

  • ガチエリア
    • エリアと相手チームのリスポーン地点の間まで前線を進めて、そもそも相手をエリアに到達させないように戦う
  • ガチヤグラ
    • 相手がヤグラから降りざるを得ない状況を作り、その間にヤグラを奪う。例えば、ボムをヤグラに載せる、ハイパープレッサー、マルチミサイル、スーパーチャクチ、イカスフィアを使うなど
  • ガチホコ
    • ホコを持って自陣に引きこもる

しかし、現時点のガチアサリにおいて、終了間近にこれをすればゲームを終わらせることができるという行動が確立されていません。 これにより、逆転という状況が生まれやすくなっていると思います。

私が実践している方法としては、

  • 相手のガチアサリ持ちを倒す
    • 倒した後に、そのガチアサリが消滅するのを見守るまでが大事です
  • フィールド上のアサリを専有する
    • アサリ拾い、自チームのガチアサリを作り、自陣に投げる。またアサリを拾って…を繰り替えすことで専有できます

これらを実施することで、逆転されることが少なくなります。

相手の「追いアサリ」を止める

ガチアサリでバリアを破った後に、アサリを投げ入れることを「追いアサリ」と個人的に呼んでいます。 この追いアサリこそ、ガチアサリで最も注意するべき行動です。

破ったバリアは一定時間経過すると復活しますが、「追いアサリ」をされると、その時間が延長されます。 一度バリアを破られた後、何度も「追いアサリ」をされて、そのまま負ける…。ということを、みなさんも経験したことがあると思います。

ガチアサリを止めるのも大事ですが、この「追いアサリ」がなくなるまでバリアを守り続けることが重要です。

自陣のアサリは回収する

当たり前のように思う方もいると思いますが、非常に重要なことです。 自陣にアサリが残っていると、以下のようなリスクが発生します。

  • ゴール近くで相手がガチアサリを作ることができる
  • 追いアサリの数が飛躍的に増える

アサリを2つしか持っていない敵に、アサリを4つ以上持っている味方が倒され、落とした4つと自然湧きした4つを拾われ、そのままシュートとなる場面すら発生してしまいます。

このようなことにならないように、自陣のアサリはできるだけ拾いましょう。

まとめ

今回は、現時点で私が考えるガチアサリの勝ち方をご紹介しました。 ガチホコが初登場したときも、ガチヤグラに比べて非常に戦略を求められるルールが来たなぁと思っていましたが、 まさか、それを遥かに上回るガチアサリというルールが登場するとは…。驚きましたが、非常に研究しがいのあるルールだなと感じています。

以上、Splatoon Advent Calendar 2017の23日目の記事でした。

adventar.org

p.s. パブロがガチアサリに適正あることは間違いないですが、ただ使うだけでは勝てないのでご注意を。

甘党が考える、コーヒーと最高に相性が良いお菓子

みなさんこんにちは。さっちんです。

みなさん、コーヒーはお好きでしょうか?インスタント派、缶コーヒー派、スタバ派、自宅で豆挽いて淹れる派など多くの流派があるように、コーヒーを飲む方は多いと思います。かくなる私も、自宅で豆挽いて淹れる派のコーヒー党です。今日は、そんな自宅で豆挽いて淹れる派向けに美味しいお菓子を紹介していきましょう。

コーヒーのお供としてのお菓子

多くの場合、お菓子が主役でそれに合わせてコーヒーが選ばれます。例えば、「コース料理のデザートにケーキを食べるからコーヒーにしようかな…」というのがそれです。しかし、「このコーヒーを飲みたいから、このお菓子を用意しよう。」というコーヒー主役の選び方もあるでしょう。そこで、私が日頃「このコーヒーのお供にはこのお菓子を食べる!」と考えていることをご紹介します。

(※コーヒーはブラックで飲むことを前提としています。)

あっさり酸味があるコーヒを飲む時

あっさり酸味がある豆のコーヒーの場合、甘みが強いお菓子が良いです。

Lotus

まずは、コーヒーのお供で有名なLotusです。

カルディコーヒーファームなどで売っているため比較的手に入れやすく、個別包装されてるのもGood。 硬めのビスケットがホロホロ崩れる感じの食感です。

MOOMLIGHT

次に、森永のMOOMLIGHTです。

森永製菓 ムーンライト14枚×5箱

森永製菓 ムーンライト14枚×5箱

スーパーやコンビニで売ってるので、いつでも手に入ります。 王道のバタークッキーという感じで、甘みが強く、あっさりコーヒーと良く合います。 机の上に常備しておきたいものです。

極細Pocky

最後は、グリコの極細Pockyです。普通のPockyではダメです。

これもスーパーやコンビニで売ってるので、いつでも手に入ります。 普通のPockyがダメと言うのは冗談ですが、極細Pockyのほうが1本あたりが少量なので食べやすく、コーヒーが良く進みます。 また手が汚れないので、PC作業中のコーヒーのお供としても優秀です。

コクあり苦味があるコーヒーを飲む時

コクあり苦味がある豆のコーヒーの場合、甘み控えめのお菓子が良いです。

MARIE

またしても森永のビスケットです。

森永製菓 マリー21枚×5箱

森永製菓 マリー21枚×5箱

こちらはMOONLIGHTに比べて甘さ控え目であるため、そのまま食べると甘党には物足りなく感じます。 しかし!濃いコーヒーを飲んだ後に食べると甘さが際立ち、お口もリセットされるためコーヒーが進み、またビスケットを食べ…と良い感じのループになります。1箱に入っている枚数が多いのも良し。

MAUNALOA

最後はマカダミアナッツの塩味です。

基本的にコーヒーのお供には甘いものを選ぶのですが、このナッツは例外です。 コーヒーに合うしょっぱさを持ったお菓子は珍しいので、一度は食べてみることをオススメします!

まとめ

今日は、コーヒーを主役としたときに、どのようなお菓子を選ぶかをご紹介しました。 コーヒーのお供を真剣に考えることで、コーヒーをより楽しめるようになると思いますので、色々試していきましょう!

以上、8日目の記事でした。 adventar.org

p.s. 普段はポケモンの記事を書いているので、クチート好きな方は是非に~。

かえんほうしゃ - ほのお + みず = ハイドロポンプになるか?

みなさんこんにちは。さっちんです。

ポケモンに関する文章を使ってword2vecをやってみたので、今回はその結果をお見せしたいと思います。 ソースコードと学習データは以下に置いています。 github.com

最近の流行?!、「単語と単語での計算」

タイトルを見て興味を持った方は、word2vecってなんだ???となると思いますので、簡単にご説明します。 最近、AIや人工知能という単語がニュースなどで取り上げられるように、IT業界ではAIや人工知能が非常にホットな話題となっています。 その文脈の中で、文章も人工知能で分析してやるぜ!という試みが流行しており、word2vecはその中の一つの手法です。

word2vecのイメージを具体的にするために、非常に有名な例を挙げたいと思います。 それは…

王様 - 男 + 女 = 女王様

です。

つまり、文章で「王様は男性における地位の名称ですが、王様と同様の意味を持つ女性における地位の名称は何でしょうか?」と表現される質問を計算式で表したものになります。このように、「単語同士で計算ができるようになったら、人工知能に文章を理解させる手助けになるんじゃね?」という発想で生まれた手法です。

ポケモンでword2vecしたい

難しい話はこのくらいにして、本題に移りたいと思います。 単語同士が計算できるとなると、ポケモン好きな皆様におかれましてはポケモン用語でもやってみたいと思うのではないでしょうか? それが今回のタイトルである「かえんほうしゃ - ほのお + みず = ハイドロポンプになるのか?」に帰着するわけです。

そこで今回は、ポケモンWiki*1ポケモン対戦考察まとめWiki*2の記事を学習させてみました。それでは結果を見ていきましょう。

単語自体の計算結果

まずは単語そのものを見ていきましょう。指定した単語と関連の強い単語のトップ10が表示されます。 横にある数値は関連度になります。

さっそく、我らがメガクチートを計算してみましょう。

calc("メガクチート")

  1. バンギラス 0.9744253754615784
  2. テッカグヤ 0.9737641215324402
  3. 一      0.9579521417617798
  4. メガギャラドス 0.9565474987030029
  5. 喰らう     0.9561516046524048
  6. カイリュー   0.9555752277374268
  7. マンムー    0.9530206918716431
  8. 舞       0.9496548175811768
  9. メガハッサム  0.949008584022522
  10. てる      0.9439014792442322

クチート一緒にパーティへ入ることの多いカイリューマンムーがトップ10に入っています。 舞は「つるぎのまい」のことですね。


続いてパーティの名称である雨パを計算しました。

calc("雨パ")

  1. 独自 0.9668172597885132
  2. ペリッパー 0.9622671604156494
  3. 個性 0.9604281783103943
  4. 化す 0.9601962566375732
  5. 充実 0.9588289260864258
  6. 使い 0.9584391117095947
  7. あめふらし 0.9568397998809814
  8. あくタイプ 0.9563978314399719
  9. 多芸 0.9530139565467834
  10. 無類 0.9518377184867859

7世代で雨パで採用されることが多いペリッパーや、雨パに欠かせない特性のあめふらしが入っていますね。


続いてタイプのフェアリーを計算。

calc("フェアリー")

  1. 倍 0.9322121143341064
  2. 一貫性 0.922793984413147
  3. 格闘 0.9219501614570618
  4. ゴースト 0.9165294170379639
  5. 相性補完 0.9136119484901428
  6. ドラゴンタイプ 0.9095576405525208
  7. 地面 0.9079031944274902
  8. 4倍弱点 0.9013127088546753
  9. 4倍 0.8987537622451782
  10. 強い 0.8973758220672607

フェアリーに弱点を突かれる格闘やドラゴンという単語が入っています。 4倍弱点はサザンドラやジャララガン、ズルズキンゴロンダあたりの記事が効いてるのでしょうか?


次は性格のおくびょう。

calc("おくびょう")

  1. ひかえめ 0.9599519371986389
  2. CS 0.9132525324821472
  3. こだわりメガネ 0.9035917520523071
  4. 基 0.8862846493721008
  5. 冷静 0.8780158758163452
  6. 性格 0.8219131231307983
  7. せっかち 0.8143517374992371
  8. 努力値 0.8130760192871094
  9. ハイドロポンプ 0.8049198389053345
  10. ムーンフォース 0.8013639450073242

これは素晴らしいですね。おくびょうと同じように特殊アタッカーに採用されるひかえめ、冷静がランクインしています。 また、努力値の振り方であるCSという単語や持ち物であるこだわりメガネも入っています。


calc("きあいのタスキ")

  1. カムラ 0.9162214398384094
  2. 持ち物 0.8896895051002502
  3. ラム 0.8842946290969849
  4. 蜻蛉返り 0.8831953406333923
  5. クリスタル 0.8821411728858948
  6. 優先 0.8816790580749512
  7. ジュエル 0.8660957217216492
  8. 選択 0.8502988219261169
  9. がんせきふうじ 0.8499913811683655
  10. なげつける 0.8491314649581909

きあいのタスキだと、同じ持ち物であるカムラのみやラムのみ、Zクリスタル、ジュエルが関連の強い単語として挙げられています。 とんぼがえりはタスキ潰しによく使われるからでしょうか?


さて、それでは技を見ていきたいと思います。

calc("じしん")

  1. ストーンエッジ 0.9791466593742371
  2. ぢ 0.9695087671279907
  3. いわなだれ 0.9539787173271179
  4. れいとうパンチ 0.9350066184997559
  5. すてみタックル 0.9336516261100769
  6. かみくだく 0.9321756958961487
  7. アームハンマー 0.9284919500350952
  8. アイアンヘッド 0.9270839095115662
  9. かみなりパンチ 0.9270591139793396
  10. どくづく 0.9257274270057678

じしんを計算すると、物理技ばかりが列挙されました。 また、じしんと同時に採用されやすいストーンエッジいわなだれが上位に入っています。


最後にかえんほうしゃを見たいと思います。

calc("かえんほうしゃ")

  1. あくのはどう 0.9866007566452026
  2. れいとうビーム 0.9813727140426636
  3. りゅうのはどう 0.978251576423645
  4. なみのり 0.9763879776000977
  5. だいもんじ 0.9738233685493469
  6. ラスターカノン 0.9735146760940552
  7. ソーラービーム 0.9731917977333069
  8. きあいだま 0.973129391670227
  9. かみなり 0.9693619012832642
  10. だいちのちから 0.9692765474319458

こちらは完全に特殊技ばかりが並んでいます。これは期待が膨らみますね。

単語と単語の計算結果

では、かえんほうしゃ - ほのお + みず を計算してみましょう。

calc("かえんほうしゃ-ほのお+みず")

  1. 特殊技 0.9034083485603333
  2. はどうだん 0.8909361958503723
  3. サブ 0.8858975172042847
  4. りゅうのはどう 0.8845259547233582
  5. ふぶき 0.8783226013183594
  6. ハイドロポンプ 0.8712683916091919
  7. 電 0.8656661510467529
  8. だいもんじ 0.8648360371589661
  9. 軸 0.8628724813461304
  10. メイン 0.8532931804656982

・・・やりました。かえんほうしゃからほのおタイプを引いてみずタイプを足すと、ちゃんとハイドロポンプになります。 (※それ以外の技が上位に来ているのは気のせいです。) せっかくなので、他の計算もしてみましょう。


calc("ぜったいれいど-氷+地")

  1. 地割れ 0.9815039038658142
  2. とんぼがえり 0.976150631904602
  3. あやしいひかり 0.967402458190918
  4. ちから 0.9479234218597412
  5. ドリル 0.9468713998794556
  6. じこさいせい 0.9343216419219971
  7. 叩き台 0.9340541958808899
  8. あまごい 0.9317256212234497
  9. きゅうけつ 0.9308851361274719
  10. パンチ 0.9303572773933411

これまたすごい結果になりました。ぜったいれいどから氷タイプを引いて地面タイプを足すと、ちゃんと地割れになります。


次は、ポケモンのタイプを引いたり足したりしてみましょう。

calc("リザードン-ほのお+みず")

  1. すべて 0.9639962911605835
  2. 近く 0.9628123641014099
  3. ソルガレオ 0.9590645432472229
  4. ざら 0.9563183784484863
  5. ボスゴドラ 0.949439525604248
  6. 一般 0.9466379284858704
  7. 本来 0.9451665878295898
  8. ケース 0.9429201483726501
  9. 呼称 0.9397175312042236
  10. おろか 0.938876211643219

このように、リザードンからほのおタイプを引いてみずタイプを足すと、ちゃんと御三家のカメックスに…、 ソルガレオになるそうです。


アローラの守り神でみんなのアイドルでもあるカプ・テテフちゃんも、エスパータイプを引いてでんきタイプを足すと、しっかりカプ・コケコに…、

calc("カプ・テテフ-エスパー+でんき")

  1. てる 0.9460397362709045
  2. テッカグヤ 0.9357684850692749
  3. 勝てる 0.9340535402297974
  4. 取れる 0.9280171990394592
  5. ヒードラン 0.9266940951347351
  6. 切る 0.9233332276344299
  7. ボーマンダ 0.9210865497589111
  8. ギルガルド 0.9198833703994751
  9. 処理 0.9168146848678589
  10. 読みで 0.9078798890113831

UBのテッカグヤになるそうです。


最後は気持ちよく終わりましょう。クチートにメガストーンを加えると…

calc("クチート+メガストーン")

  1. 飛ぶ 0.9863591194152832
  2. 違える 0.9835994243621826
  3. 小さい 0.9808191657066345
  4. 上書き 0.9792056083679199
  5. 伴う 0.9779235124588013
  6. 裏 0.9774397015571594
  7. 返す 0.9748541116714478
  8. 見せる 0.9745727777481079
  9. 針 0.9743210077285767
  10. バグ 0.9740380048751831

はい。飛び立つそうです。

計算結果の考察

みなさん、お気づきだとは思いますが、今回の精度はいまいちな結果となってしまいました。 実は上記の結果は、100ケース以上の計算をして、見栄えの良いものを並べたものです。 10まんボルトから電気を引いて炎を足してもかえんほうしゃにはなりませんでした。

今回のケースでは、学習データに難アリという印象です。 Wikiという媒体の性質上、言葉のゆらぎがあり、略語(トリックルームパーティーがトリパとなっている)も多用されて非常にデータ加工が困難でした。 また素直に処理をすると、オボンのみが「お盆」と「のみ」に分割されてしまい、固有名詞も拾えませんでした。 かなり丁寧に言葉のゆらぎを直し、略語を正式な単語に復元し、技や持ち物の名前などの固有名詞が残るように手作業で加工したのですが、 上記のような精度に落ち着きました。

また、データ量も少なく、高精度に学習できなかったとも感じています。 2つのwikiだけではなく、ポケモンに関するまとめサイトもクローリングして、もっと文章を集めたほうが良かったです。

人工知能も、適切なデータを使い、適切な手順を踏まないと賢くならないという良い例になったと思います。

まとめ

今回は、word2vecを使って「かえんほうしゃ - ほのお + みず = ハイドロポンプ」を計算しました。 たくさんの計算をしましたが、上記くらいしか見栄えのいいものがありませんでした。 とは言え、「かえんほうしゃ - ほのお + みず」を計算した結果の中にハイドロポンプを見つけたときは、めちゃめちゃ嬉しかったです。 また、技に関しては精度がよく、物理技と特殊技はしっかり見分けられるようです。 きれいに加工されたもっと大量のデータを利用することで、まだまだ賢くなるなと思いました。

p.s. メガクチート - メガストーン = マグカルゴになるそうです。なんでや…。

クチートの性格の選び方について

みなさんこんにちは。さっちんです。

今回はクチート努力値配分について書いていきたいと思います。

昔とある記事で、「いじっぱり」のS振りと「ようき」のA振りでは、ステータスの実数値に差が出ると見たことがありました。 それまでは「いじっぱり」のクチートばかり育成していたのですが、場合によっては「ようき」もありなんじゃ?と考えるようになり、もやもやするようになりました。

そこで今回は、網羅的にステータスを計算することで、性格を選択する指針にしたいなと考えています。

前提

細かい話になりますが、前提を書いていきます。

  • シングル向け
  • 個体値は6V
  • H252, C0は固定*1
  • 性格は、いじっぱり、ようき、わんぱく、しんちょうの4つ
  • ステータス実数値はメガクチートもの
  • 努力値の一覧は前回の記事で生成したものを利用

sacchin13.hatenablog.com

ステータスの計算結果はGoogleSpreadsheetsにまとめました。 https://docs.google.com/spreadsheets/d/1TX2p3nLwo3bei823fiM3xuiDtgRsu8yAMHPFiIUojVI/edit?usp=sharing

ここからデータを抜粋しつつ、S調整・耐久調整の2つの観点で見ていきます。

Sを調整する場合の性格の選び方

「いじっぱり」と「ようき」をどう選択すればいいか、「S考察」シートから1行を抜き出して見ていきます。

仮想敵実数値 クチートS実数値 S努力値 A努力値 A実数値 実数値合計 S努力値 A努力値 A実数値 実数値合計
77 78 60 196 165 243 4 252 157 235

表の詳しい見方は下記に記載します。*2

すばやさの実数値を78にしたい場合、6列目と10列目の差が「いじっぱり」と「ようき」のステータスの差(243-235=8)になります。 つまり、すばやさの実数値を78にしたい場合は「いじっぱり」を選択したほうが、全体のステータスが高くなるということになります。

それでは「S考察」シートに戻り全体を見ていきます。 結論としては、すばやさ実数値103以上を求める場合は「ようき」が必須となり、それ以外は「いじっぱり」を選択した方が良いということになりました。 80族無振り~84振りに先手を取りたい場合にのみ、「ようき」を選択するようにしましょう。

物理耐久を調整する場合の性格の選び方

「いじっぱり」と「わんぱく」をどう選択すればいいか、「B考察」シートから1行を抜き出して見ていきます。

クチートB実数値 B努力値 A努力値 A実数値 実数値合計 B努力値 A努力値 A実数値 実数値合計
160 116 140 157 317 4 252 157 317

表の見方はすばやさと同じく下記に記載します。*3

ぼうぎょの実数値を160にしたい場合、5列目と9列目の差が「いじっぱり」と「わんぱく」のステータスの差(317-317=0)になります。 この場合は「いじっぱり」と「わんぱく」のどちらを選んでも一緒のステータスになるということになります。

それでは「B考察」シートに戻り全体を見ていきます。 結論としては、B実数値178以上を得るためには「わんぱく」が必須となります。 B実数値165-177では、「わんぱく」のほうが僅かにステータスの合計が高くなります。 B実数値159以下は「いじっぱり」が推奨です。

特殊耐久を調整する場合の性格の選び方

「いじっぱり」と「しんちょう」をどう選択すればいいか、「D考察」シートから1行を抜き出して見ていきます。

クチートD実数値 D努力値 A努力値 A実数値 実数値合計 D努力値 A努力値 A実数値 実数値合計
147 252 4 138 285 148 108 139 286

表の見方は、物理耐久とまったく同じです。

とくしゅぼうぎょの実数値を147にしたい場合、5列目と9列目の差が「いじっぱり」と「しんちょう」のステータスの差(138-139=-1)になります。 この場合は「しんちょう」を選択したほうが、全体のステータスが高くなるということになります。 (※たった1だけですが…)

それでは「D考察」シートに戻り全体を見ていきます。 結論としては、D実数値148以上を得るためには「しんちょう」が必須となります。 D実数値145-148では、「しんちょう」のほうが1だけステータスの合計が高くなります。 D実数値141以下は「いじっぱり」が推奨です。

まとめ

今回は性格の違いでどれだけステータスに差が出るかを検証しました。 検証の結果、「ようき」や「わんぱく」「しんちょう」を選択する基準が明確になりました。 カプ・テテフやカプ・コケコと対面した時の選択肢を増やすため、 最近は耐久に振ることが多いと思いますので、ご参考になれば幸いです。

p.s. かわいさを求めて性格を選ぶときは、「きまぐれ」がいいと思います!

*1:第6世代の構築記事では、ほとんどがHA全振りという状況でした。そのため、H252を基本にS振りや耐久調整などを考えていきます。

*2:仮想敵のすばやさ実数値77(1列目)に対して、クチートが先手を取るためのすばやさ実数値78(2列目)があり、性格が「いじっぱり」の場合に必要な努力値60(3列目)を記載しています。 余った努力値196(4列目)をこうげきに振った場合のこうげき実数値165(5列目)があり、すばやさ実数値とこうげき実数値の合計243(6列目)を記載しています。 続いて、性格が「ようき」の場合の必要な努力値4(7列目)、こうげきに振る努力値252(8列目)、こうげき実数値157(9列目)、すばやさ実数値とこうげき実数値の合計235(10列目)を記載しています。

*3:ぼうぎょ実数値160(1列目)、性格が「いじっぱり」の場合に必要な努力値116(2列目)、こうげきに振る努力値140(3列目)、こうげき実数値157(4列目)、ぼうぎょ実数値とこうげき実数値の合計317(5列目)、性格が「わんぱく」の場合の必要な努力値4(6列目)、こうげきに振る努力値252(7列目)、こうげき実数値157(8列目)、ぼうぎょ実数値とこうげき実数値の合計317(9列目)を記載しています。