【Super Mario Run】スーパー・マリオ・ランで10分で課金ゾーンまで到達した話

任天堂が満を持して公開するスマホアプリ「Super Mario Run」が本日、遊べるようになりました。

f:id:upura:20161216123311p:plain

早速ダウンロードしてみました。

片手で操作でき、手軽でサクサク進みます(遊び方などは他の記事やアプリに譲ります)。

f:id:upura:20161216123430p:plain

開始10分で3コースをクリア! いよいよボス戦です!!

f:id:upura:20161216123532p:plain

【遊戯王デュエルリンクス】恐竜王国デッキでデュエルキングになった(デッキレシピあり)

 遊戯王デュエルリンクスのランク戦で、一番の上のランク「デュエルキング」になりました。
f:id:upura:20161208172622p:plain

 デッキレシピは以下の通りです。
f:id:upura:20161208172701p:plain

 ダイナソー竜崎のスキル「恐竜王国」で、最初から攻撃力1900のモンスターを展開できます。あとは魔法や罠を駆使して押し切ります。

ディープラーニングで大相撲千秋楽の勝敗を予想してみる

 11月場所で鶴竜が千秋楽前に7場所ぶりの優勝を決めました。
 9月場所の千秋楽前にもこんな記事を書いたのですが、またしても相撲絡みの記事を書きたくなったので書きます。

 今回はアホみたく流行っている「ディープラーニング」を使って、大相撲千秋楽の勝敗を予想してみようという記事です。といっても4層しかないのですが「ディープラーニング」の方が引きが良さそうなのでタイトルに盛り込んでしまいました。

 以下が、今回の目的です。「千秋楽の勝敗は、その場所の14日目までの成績(調子)に依存する部分がある」という仮定を置きました。この仮定のもと、14日目までの成績を入力として、千秋楽の勝敗を予想する分類器を作成します。

f:id:upura:20161126225305p:plain

 下図が、今回作成したディープニューラルネット(DNN)です。

f:id:upura:20161126225842p:plain

 このDNNに訓練データとして過去の幕内の取り組み結果を与えます。データ構造は以下の通りです。

f:id:upura:20161126230137p:plain

 過去の取り組みデータは「大相撲星取表」というサイトから収集しました。データ収集には、pythonのpandasの機能を利用しました。
upura.hatenablog.com

 今回の場合、平成元年~平成28年7月場所までのデータを訓練データとしてDNNに与えました。実装にはRの「mxnet」というライブラリを使っています。以下のサイトを参考にしました。
tjo.hatenablog.com

# Data Import
df <- read.csv("C:/data.csv", header = F)
newdata <- read.csv("C:/newdata.csv", header = F)

library(mxnet)

# Training Data
train <- data.matrix(df)
train.x <- train[,-1]
train.y <- as.numeric(train[,1])

# Test Data
test <- data.matrix(newdata[,-1])

# DNN
data <- mx.symbol.Variable("data")
fc1 <- mx.symbol.FullyConnected(data, name="fc1", num_hidden=28)
act1 <- mx.symbol.Activation(fc1, name="tanh1", act_type="tanh")
fc2 <- mx.symbol.FullyConnected(act1, name="fc2", num_hidden=14)
act2 <- mx.symbol.Activation(fc2, name="tanh2", act_type="tanh")
fc3 <- mx.symbol.FullyConnected(act2, name="fc3", num_hidden=10)
act3 <- mx.symbol.Activation(fc3, name="tanh3", act_type="tanh")
fc4 <- mx.symbol.FullyConnected(act3, name="fc4", num_hidden=2)
softmax <- mx.symbol.SoftmaxOutput(fc4, name="softmax")

# Execution
devices <- mx.cpu()
mx.set.seed(71)
model <- mx.model.FeedForward.create(softmax, X=train.x, y=train.y, ctx=devices, num.round=4000, array.batch.size=100, learning.rate=0.03, momentum=0.99,  eval.metric=mx.metric.accuracy, initializer=mx.init.uniform(0.5), array.layout = "rowmajor", epoch.end.callback=mx.callback.log.train.metric(100))

# Result
preds <- predict(model, test, array.layout = "rowmajor")
pred.label <- max.col(t(preds)) - 1
pred.label

 さていよいよ学習を終えたDNNを使って、千秋楽の勝敗を予想します。訓練データと同様、14日目までの結果から28次元のベクトルを作成します。これをDNNに入れ、千秋楽の勝敗を予想してもらいます。結果は以下のようになりました。

