艦これのルート分岐を統計から解析する(2)

前回の続きです。


リンク
  • 3-3-A(アルフォンシーノ方面) から、100%の確率でBへ向かう編成の特徴抽出(既知)
  • [本記事]2-2-E(バシー島沖)から、ボスマスへ向かう確率と条件(既知)
  • [未投稿]3-3(アルフォンシーノ方面) 全般 (不明)




  • ざっくりおさらいすると、MyFleetGirlsという統計サイトがあったので、そのデータを使ってみよう、という内容です。


    既知の条件分岐のおさらい


    バシー島沖 Eマス(艦隊これくしょんWikiより)

    • 正規空母(装甲空母除く)or軽空母or水母を含む艦隊はFに70%、Gに30%
    • 上記空母を含まない艦隊はFに30%、Gに70%

    前回とは異なり、分岐条件だけでなく、割合も求めたいです。

    Wikiに書かれている内容が正しい保証はありませんが、十分信頼できるでしょう。


    方法


    統計データより、6隻の艦種が分かれば、その艦隊がどの程度の確率でどのルートへ向かうのかが分かります。

    潜水空母/潜水空母/潜水空母/潜水空母/潜水艦/潜水艦 は、3669回Start->E->Gへ
    潜水空母/潜水空母/潜水空母/潜水空母/潜水艦/潜水艦 は、1560回Start->E->Fへ
    軽空母/軽空母/重雷装巡洋艦/重雷装巡洋艦/重雷装巡洋艦/なし は、297回Start->E->Gへ
    軽空母/軽空母/重雷装巡洋艦/重雷装巡洋艦/重雷装巡洋艦/なし は、685回Start->E->Fへ

    試行回数が5倍ほど違いますが、明らかな確率の差が見えます。

    前回では、「どこへ向かったのか」の情報をWekaに渡していましたが、今回は「どこへどの程度の確率へ向かうのか」の情報を予め求めておき、Wekaに渡します。

    つまり、
    「潜水空母/潜水空母/潜水空母/潜水空母/潜水艦/潜水艦 は70.2%でE->Gに向かう」
    といったデータを用意出来れば良いです。


    統計データ


    スタート地点からEマスへ移動する方法は「Start→E」「Start→A→E」の2通りあり、統計データは分かれています。

    過去のイベントにて、何処から到達したかによる条件分岐がありました(2016春E6)が、
    この海域ではそのようなことは無いだろうと予想されているので、2通りの統計データをマージすることにします。

    また、正規空母≠装甲空母のルート分岐が予想されているので区別します。潜水空母と潜水艦は区別しません。


    ちなみにこの統計、30行しか統計データが得られないみたいです。
    海域が海域なので、上位が殆ど潜水艦で埋まっています。


    うまく行く気が全くしません。


    やる


    前回作ったrubyプログラムを使って統計データを加工したもの。
    ただし、装甲空母をc2pとして分類。

    このデータは次のプログラムの標準入力として与えます。
    merge(E -> G)
    a1,b1,b2,b3,b4,c1,c2,c2p,c3,d1,d2,e1,z,#
    0,0,0,0,0,0,0,0,0,0,0,6,0,7786
    0,0,0,0,0,0,0,0,0,0,0,4,0,4339
    0,0,0,0,0,0,0,0,0,0,0,5,0,5027
    0,0,0,0,0,0,0,0,0,0,0,1,0,932
    6,0,0,0,0,0,0,0,0,0,0,0,0,1004
    0,0,4,2,0,0,0,0,0,0,0,0,0,919
    0,0,0,0,0,0,0,0,0,0,0,3,0,2070
    0,0,0,0,0,6,0,0,0,0,0,0,0,607
    0,0,5,1,0,0,0,0,0,0,0,0,0,520
    0,0,0,0,3,2,0,0,0,0,0,0,0,443
    0,0,0,1,0,0,0,0,0,0,0,5,0,384
    0,0,0,2,0,1,0,0,0,0,0,3,0,399
    0,1,0,0,1,3,0,0,0,0,0,0,1,342
    0,0,0,0,2,0,0,0,0,0,0,4,0,336
    5,1,0,0,0,0,0,0,0,0,0,0,0,337
    2,1,2,0,0,1,0,0,0,0,0,0,0,315
    4,2,0,0,0,0,0,0,0,0,0,0,0,309
    2,2,1,0,0,0,0,0,0,1,0,0,0,188
    3,2,1,0,0,0,0,0,0,0,0,0,0,97
    ,
    merge(E -> F)
    a1,b1,b2,b3,b4,c1,c2,c2p,c3,d1,d2,e1,z,#
    0,0,0,0,0,0,0,0,0,0,0,6,0,3125
    0,0,0,0,0,6,0,0,0,0,0,0,0,1324
    0,0,0,0,3,2,0,0,0,0,0,0,0,1043
    0,0,0,0,0,0,0,0,0,0,0,4,0,1568
    0,0,0,2,0,1,0,0,0,0,0,3,0,903
    0,1,0,0,1,3,0,0,0,0,0,0,1,790
    0,0,0,0,0,0,0,0,0,0,0,5,0,1750
    2,1,2,0,0,1,0,0,0,0,0,0,0,680
    5,0,0,0,0,0,0,0,1,0,0,0,0,536
    3,1,0,0,1,0,0,0,1,0,0,0,0,569
    0,0,1,0,0,5,0,0,0,0,0,0,0,502
    0,0,0,0,0,3,0,0,0,0,0,0,0,479
    6,0,0,0,0,0,0,0,0,0,0,0,0,430
    0,0,0,0,0,0,0,0,0,0,0,1,0,299
    2,2,1,0,0,1,0,0,0,0,0,0,0,439
    0,0,4,2,0,0,0,0,0,0,0,0,0,409
    2,1,1,0,0,2,0,0,0,0,0,0,0,397
    5,0,0,0,0,1,0,0,0,0,0,0,0,379
    0,5,0,0,0,1,0,0,0,0,0,0,0,378
    0,0,0,0,0,2,0,0,0,0,0,4,0,465
    0,0,0,0,0,3,3,0,0,0,0,0,0,382
    0,0,1,1,0,1,0,0,0,0,0,3,0,361
    0,0,0,0,0,0,0,0,0,0,0,3,0,531
    0,0,0,0,2,0,0,0,1,0,0,0,0,105
    0,0,0,0,0,5,0,0,1,0,0,0,0,103


    上の「方法」に基づいてプログラムを書きます。

    処理内容↓
    「E->G」と「E->F」の両方に同じ艦隊編成のデータがあるならば、その確率を求めて出力します。


    ソースコード一応載せておきます。特に読んで欲しいものではないので、コメント無し。

    def classify(val)
    return val<0.4 ? 'L' : 0.6end

    first_data = {}
    variant_data = {}

    flg_division = 1

    while cin = gets
    cin.chomp!

    if (!cin=~/[0-9,]/)
    next
    end
    if (cin==',')
    flg_division = 2
    next
    end

    arr = cin.split(',').map(&:to_i)
    num = arr.pop

    if flg_division == 1
    first_data[arr] = num

    elsif flg_division == 2
    if v = first_data[arr]
    variant_data[arr] = classify(v.to_f / (v + num)) if num !=0
    first_data.delete(arr)
    else
    warn "unused : 2: [#{arr}]"
    end
    end
    end

    first_data.each{|k,v|
    warn "unused : 1: [#{k}]"
    }

    variant_data.each{|k,v|
    puts "#{k*','} #{v}"
    }


    標準出力を示します。HはGへ向かう確率が60%を超える、LはGへ向かう確率が40%を下回る、どちらでもないならMです。
    0,0,0,0,0,0,0,0,0,0,0,6,0 H
    0,0,0,0,0,6,0,0,0,0,0,0,0 L
    0,0,0,0,3,2,0,0,0,0,0,0,0 L
    0,0,0,0,0,0,0,0,0,0,0,4,0 H
    0,0,0,2,0,1,0,0,0,0,0,3,0 L
    0,1,0,0,1,3,0,0,0,0,0,0,1 L
    0,0,0,0,0,0,0,0,0,0,0,5,0 H
    2,1,2,0,0,1,0,0,0,0,0,0,0 L
    6,0,0,0,0,0,0,0,0,0,0,0,0 H
    0,0,0,0,0,0,0,0,0,0,0,1,0 H
    0,0,4,2,0,0,0,0,0,0,0,0,0 H
    0,0,0,0,0,0,0,0,0,0,0,3,0 H

    …データ減ったなぁ。


    さて、上で作成したデータをWekaに投げ込むため、arffファイルを作成します。

    @relation kc_2_2_e

    @attribute a1 real
    @attribute b1 real
    @attribute b2 real
    @attribute b3 real
    @attribute b4 real
    @attribute c1 real
    @attribute c2 real
    @attribute c2p real
    @attribute c3 real
    @attribute d1 real
    @attribute d2 real
    @attribute e1 real
    @attribute z real
    @attribute directionVariant {L,M,H}

    @data
    0,0,0,0,0,0,0,0,0,0,0,6,0,H
    0,0,0,0,0,6,0,0,0,0,0,0,0,L
    0,0,0,0,3,2,0,0,0,0,0,0,0,L
    0,0,0,0,0,0,0,0,0,0,0,4,0,H
    0,0,0,2,0,1,0,0,0,0,0,3,0,L
    0,1,0,0,1,3,0,0,0,0,0,0,1,L
    0,0,0,0,0,0,0,0,0,0,0,5,0,H
    2,1,2,0,0,1,0,0,0,0,0,0,0,L
    6,0,0,0,0,0,0,0,0,0,0,0,0,H
    0,0,0,0,0,0,0,0,0,0,0,1,0,H
    0,0,4,2,0,0,0,0,0,0,0,0,0,H
    0,0,0,0,0,0,0,0,0,0,0,3,0,H



    Wekaでarffファイルを開く。
    20160917_weka01.jpg

    J48で分類。出来てます。
    20160917_weka02.jpg

    木構造をビジュアライズ化。
    20160917_weka03.jpg

    日本語にすると「軽空母を含むならば、高い確率でGへ向かう、そうでないならば、高い確率でFへ向かう」です。

    しょうがないじゃん!12行しかデータが無いんだもん!







    まだやる?



    ところで、データの加工時に、「E->G」と「E->F」のどちらか一方に含まれる艦隊編成のデータは捨てています。

    実装はしませんが、これらのデータをリサイクルする方法を適当に考えたのでメモ。



    捨てるデータを減らすため、一般化することを考えます。艦隊編成に穴を空ける、とも言い換えられます。

    例えば、
    軽空母/軽空母/重雷装巡洋艦/重雷装巡洋艦/重雷装巡洋艦/なし

    軽空母/軽空母/重雷装巡洋艦/重雷装巡洋艦/dontcare/dontcare

    と書き換えることで
    軽空母/軽空母/重雷装巡洋艦/重雷装巡洋艦/駆逐艦/駆逐艦

    軽空母/軽空母/重雷装巡洋艦/重雷装巡洋艦/軽巡洋艦/駆逐艦

    のデータと統合することが出来ます。


    2016/09/23 追記:削除。
    確率の情報が消えるので意味が無い。
    100%の確率で分岐する問題をWekaの力を借りずに実装する際には使えます。
    スポンサーサイト

    テーマ : プログラミング
    ジャンル : コンピュータ

    tag : 機械学習

コメントの投稿

非公開コメント

プロフィール

舞葉(ぶよう)

Author:舞葉(ぶよう)
github.io
はてなブログ(競プロ)

古い記事のソースコードは色分けしていないので、高機能テキストエディタに貼り付けたほうが見やすいかも。

検索フォーム
このブログについて
自分がつまづいた話題、なんとなく書きたいと思ったこと、ググったけど殆ど資料なかったぞオイ な話等をアップする予定。通りすがりでも、参考になっていただければと。プログラムの例外入力、メモリリークは責任負いません。投稿された記事は修正・削除する場合があります。
カテゴリ
タグ

HSP3アルゴリズムとデータ構造c++RubyJavaUnity画像解析C機械学習C#LinuxcodeIQKinectMinecraftTonyuSystemraspberrypiPythonHTML5音声制御Simulinkruby俺ルール通信制御Javascriptシミュレーション

counter-shinobi
固定記事
最新記事
最新コメント
月別アーカイブ
ブロとも申請フォーム

この人とブロともになる

アクセスランキング
[ジャンルランキング]
コンピュータ
1253位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
219位
アクセスランキングを見る>>