SSD + Keras でクチート認識するぞ。モデル作成編
みなさまこんにちは。さっちんです。
最近PokemonGOを再開しました。リリース後1ヶ月位しか遊んでいなかったのでクチートを捕まえていませんでしたが、最近はレイドバトルばかりを探してクチートをお出迎えしています。
さて、今回は画像認識のお話です。前回の記事で、ポケモンの選出画面を画像認識することでパーティーを簡単に登録できるようにする試みがあることをご紹介しました。 これを実現するためには、画像のどの箇所にどのポケモンが写っているかを判定する必要があります。
私もパーティー記録ツールを作りたいなと思っていましたので、勉強のため、まずクチートを認識するモデルを作ってみようと決心しました。以下で、モデル構築までの手順を記載していこうと思います。
下記に今回の記事で説明するコードを置いていますので、適宜参照してください。 github.com
利用する手法
リアルタイムに物体検出したかったので、SSD(Single Shot Multibox Detector)を利用しました。 以下のgithubレポジトリが広く使われていたので、私も下記を利用しました。
手順
手順は以下になります。
データの準備
まずは画像を用意します。「ワシのクチート画像は百八式まであるぞ」ということで、 秘蔵のクチート画像フォルダから108枚の画像を選出してきました。
まずは、画像のどこにクチートが写っているのかという教師データを作成する必要があります。 今回、以下のサイトを参考にさせて頂き、AnnotationTool.exeを利用しました。 このツールを利用して、108枚すべての画像に手作業で丁寧にアノテーションしていきます。 すると、108個のxmlファイルが生成されます。
次に、画像の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という便利なサービスが登場したので、そちらを利用しても良いかもしれません。)
インスタンスの作成
- ステップ1
- AMI:AmazonLinux2を選択
- ステップ2
- GPU コンピューティング: p2.xlargeを選択
- ステップ3: インスタンスの詳細の設定
- セキュリティグループの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行目までを実行すると、画像を認識します。
学習の画像を増やしていくと、この判定の精度が向上していきます。
まとめ
今回は、SSD + Keras でクチートの画像認識するモデルを学習する流れを説明しました。 バッチサイズを10で実行すると、1つのEpochが30分くらいました。数百円くらいの出費でした。 この辺のノウハウが無くて、もっと早く安くする方法あるのか分かっていないので、誰か教えて頂けると嬉しいです!
ポケモンデータ分析学会できるのでは?
みなさんこんにちは。さっちんです。
最近はダンジョンメーカーに手を出してしまい、非常に時間を盗まれております。 ポケモンが好きな人は多分ハマると思いますので、ぜひともオススメします。
さて、今回はポケモンに関する分析記事を集めてみました。 私自身も分析するのですが、下記にもある@poke_odanさんの記事を見つけて、「同士が多いのでは?!」と思ったのがきっかけです。 みんなどんどん分析して学会開きましょう。温泉街とかで。
ということで時間順に並べてみました。
2016/12/23
LDAトピックモデルの「文書」と「単語」の関係性を「ポケモン」と「技」に置き換えて分析しています。 ポケモンが覚える技リストをデータセットとしてモデルを作ることで、技のタイプが強く関連しているトピックや爪や剣のような特徴を捉えたトピックなどを発見しています。 「文書」と「単語」の関係性を「ポケモン」と「技」に置き換えたところがミソだと感じました!
2017/03/04
ポケモン対戦のログを取るために、画像処理をしたという記事です。 対戦中に相手のパーティを見返すために写メを撮るのは、レート対戦したことがある人は覚えがあるでしょう。 この写メを収集することでどんなパーティが流行っているのか分かるので、助かる人も多いと思います。
この研究分野?は非常に課題意識があり、多く人が研究していました。 私も興味ある分野なので、次やるとしたここかなぁ。
- 【画像認識】ポケモン対戦画面抽出システムの概要と課題
- ポケモンのお見合い画面を画像解析して選出予想をしたい(1) - 酢ろぐ!
- おだんぽよ on Twitter: "ポケモンの選出画面の写メから、そこに写っているポケモンを検出するwebアプリを作りました!まだ試行錯誤段階で検出精度は5割程度ですが、データ収集のためにも使ってくださる方を募集しています。 https://t.co/UAGAQECvc5… https://t.co/YeUAbkISOZ"
2017/09/26
私の過去記事です。かえんほうしゃ - ほのお + みず = ハイドロポンプ
を実現させたいというモチベーションのみでやりました。
一部、特徴を捉えてベクトル化できていたので満足しています。(もうちょっとデータセットをキレイにしても良かったとは思っていますが…。)
2017/12/10
ポケモンAとBが戦ってどちらが勝つか?を予測した記事になります。 種族値の差やタイプ相性など、どの因子が勝率に貢献しているのかを見ています。
ランダムフォレストが一番精度良くなったそうで、素早さ種族値が一番勝率に貢献しているようです。 データからみても、やはり素早さは重要のようですね。
2018/03/26
こちらも非常に面白いアイデアでした。 あるポケモンの画像を与えたときに、勾配ブースティング決定木を利用してそのポケモンの種族値を予測しています。 結果は芳しくなかったようですが、画像からタイプを予測するなど、いろいろ流用できそうな気がしました。
2018/04/08
私の過去記事は技に注目していましたが、こちらはパーティに注目してword2vecを活用した記事でした。 Pokémon Showdown(オンライン上のポケモン対戦シミュレータ)から対戦に使われたパーティを抽出して、ポケモンの役割をベクトル化するという試みでした。対戦経験者も納得するような結果が得られています。
コメント欄の議論も良く、「水タイプ+地面タイプ+鋼タイプ+メガシンカポケモン+残り2匹でパーティーが構成されている」のような解釈がされたりしていました。
2018/06/26
種族値からタイプを予測するという問題を、ロジスティック回帰で取り組んだ記事でした。 87%の精度で判定することができたということで、種族値からタイプを予測できるんだという新たな発見がありました。 ポケモン自体の知識が必要という考察も非常に共感しました。
まとめ
今回はポケモンのデータ分析に関する記事を一覧化しました。 ちょっと探しただけでこれだけ見つかったので、まだまだ多くの方が分析していると思います。 定期的にサーベイしているので、また集まったら公開したいですね。
p.s. 百ポケ夜行のクチート可愛すぎて、めっちゃグッズ買ってしまった。
ポケモンのデータセットを公開しました。
みなさんこんにちは。さっちんです。
最近はモンスターハンターワールドやっていました。初めてのモンハンでしたが、めちゃくちゃ良かったです。シリーズで数千時間やる人がいるのも頷けます。
さて、今回は第7世代までのポケモンのデータを分析に使いやすい形に整形しました。下記のレポジトリで公開していますので、必要な方はどうぞ。
[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日目の記事でした。
p.s. パブロがガチアサリに適正あることは間違いないですが、ただ使うだけでは勝てないのでご注意を。
甘党が考える、コーヒーと最高に相性が良いお菓子
みなさんこんにちは。さっちんです。
みなさん、コーヒーはお好きでしょうか?インスタント派、缶コーヒー派、スタバ派、自宅で豆挽いて淹れる派など多くの流派があるように、コーヒーを飲む方は多いと思います。かくなる私も、自宅で豆挽いて淹れる派のコーヒー党です。今日は、そんな自宅で豆挽いて淹れる派向けに美味しいお菓子を紹介していきましょう。
コーヒーのお供としてのお菓子
多くの場合、お菓子が主役でそれに合わせてコーヒーが選ばれます。例えば、「コース料理のデザートにケーキを食べるからコーヒーにしようかな…」というのがそれです。しかし、「このコーヒーを飲みたいから、このお菓子を用意しよう。」というコーヒー主役の選び方もあるでしょう。そこで、私が日頃「このコーヒーのお供にはこのお菓子を食べる!」と考えていることをご紹介します。
(※コーヒーはブラックで飲むことを前提としています。)
あっさり酸味があるコーヒを飲む時
あっさり酸味がある豆のコーヒーの場合、甘みが強いお菓子が良いです。
Lotus
まずは、コーヒーのお供で有名なLotusです。
ロータス オリジナル カラメルビスケット 500g(250g×2袋
- 出版社/メーカー: ロータス
- メディア: 食品&飲料
- この商品を含むブログを見る
カルディコーヒーファームなどで売っているため比較的手に入れやすく、個別包装されてるのもGood。 硬めのビスケットがホロホロ崩れる感じの食感です。
MOOMLIGHT
次に、森永のMOOMLIGHTです。
- 出版社/メーカー: 森永製菓
- メディア: 食品&飲料
- この商品を含むブログを見る
スーパーやコンビニで売ってるので、いつでも手に入ります。 王道のバタークッキーという感じで、甘みが強く、あっさりコーヒーと良く合います。 机の上に常備しておきたいものです。
極細Pocky
最後は、グリコの極細Pockyです。普通のPockyではダメです。
- 出版社/メーカー: 江崎グリコ
- メディア: 食品&飲料
- この商品を含むブログを見る
これもスーパーやコンビニで売ってるので、いつでも手に入ります。 普通のPockyがダメと言うのは冗談ですが、極細Pockyのほうが1本あたりが少量なので食べやすく、コーヒーが良く進みます。 また手が汚れないので、PC作業中のコーヒーのお供としても優秀です。
コクあり苦味があるコーヒーを飲む時
コクあり苦味がある豆のコーヒーの場合、甘み控えめのお菓子が良いです。
MARIE
またしても森永のビスケットです。
- 出版社/メーカー: 森永製菓
- メディア: 食品&飲料
- この商品を含むブログ (2件) を見る
こちらはMOONLIGHTに比べて甘さ控え目であるため、そのまま食べると甘党には物足りなく感じます。 しかし!濃いコーヒーを飲んだ後に食べると甘さが際立ち、お口もリセットされるためコーヒーが進み、またビスケットを食べ…と良い感じのループになります。1箱に入っている枚数が多いのも良し。
MAUNALOA
最後はマカダミアナッツの塩味です。
MAUNALOA(マウナロア) マカダミアナッツ塩味6缶セット (ハワイ お土産)
- 出版社/メーカー: CSトレーディング
- メディア: その他
- この商品を含むブログを見る
基本的にコーヒーのお供には甘いものを選ぶのですが、このナッツは例外です。 コーヒーに合うしょっぱさを持ったお菓子は珍しいので、一度は食べてみることをオススメします!
まとめ
今日は、コーヒーを主役としたときに、どのようなお菓子を選ぶかをご紹介しました。 コーヒーのお供を真剣に考えることで、コーヒーをより楽しめるようになると思いますので、色々試していきましょう!
以上、8日目の記事でした。 adventar.org
かえんほうしゃ - ほのお + みず = ハイドロポンプになるか?
みなさんこんにちは。さっちんです。
ポケモンに関する文章を使ってword2vecをやってみたので、今回はその結果をお見せしたいと思います。 ソースコードと学習データは以下に置いています。 github.com
最近の流行?!、「単語と単語での計算」
タイトルを見て興味を持った方は、word2vecってなんだ???となると思いますので、簡単にご説明します。 最近、AIや人工知能という単語がニュースなどで取り上げられるように、IT業界ではAIや人工知能が非常にホットな話題となっています。 その文脈の中で、文章も人工知能で分析してやるぜ!という試みが流行しており、word2vecはその中の一つの手法です。
word2vecのイメージを具体的にするために、非常に有名な例を挙げたいと思います。 それは…
王様 - 男 + 女 = 女王様
です。
つまり、文章で「王様は男性における地位の名称ですが、王様と同様の意味を持つ女性における地位の名称は何でしょうか?」と表現される質問を計算式で表したものになります。このように、「単語同士で計算ができるようになったら、人工知能に文章を理解させる手助けになるんじゃね?」という発想で生まれた手法です。
ポケモンでword2vecしたい
難しい話はこのくらいにして、本題に移りたいと思います。 単語同士が計算できるとなると、ポケモン好きな皆様におかれましてはポケモン用語でもやってみたいと思うのではないでしょうか? それが今回のタイトルである「かえんほうしゃ - ほのお + みず = ハイドロポンプになるのか?」に帰着するわけです。
そこで今回は、ポケモンWiki*1とポケモン対戦考察まとめWiki*2の記事を学習させてみました。それでは結果を見ていきましょう。
単語自体の計算結果
まずは単語そのものを見ていきましょう。指定した単語と関連の強い単語のトップ10が表示されます。 横にある数値は関連度になります。
さっそく、我らがメガクチートを計算してみましょう。
calc("メガクチート")
- バンギラス 0.9744253754615784
- テッカグヤ 0.9737641215324402
- 一 0.9579521417617798
- メガギャラドス 0.9565474987030029
- 喰らう 0.9561516046524048
- カイリュー 0.9555752277374268
- マンムー 0.9530206918716431
- 舞 0.9496548175811768
- メガハッサム 0.949008584022522
- てる 0.9439014792442322
クチート一緒にパーティへ入ることの多いカイリューやマンムーがトップ10に入っています。 舞は「つるぎのまい」のことですね。
続いてパーティの名称である雨パを計算しました。
calc("雨パ")
- 独自 0.9668172597885132
- ペリッパー 0.9622671604156494
- 個性 0.9604281783103943
- 化す 0.9601962566375732
- 充実 0.9588289260864258
- 使い 0.9584391117095947
- あめふらし 0.9568397998809814
- あくタイプ 0.9563978314399719
- 多芸 0.9530139565467834
- 無類 0.9518377184867859
7世代で雨パで採用されることが多いペリッパーや、雨パに欠かせない特性のあめふらしが入っていますね。
続いてタイプのフェアリーを計算。
calc("フェアリー")
- 倍 0.9322121143341064
- 一貫性 0.922793984413147
- 格闘 0.9219501614570618
- ゴースト 0.9165294170379639
- 相性補完 0.9136119484901428
- ドラゴンタイプ 0.9095576405525208
- 地面 0.9079031944274902
- 4倍弱点 0.9013127088546753
- 4倍 0.8987537622451782
- 強い 0.8973758220672607
フェアリーに弱点を突かれる格闘やドラゴンという単語が入っています。 4倍弱点はサザンドラやジャララガン、ズルズキン、ゴロンダあたりの記事が効いてるのでしょうか?
次は性格のおくびょう。
calc("おくびょう")
- ひかえめ 0.9599519371986389
- CS 0.9132525324821472
- こだわりメガネ 0.9035917520523071
- 基 0.8862846493721008
- 冷静 0.8780158758163452
- 性格 0.8219131231307983
- せっかち 0.8143517374992371
- 努力値 0.8130760192871094
- ハイドロポンプ 0.8049198389053345
- ムーンフォース 0.8013639450073242
これは素晴らしいですね。おくびょうと同じように特殊アタッカーに採用されるひかえめ、冷静がランクインしています。 また、努力値の振り方であるCSという単語や持ち物であるこだわりメガネも入っています。
calc("きあいのタスキ")
- カムラ 0.9162214398384094
- 持ち物 0.8896895051002502
- ラム 0.8842946290969849
- 蜻蛉返り 0.8831953406333923
- クリスタル 0.8821411728858948
- 優先 0.8816790580749512
- ジュエル 0.8660957217216492
- 選択 0.8502988219261169
- がんせきふうじ 0.8499913811683655
- なげつける 0.8491314649581909
きあいのタスキだと、同じ持ち物であるカムラのみやラムのみ、Zクリスタル、ジュエルが関連の強い単語として挙げられています。 とんぼがえりはタスキ潰しによく使われるからでしょうか?
さて、それでは技を見ていきたいと思います。
calc("じしん")
- ストーンエッジ 0.9791466593742371
- ぢ 0.9695087671279907
- いわなだれ 0.9539787173271179
- れいとうパンチ 0.9350066184997559
- すてみタックル 0.9336516261100769
- かみくだく 0.9321756958961487
- アームハンマー 0.9284919500350952
- アイアンヘッド 0.9270839095115662
- かみなりパンチ 0.9270591139793396
- どくづく 0.9257274270057678
じしんを計算すると、物理技ばかりが列挙されました。 また、じしんと同時に採用されやすいストーンエッジといわなだれが上位に入っています。
最後にかえんほうしゃを見たいと思います。
calc("かえんほうしゃ")
- あくのはどう 0.9866007566452026
- れいとうビーム 0.9813727140426636
- りゅうのはどう 0.978251576423645
- なみのり 0.9763879776000977
- だいもんじ 0.9738233685493469
- ラスターカノン 0.9735146760940552
- ソーラービーム 0.9731917977333069
- きあいだま 0.973129391670227
- かみなり 0.9693619012832642
- だいちのちから 0.9692765474319458
こちらは完全に特殊技ばかりが並んでいます。これは期待が膨らみますね。
単語と単語の計算結果
では、かえんほうしゃ - ほのお + みず を計算してみましょう。
calc("かえんほうしゃ-ほのお+みず")
- 特殊技 0.9034083485603333
- はどうだん 0.8909361958503723
- サブ 0.8858975172042847
- りゅうのはどう 0.8845259547233582
- ふぶき 0.8783226013183594
- ハイドロポンプ 0.8712683916091919
- 電 0.8656661510467529
- だいもんじ 0.8648360371589661
- 軸 0.8628724813461304
- メイン 0.8532931804656982
・・・やりました。かえんほうしゃからほのおタイプを引いてみずタイプを足すと、ちゃんとハイドロポンプになります。 (※それ以外の技が上位に来ているのは気のせいです。) せっかくなので、他の計算もしてみましょう。
calc("ぜったいれいど-氷+地")
- 地割れ 0.9815039038658142
- とんぼがえり 0.976150631904602
- あやしいひかり 0.967402458190918
- ちから 0.9479234218597412
- ドリル 0.9468713998794556
- じこさいせい 0.9343216419219971
- 叩き台 0.9340541958808899
- あまごい 0.9317256212234497
- きゅうけつ 0.9308851361274719
- パンチ 0.9303572773933411
これまたすごい結果になりました。ぜったいれいどから氷タイプを引いて地面タイプを足すと、ちゃんと地割れになります。
次は、ポケモンのタイプを引いたり足したりしてみましょう。
calc("リザードン-ほのお+みず")
- すべて 0.9639962911605835
- 近く 0.9628123641014099
- ソルガレオ 0.9590645432472229
- ざら 0.9563183784484863
- ボスゴドラ 0.949439525604248
- 一般 0.9466379284858704
- 本来 0.9451665878295898
- ケース 0.9429201483726501
- 呼称 0.9397175312042236
- おろか 0.938876211643219
このように、リザードンからほのおタイプを引いてみずタイプを足すと、ちゃんと御三家のカメックスに…、 ソルガレオになるそうです。
アローラの守り神でみんなのアイドルでもあるカプ・テテフちゃんも、エスパータイプを引いてでんきタイプを足すと、しっかりカプ・コケコに…、
calc("カプ・テテフ-エスパー+でんき")
- てる 0.9460397362709045
- テッカグヤ 0.9357684850692749
- 勝てる 0.9340535402297974
- 取れる 0.9280171990394592
- ヒードラン 0.9266940951347351
- 切る 0.9233332276344299
- ボーマンダ 0.9210865497589111
- ギルガルド 0.9198833703994751
- 処理 0.9168146848678589
- 読みで 0.9078798890113831
UBのテッカグヤになるそうです。
最後は気持ちよく終わりましょう。クチートにメガストーンを加えると…
calc("クチート+メガストーン")
- 飛ぶ 0.9863591194152832
- 違える 0.9835994243621826
- 小さい 0.9808191657066345
- 上書き 0.9792056083679199
- 伴う 0.9779235124588013
- 裏 0.9774397015571594
- 返す 0.9748541116714478
- 見せる 0.9745727777481079
- 針 0.9743210077285767
- バグ 0.9740380048751831
はい。飛び立つそうです。
計算結果の考察
みなさん、お気づきだとは思いますが、今回の精度はいまいちな結果となってしまいました。 実は上記の結果は、100ケース以上の計算をして、見栄えの良いものを並べたものです。 10まんボルトから電気を引いて炎を足してもかえんほうしゃにはなりませんでした。
今回のケースでは、学習データに難アリという印象です。 Wikiという媒体の性質上、言葉のゆらぎがあり、略語(トリックルームパーティーがトリパとなっている)も多用されて非常にデータ加工が困難でした。 また素直に処理をすると、オボンのみが「お盆」と「のみ」に分割されてしまい、固有名詞も拾えませんでした。 かなり丁寧に言葉のゆらぎを直し、略語を正式な単語に復元し、技や持ち物の名前などの固有名詞が残るように手作業で加工したのですが、 上記のような精度に落ち着きました。
また、データ量も少なく、高精度に学習できなかったとも感じています。 2つのwikiだけではなく、ポケモンに関するまとめサイトもクローリングして、もっと文章を集めたほうが良かったです。
人工知能も、適切なデータを使い、適切な手順を踏まないと賢くならないという良い例になったと思います。
まとめ
今回は、word2vecを使って「かえんほうしゃ - ほのお + みず = ハイドロポンプ」を計算しました。 たくさんの計算をしましたが、上記くらいしか見栄えのいいものがありませんでした。 とは言え、「かえんほうしゃ - ほのお + みず」を計算した結果の中にハイドロポンプを見つけたときは、めちゃめちゃ嬉しかったです。 また、技に関しては精度がよく、物理技と特殊技はしっかり見分けられるようです。 きれいに加工されたもっと大量のデータを利用することで、まだまだ賢くなるなと思いました。
クチートの性格の選び方について
みなさんこんにちは。さっちんです。
今回はクチートの努力値配分について書いていきたいと思います。
昔とある記事で、「いじっぱり」のS振りと「ようき」のA振りでは、ステータスの実数値に差が出ると見たことがありました。 それまでは「いじっぱり」のクチートばかり育成していたのですが、場合によっては「ようき」もありなんじゃ?と考えるようになり、もやもやするようになりました。
そこで今回は、網羅的にステータスを計算することで、性格を選択する指針にしたいなと考えています。
前提
細かい話になりますが、前提を書いていきます。
ステータスの計算結果は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列目)を記載しています。