f:id:upura:20161127000005p:plain

 DNNの結果を見る前に、僭越ながら私も予想をしました。私の予想時には、14日目までの成績以外の情報(過去の対戦成績など)もフル活用しています。ちなみに私は小学校の頃に「わんぱく相撲」で2年連続名古屋市でベスト8になった実績を持つ(隠れた自慢)くらいには昔から相撲を見ています。

 黄色はDNNと私の予想が食い違ったことを示します。意図的かのごとく食い違っていますね。

 ディープラーニングと人間、どちらの予想が正しいか。明日の千秋楽の土俵に注目したいと思います。

【遊戯王デュエルリンクス】2枚だけでお手軽ロック

 「遊戯王」の世界を再現したトレーディングカードゲームアプリ「デュエルリンクス」が11月17日に配信を開始しました。
www.konami.com

 このアプリ、序盤はレベル4以下モンスターでの殴り合いになることが多いです。そんな中で、お手軽に相手の攻撃を封じ込めるコンボを見つけました。

 使うのは、以下の2枚です。
f:id:upura:20161126161150p:plain
f:id:upura:20161126161206p:plain

 使い方は単純。「ネコ耳族」を攻撃表示で召喚し「魔性の月」を装備するだけ。
 「ネコ耳族」の効果で、攻撃を仕掛けてくる相手モンスターの攻撃力は200になります。「ネコ耳族」の攻撃力を「魔性の月」で200→500に上げることで、相手は攻撃を仕掛けられなくなります。
 序盤の相手は効果モンスターや除去カードを持っていない(デッキに入れていない)ため、大抵はこれでロックが完了です。

 ロックで時間を稼げるので、パーツを揃える必要がある必殺コンボに繋げやすくなります。現在のカードプールでは「カラテマンワンキル」が最有力候補です。
appmedia.jp

 「カラテマンワンキル」に必要なのは、以下の3枚と1枚の手札コストです。
f:id:upura:20161126162328p:plain
f:id:upura:20161126162350p:plain
f:id:upura:20161126162605p:plain


 「カラテマン」を攻撃表示で召喚し「財宝への隠し通路」で直接攻撃できるようにします。
 さらには「閃光の双剣―トライス」を装備し、2回攻撃を可能にします。この時点で「閃光の双剣―トライス」の効果で「カラテマン」の攻撃力は1000→500になりますが、「カラテマン」の効果で自身の攻撃力を元々の攻撃力の2倍である2000にできます。
 こうして、攻撃力2000で2回直接攻撃できる「カラテマン」の誕生です。初期ライフが4000の「デュエルリンクス」では、必殺コンボの一つです。

 以下がデッキサンプルです。「ネコ耳族」のコンボで相手の攻撃を封じ、ゆるりと「カラテマンワンキル」のパーツを揃えて勝利を目指します。
f:id:upura:20161126163045p:plain

 わざわざ「カラテマンワンキル」を盛り込まずとも、相手のデッキ切れを狙う戦略も有り得そうです。

成功確率1%で繰り返し挑戦してみた

 Twitter見てたら、また香ばしいツイートが流れてきた。

 これは確率の良くある間違い。
 「n回やって成功する確率」=「全体」-「n回やって全部失敗する確率」なので、今回の場合の計算方法は下記の通り。可視化すると図のようになる。

(n回やって成功する確率){=1-0.99^n}

f:id:upura:20161105211359p:plain

 { n=100}の時の確率は0.633967659...と、64%以下。到底100%には及ばない。

『SCOOP!』は予告編にやられた

 あんまり書くとネタバレになるから書きませんが、大根監督『SCOOP!』は非常にオススメ。

 予告編のみ予習するのがベストだと思う。本編を見終わった後に、じわじわ「やられた!」という清々しい感情を体験できる。

 あとR12だけど、冒頭から下ネタ満載なので、微妙な関係の男女で観に行くのはオススメしません。

Nan(不定値)で条件分岐する

if( val != val ):
    #valがNanだったときの処理を書く

 PythonではNanとNanを比較するとFalseが返ってくるらしい。

【参考】
linux.oboe-gaki.com