前回の続きで、卓球などで試合はダブルスばかりだったり、シングルと統合したい場合に使えると思う。
核はペアの場合のrateを
rate[x]+rate[y]+rate_two[x,y]
と分けて、rate_two(x<yの順序集合)はプラスマイナス200程度になる希望を事前分布に押し込んだ事。
使わない(x,x)や(3,1)などをゼロにする事前分布はなぜか全くうまくいかなかった。つねにx側が勝つ(=inv_logit[p]もほぼ1)なのに、何故か五分五分になりたがるみたいな。
library(rstan)
scode="
data{
int N;
int M;
int x[N,2];
int y[N,2];
int one[N];
}
parameters {
real rate[M];
real rate_two[M,M];
}
transformed parameters {
real p[N];
real tmp1;
real tmp2;
real b=0.00575364;
for(i in 1:N){
tmp1=rate[x[i,1]]+rate[x[i,2]]+rate_two[x[i,1],x[i,2]];
tmp2=rate[y[i,1]]+rate[y[i,2]]+rate_two[y[i,1],y[i,2]];
p[i]=inv_logit(b*(tmp1-tmp2));
//print(rate_two[1,1])
print(p[i])
}
}
model{
rate~normal(1500,500);
//rate~normal(0,0.0001);
//b=0.00575364;
for(i in 1:M){
for(j in 1:M){
if(i<j){
rate_two[i,j]~normal(0,500);
}else{
//rate_two[i,j]~normal(1500,500);
rate_two[i,j]~normal(0,500);
}
}
}
//rate_two~normal(0,100);
//one~berounulli(p);
for(i in 1:N){
one[i]~bernoulli(inv_logit(p[i]));
}
}
"
d=c(1,2,3,4,
1,4,2,3,
2,3,4,5,
2,3,1,5,
1,3,2,5,
2,3,1,4,
1,5,2,4
)
d2=c(1,2,3,4,
1,4,2,3,
2,3,4,5,
2,3,1,5,
1,3,2,5,
1,2,4,5,
1,3,4,5
)
d3=c(1,2,3,4,
1,2,3,4,
1,3,2,4,
1,3,2,5,
1,2,3,5,
1,2,3,4,
2,3,4,5,
2,3,1,4
)
dsingle=c(1,1,2,2,
1,1,3,3,
2,2,3,3,
2,2,4,4,
3,3,4,4,
1,1,2,2,
1,1,3,3,
2,2,3,3,
2,2,4,4,
3,3,4,4
)
df=matrix(d3,ncol=4,byrow = T)
x=df[,1:2]
y=df[,3:4]
M=max(df)
lst=list(N=nrow(x),x=x,y=y,M=max(df),one=rep(1,nrow(x)))
fit=stan(model_code = scode,data=lst,
chain=1,iter=500,warmup = 80)
la=extract(fit)
rate=apply(la$rate,2,mean)
M=max(df)
rate_two=matrix(0,M,M)
for(i in 1:M){
for(j in 1:M){
rate_two[i,j]=mean(la$rate_two[,i,j])
}
}
print(rate_two)
[,1] [,2] [,3] [,4] [,5]
[1,] -12.471779 113.325409 84.967680 -35.935146 30.57404
[2,] -15.944763 28.629781 33.380074 -8.663292 -28.67175
[3,] -28.933494 -57.394162 -31.988833 -91.035994 -41.68916
[4,] 11.050791 -9.301574 -6.932745 17.611705 -14.15838
[5,] 6.273119 3.523987 32.405800 -8.521642 -32.16282
print(rate)
[1] 1629.242 1578.852 1507.623 1329.176 1386.851
基本的に1が1番強いようにつくり、d3は(1,2)のペアが最強だが1は4と組んだときに弱くなるのが出ていると思う。
同じノリで対戦相手の相性はaisho[xa,xb,ya,yb]とすれば良いと思う。