- ある点から等距離にある点の集合は(超)球をなす
- 相互に等距離にあるk個の点はk-1次元空間に配置することができて、それは(正)単体をなす(正三角形・正四面体・・・一般化)
- 今、k次元空間にある、単位超球(半径1の球)面の点を位置座標とするk次元ベクトルを考える
- このk次元ベクトルは互いにとなっているとする
- このようなベクトルは、最大でk本作ることができる
- k-1本を作ることも容易である
- k本、k-1本それぞれを作ってみる
- それらは、単位(超)球面上にある正単体となっている
- 正単体の連結する2辺は(正三角形の一部なので)60度の角をなす
ip<-function(x,y){ #内積
sum(x*y)
}
angle<-function(x,y){ # cosine
ip(x,y)/sqrt(ip(x,x)*ip(y,y))
}
# 正単体の頂点座標
CategoryVector<-
function (nc = 3)
{
df <- nc - 1
d <- df + 1
diagval <- 1:d
diagval <- sqrt((df + 1)/df) * sqrt((df - diagval + 1)/(df -
diagval + 2))
others <- -diagval/(df - (0:(d - 1)))
m <- matrix(rep(others, df + 1), nrow = df + 1, byrow = TRUE)
diag(m) <- diagval
m[upper.tri(m)] <- 0
as.matrix(m[, 1:df])
}
k<-10
r<-0.8
R<-sqrt(1/k*(r^2*(k-1)+1))
A<-cbind(rep(R,k),CategoryVector(k)*sqrt(1-R^2))
A # k個作成
B<-cbind(rep(r,k-1),diag(rep(sqrt(1-r^2),k-1)))
B # k-1 個作成(直交座標を使うので、こちらの方が簡単(だけれど本数が1本少ない)
# r^2になる
angle(A[1,],A[2,])
angle(B[1,],B[2,])
# 0.5が返る→角度が1/3 pi
angle((A[1,]-A[2,]),(A[1,]-A[3,]))
angle((B[1,]-B[2,]),(B[1,]-B[3,]))