道を選ぶ

  • 今、目の前にn.option本の道がある
  • その道には、それぞれ案内板が立っていて、「この道を進むと、n.type種類の猛獣が必ず1頭出ます。これまでの記録では、虎がa頭、蛇がb頭、蜘蛛がc頭…出ました」という情報が得られる
  • 一方、分岐点に立っている「私」は、これまでに、虎に対してA1勝A2敗、蛇に対してB1勝B2敗、…という記録がある
  • さて、どの道を選ぶか、という問題
  • 自分ひとりのことであれば、勝率の期待値が一番高いそれを選ぶのがよい
  • この記事の前後でやっているように、何度もトライアルをするにあたっての選択戦略として考えるなら、確率的に道を選ぶのがよいことになる
  • その確率の決め方はどうするか、という話
  • それぞれの記録から、猛獣の出現確率ベクトルの推定分布をディリクレ分布でとり、猛獣種類別の勝率の推定分布をディリクレ分布(ベータ分布)でとって、選択肢のそれぞれが最高勝率を与える事後確率を求めてみることにする
# 何が出るか、その種類
n.type <- 3
# 道の数
n.option <- 3
# 道ごとにどの種類が何回でたか
appear.record <- matrix(0,n.option,n.type)
# 対戦成績、タイプ別
match.record <- matrix(0,n.type,2)

appear.record <- rbind(c(50,20,10),c(20,10,50),c(10,10,10))
match.record <- rbind(c(5,3),c(1,1),c(1,4))

# シミュレーション回数
n.iter <- 1000
# 道ごとに何が出るかの確率ベクトルを発生する
appear.vector <- list()
for(i in 1:n.option){
	appear.vector[[i]] <- rdirichlet(n.iter,appear.record[i,]+1)
}
# 出現タイプごとの勝敗確率ベクトルを発生する
victory.vector <- list()
for(i in 1:n.type){
	victory.vector[[i]] <- rdirichlet(n.iter,match.record[i,]+1)
}

# 道ごとの勝率のベクトル
V.prob <- matrix(0,n.iter,n.option)
for(i in 1:n.iter){
	for(j in 1:n.option){
		for(k in 1:n.type){
			V.prob[i,j] <- V.prob[i,j] + victory.vector[[k]][i,1] * appear.vector[[j]][i,k]
		}
		
	}
}

apply(V.prob,2,mean)
tabulate(apply(V.prob,1,order,decreasing=TRUE)[1,])
  • 複数の選択肢があって、それらが帰結をもたらす確率分布を推定し、その比較をして優劣を決める(治療法の選択)のような場合は、「帰結(猛獣)の出現確率」に対して、「私」は猛獣Aなら必ず勝ち、猛獣Bなら必ず負ける、という設定に対応しており、上記の枠組みの特殊制約系になっていることにも注意