- 関係するのはこちらの話しやこちらの話し
- 2次元での角度について
- 2次元平面に原点を中心とする単位円を置き、単位円周上に2点を取る
- 2点を結ぶ弧の長さは、円の中心と円周上の点を結んでできる2つの半径がなす角を用いて、と表される
- 円周の1周分の「弧」はとされる
- 円周全体に対応する角度を1としたときの「角度の大きさ」は
- のときは直角に対応する
- これをと書くことにする
- 一般次元での角度について
- k次元空間に原点を中心とする単位球を置き、単位球面上にk点を取る
- 話を簡単にするために、k個の点が作るk個の位置ベクトルは線形独立であるとする
- k点が単位球面上に切り取る部分球面の「(長さ〜面積〜)体積」をとする
- 球全体の表面積は
- 次元のときのように、球面全体に対応する相対値を定める
- このとき、をk本の単位ベクトルの「角度」としをその相対値と考える
- k本の単位ベクトルがすべて相互に直交しているとき、となる
- 相互に独立とは限らないk個の要素の相互関係を定量することにしよう
- ペアワイズな「相関」を見るとすればペアについて「相関」の程度を量で表すことになる
- ペアワイズに限らないとすれば要素数k個の集合のべき集合の要素数について考慮することになる
- べき集合のうち、空集合と要素数1個の集合は「関係」に関する情報を持っているわけではないとして除外することにすれば、個の「関係の強さの量」を問題にすればよいことになる
- 次元空間の個の単位ベクトルによって、要素を表すことができれば、上記の考え方によって、べき集合の要素ごとに、「多次元弧」の「長さ〜面積〜体積」を知ればよいことになる
- この計算方法が知られているのかいないのか、知らないけれど(球面三角形(こちらとか、こちらとか、の面積の一般化のはず(こちらのHyperspherical volume elementとか???))、モンテカルロ的に知ることはできそうだ
library(sets)
library(GPArotation)
library(MCMCpack)
PerpFoot<-function(V,A,P=NULL){
if(is.null(P))P<-rep(0,length(A))
x<-solve(V%*%t(V))%*%V%*%(A-P)
B<-P+t(V)%*%x
return(list(X=B,k=x))
}
SolidAngle<-function(M,Niter=10000){
k<-length(M[1,])
s<-as.set(1:k)
S<-set_power(s)
Smat<-matrix(0,2^k,k)
cnt<-1
for(i in S){
tmp<-as.integer(i)
Smat[cnt,tmp]<-1
cnt<-cnt+1
}
sumSmat<-apply(Smat,1,sum)
R.sp<-RandomSphere(df=k,r=1,n=Niter)
Insides<-rep(0,2^k)
for(i in (1+k+1):(2^k)){
foot<-PerpFoot(M[which(Smat[i,]==1),],t(R.sp))
tmp<-(foot$k)>=0
tmp2<-apply(tmp,2,prod)
Insides[i]<-sum(tmp2)/length(tmp2)
}
Insides2<-Insides*(2^sumSmat)
return(list(Insides=Insides,InsidesRatio=Insides2))
}
k<-5
M<-Random.Start(k)
out<-SolidAngle(M,Niter=10000)
par(mfcol=c(1,2))
plot(out$Insides)
plot(out$InsidesRatio)
par(mfcol=c(1,1))
out$InsidesRatio[(k+2):(k+1+k*(k-1)/2)]
M%*%t(M)
cos(out$InsidesRatio[(k+2):(k+1+k*(k-1)/2)]*pi/2)
- とはいえ、k次元空間のk本の単位ベクトルはペアワイズな角度の情報だけを使って、再構成できるから、自由度はのはずで、ペアワイズな角度のみから、すべての、より高次な「面積〜体積」は求められるはずなのだが…
k<-4
R<-matrix(rnorm(k^2),k,k)
R<-R/sqrt(apply(R^2,1,sum))
T<-R%*%t(R)
X<-matrix(0,k,k)
X[1,1]<-1
for(i in 2:k){
tmp<-X[1:(i-1),1:(i-1)]
tmp2<-solve(tmp)
y<-tmp2%*%T[i,1:(i-1)]
y2<-sqrt(1-sum(y^2))
X[i,1:i]<-c(y,y2)
}
X