- 昨日の記事で階層化したルールに基づく順序が正単体空間で折れ線になる話しを書いた
- 線形代数的にはどう書けばよいだろうか?
- 複数のルールは正単体空間座標との一次線形式で表されるとすれば、複数のルールを行列の演算で表すことができる
- ルールが階層化しているというのは、ルールの適用順序があって、先のルールの結果に依存して次のルールの適用結果が決まる、ということ
- 特に、「決断」の場合には是か非かのブーリアンだから、行列で表されたすべてのルールの評価結果をブール値にして、そこにブール演算を入れればよいことがわかる
- やってみる
k <- 3
n <- 4
library(MCMCpack)
true.prob <- rdirichlet(k,rep(100,n))
n.iter <- 10000
history <- array(0, c(n.iter,k,n))
history[1,,] <- 0
rules <- function(m,x){
mx <- m %*% x
tmp <- matrix(0,length(mx[,1]),length(mx[1,]))
for(i in 1:length(x[1,])){
tmp2 <- which(mx[,i] == max(mx[,i]))
tmp[tmp2,i] <-1
}
tmp3 <- apply(tmp,1,cumprod)
tmp4 <- apply(tmp3,2,sum)
which(tmp4 == max(tmp4))
}
m <- matrix(runif(12),3,4)
x <- matrix(c(1,1,0,0,1,0,0,0,0,0,1,0),nrow=4)
rules(m,x)
n.pt <- 10
for(i in 2:n.iter){
history[i,,] <- history[i-1,,]
rs <- list()
for(j in 1:k){
rs[[j]] <- rdirichlet(n.pt,history[i-1,j,]+1)
}
selected <- rep(0,k)
for(j in 1:n.pt){
tmp <- matrix(NA,k,n)
for(jj in 1:k){
tmp[jj,] <- rs[[jj]][j,]
}
tmp2 <- rules(tmp,x)
selected[tmp2] <- selected[tmp2]+1
}
selected.option <- sample(1:k,1,prob=selected/sum(selected))
selected.state <- sample(1:n,1,prob=true.prob[selected.option,])
history[i,selected.option,selected.state] <- history[i,selected.option,selected.state] + 1
}
history.2 <- history[,1,]
for(i in 2:k){
history.2 <- cbind(history.2,history[,i,])
}
par(mfcol=c(1,2))
matplot(history.2,type="l")
plot(apply(history.2[501:n.iter,c(1,2,5,6,9,10)],1,sum))
abline(min(apply(history.2[501:n.iter,c(1,2,5,6,9,10)],1,sum)),max(apply(true.prob[,1:2],1,sum)))