r-statistics-fanの日記

統計好きの現場の臨床医の覚書のようなもの

じゃんけんのシミュレーション

人員が異動で減って、一時的に仕事量が倍になっている。

あと2週間の辛抱だ。

 

お世話になっている驚異のアニヲタ社会復帰への道さんが、卒業記念に本を書いたとのこと。サイトが怪しいが、500円とちょっとで安い。おすすめである。

購入はここ=> [Rで始めた医学・統計学・Bioinformatics]

 

この本の中で初心者の頃に書いたという、じゃんけんのシミュレーションの

コードが有る。これが相当時間がかかるので改造してみる。

グリコ、パイナツプル、チヨコレイトのあれだ。

ランダムに相手が手を出してくるとき、そのような比率で手を出せば

勝てる可能性が高くなるか。

じゃんけんのシミュレーション

# シミュレーションによって勝率を計算する
library(MCMCpack)  # ディリクレ分布による確率を発生させるのに必要なパッケージ
library(doSNOW)  # 並列計算に必要なパッケージ
library(foreach)  # 並列計算に必要なパッケージ
library(gplots)  # 色付けに必要なパッケージ
library(scatterplot3d)

niter <- 10000  # シミュレーション回数
m <- c(3, 6, 6)  # グー,チョキ、パー

x <- rdirichlet(niter, alpha = rep(1, length(m)))  # Xのじゃんけんの手の確率 alpha=1で一様分布
y <- rdirichlet(niter, alpha = rep(1, length(m)))  # Yのじゃんけんの手の確率 alpha10で真ん中に手厚い分布
yy <- t(y)
# じゃんけんごとに前進できる歩数行列
M <- matrix(c(0, -m[1], m[3], m[1], 0, -m[2], -m[3], m[2], 0), nr = 3, nc = 3)
cl <- makeCluster(20, "SOCK")  # 並列計算しているので,不用意にやると計算が終わらない。
registerDoSNOW(cl)
win <- foreach(i = seq(niter), .combine = "c") %dopar% {
    mean( (x[i, ] %*% M %*% yy) >= 0)  #ここを行列計算に変更する
}
stopCluster(cl)
colcut <- 100
# cols <- rainbow(colcut, start=.4, end=.35) #こっちの色の方が好き
cols <- colorpanel(colcut, low = "blue", mid = "white", high = "red")
idx <- cut(as.numeric(win), seq(0, 1, length = colcut + 1))
layout(matrix(c(1, 2, 1, 1), nr = 2), width = c(1, 2.5), heights = c(6, 1))
sc <- scatterplot3d(x, color = cols[idx], pch = 16, angle = 150, xlab = "Rock", 
    ylab = "Scissors", zlab = "Paper", cex.lab = 2, cex.axis = 1.2, mar = c(4, 
        3, 2, 3))
sc$points3d(x[which.max(win), 1], x[which.max(win), 2], x[which.max(win), 3], 
    pch = "*", col = "yellow", cex = 3)
sc$points3d(x[which.min(win), 1], x[which.min(win), 3], x[which.min(win), 3], 
    pch = "*", col = "green", cex = 3)
par(mar = c(4, 1, 0, 0))
image(as.matrix(sort(win)), col = cols, frame = FALSE, yaxt = "n")
mtext("Win probability", side = 3, line = 0.5, cex = 1.5)

plot of chunk unnamed-chunk-1

行列計算化して、オリジナルより速度はかなりはやくなった。

コードをなぞりながら改変することにより、並列計算なるものを

はじめて経験出来た。これは勉強になった。

dirichlet分布も面白い。alpha=1で一様分布のような感じ。
alphaを大きくすると、中心に固まる。全部グーとか、全部パーとかは
あまりなさそうなので、アルファを大きくした場合が現実に近いかも
しれないと思った。