- こちらの続き
- 多変量標準正規分布
- 複数の確率変数()があり、それらは相互に独立
- 個々の確率変数は、平均0、分散1の正規分布
- 原点からの距離の2乗に応じて、確率が一定割合で減じる分布
- 複数のが独立であるときの同時確率分布
- 同時確率は個々の変数の確率の積
- 距離の2乗が指数になっている関数(正規分布)は以下のことから、同時分布において、特徴的な挙動をする
- 個々の確率変数の分布が距離の2乗に応じており、距離の2乗が指数関数の指数になっていること、独立変数の同時確率は、各変数の確率の積であること、積は指数の和であること、ユークリッド距離はであることから、同時確率にしても、「距離」()を指数とした関数形であることがわかる
- 多変量(k変量)標準正規分布
- 同確率等高線はk次元球を描く(が等しい点の集合が球面)
- 変量間に相関があるときは、k次元楕円(楕球)を描く
- 多次元球と多次元楕球
- k次元球面上の点は、k個の相互に直交する軸への射影の長さを座標として表せる(正規直交座標)
- 正規直交座標軸は、k次元空間にて回転することができる
- 多次元球を正規直交座標の各軸について拡縮したものが多次元楕球であり、その逆も言える
- が球
- が楕球
- 回転を表す行列は、回転後の正規直交座標軸を表す単位ベクトルを列ベクトルとしたもの()
- 軸方向への拡縮を表す行列は、対角成分のみの行列で、対角成分は正。第i番対角成分の値は、第i番軸の拡縮率
- は楕円座標、は球座標
- 相関のある多次元(k変量)標準正規分布
- という観察がなされる確率密度の等高線が楕球で描かれているという
- その確率密度はのが相関のない多次元(k次元)標準正規分布でのそれ()である
- である
- 正規分布と任意分布とを対応させる
- は標準正規分布に従うものとする
- は何かしらの分布に従うものとする
- それぞれの累積確率密度がなる関係にあるとする
- ということ
- それぞれの確率密度分布は,と表すとする
- したがって、
- 多変量(k変量)任意分布
- は標準正規分布に従うものとする
- は何かしらの分布に従うものとする
- それぞれの累積確率密度がなる関係にあるとする
- それぞれの確率密度分布は,と表すとする
- したがって、
- この等式は、少なくとも、(独立なとき)には成立しているが、…この式変形でよいかな…
- 仮のRソース
multExp<-function(ys,lambdas,R){
if(!is.matrix(ys))ys<-matrix(ys,nrow=1)
ER = sin(pi*R/2)
ER.e=eigen(ER)
if(min(ER.e[[1]])<0){
print("Non-positive eigenvalue(s)!")
print("Calculation was forced by non-zero eigenvalue(s) to 0.000000001.")
}
ER.e.ori=ER.e
ER.e[[1]][ER.e[[1]]<0]=0.000000001
xs.el<-ys
for(i in 1:length(ys[1,])){
xs.el[,i]<-qnorm(pexp(ys[,i],1/lambdas[i]))
}
xs.sp<-t(ER.e[[2]]%*%(diag(1/sqrt(ER.e[[1]]))%*%(solve(ER.e[[2]])%*%t(xs.el))))
Pr.sp<-dnorm(xs.sp,log=TRUE)
Pr.el<-dnorm(xs.el,log=TRUE)
Pr.y<-dexp(ys,log=TRUE)
for(i in 1:length(ys[1,])){
Pr.y[,i]<-dexp(ys[,i],1/lambdas[i])
}
Pr<-exp(apply(Pr.sp-Pr.el+Pr.y,1,sum))
Pr.sp<-exp(apply(Pr.sp,1,sum))
Pr.el<-exp(apply(Pr.el,1,sum))
Pr.y<-exp(apply(Pr.y,1,sum))
return(list(ys=ys,lambdas=lambdas,R=R,ER.e.ori=ER.e.ori,ER=ER,xs.el=xs.el,xs.sp=xs.sp,Pr=Pr,Pr.sp=Pr.sp,Pr.el=Pr.el,Pr.y=Pr.y))
}
plotMultExp<-function(multExpOut,ax=c(1,2),slice=1,theta=80,phi=80){
PrArray<-array(multExpOut$Pr,c(length(tmpx),length(tmpx),length(tmpx)))
TArray1<-array(ys[,ax[1]],c(length(tmpx),length(tmpx),length(tmpx)))
TArray2<-array(ys[,ax[2]],c(length(tmpx),length(tmpx),length(tmpx)))
persp(TArray1[,1,slice],TArray2[1,,slice],PrArray[,,slice],theta=theta,phi=phi,col="green",xlab=ax[1],ylab=ax[2])
}
nV<-3
R<-matrix(0,nV,nV)
R[1,2]<-R[2,1]<-0.4
R[1,3]<-R[3,1]<-0.3
R[2,3]<-R[3,2]<-0.2
diag(R)<-1
tmpx<-seq(from=0,to=1,length.out=20)
tmpx[1]<-0.001
tmpy<-tmpx
tmpz<-tmpx
ys<-as.matrix(expand.grid(tmpx,tmpy,tmpz))
ysOrder<-as.matrix(expand.grid(1:length(tmpx),1:length(tmpy),1:length(tmpz)))
lambdas<-c(3,2,1)
multExpOut<-multExp(ys=ys,lambdas=lambdas,R=R)
multExpOut$ER.e
Pr<-multExpOut$Pr
Pr.Array<-Pr.sp.Array<-Pr.el.Array<-Pr.y.Array<-array(0,c(length(tmpx),length(tmpy),length(tmpz)))
for(i in 1:length(Pr)){
Pr.Array[ysOrder[i,1],ysOrder[i,2],ysOrder[i,3]]<-Pr[i]
Pr.sp.Array[ysOrder[i,1],ysOrder[i,2],ysOrder[i,3]]<-multExpOut$Pr.sp[i]
Pr.el.Array[ysOrder[i,1],ysOrder[i,2],ysOrder[i,3]]<-multExpOut$Pr.el[i]
Pr.y.Array[ysOrder[i,1],ysOrder[i,2],ysOrder[i,3]]<-multExpOut$Pr.y[i]
}
logPr.Array<-log(Pr.Array)
zlim<-c(min(logPr.Array),max(logPr.Array))
for(i in 1:length(tmpz)){
tmpi<-100+i
file.name=paste("test6",tmpi,".jpg",sep="")
jpeg(file=file.name)
filled.contour(logPr.Array[,,i],zlim=zlim)
dev.off()
}
library(rgl)
open3d()
logPr<-log(Pr)
plot3d(ys[,1],ys[,2],ys[,3],type="s",col=gray((max(logPr)-logPr)/(max(logPr)-min(logPr))))