正単体のメモ

  • n-正単体は、n-次元空間にある、頂点数n+1の正単体
  • 重心から頂点までの距離が1であるようなそれを考える
  • n+1次元にn-正単体を置くには、n+1個のデカルト座標軸上に(0,...,0,\sqrt{\frac{n}{n-1}},0,...,0)のように頂点を取ることで作成できる
    • 重心は(\sqrt{\frac{n}{n-1}}\frac{1}{n}=\sqrt{\frac{1}{n(n-1)}},...)であるので、確かにこの重心からの距離が1であることを確かめることは容易である
    • このようなn+1次元座標の正単体の重心を原点に移動すると…
    • (\sqrt{\frac{n-1}{n}},-\sqrt{\frac{1}{n(n-1)}},-\sqrt{\frac{1}{n(n-1)}},...)、または(\frac{n-1}{\sqrt{n(n-1)}},-\frac{1}{\sqrt{n(n-1)}},-\frac{1}{\sqrt{n(n-1)}},...)というような頂点座標になる
make.simplex.n1 <- function(n){
	ret <- matrix(-1/sqrt(n*(n-1)),n,n)
	diag(ret) <- (n-1)/sqrt(n*(n-1))
	ret
}

make.simplex.n1(4)
  • 他方、n次元にこれと同じ大きさのn-正単体を置くと…
    • ちなみに、n+1次元座標だけれど、第n+1番目の座標が0となるのも、n次元に置いたことと同じなので、そのようにしてみる
    • 回転行列を作る
# 正単体に関連する、ちょっとした関数
CategoryVector<-function (d = 3){
	df <- d - 1
	diagval <- 1:d
	diagval <- sqrt((d)/df) * sqrt((d - diagval)/(d - diagval + 1))
	others <- -diagval/(d - (1:d))
	m <- matrix(rep(others, d), nrow = d, byrow = TRUE)
	diag(m) <- diagval
	m[upper.tri(m)] <- 0
	as.matrix(m[, 1:df])
}
rotation.simplex <- function(k){
	cv <- CategoryVector(k)
	rbind(t(cv*sqrt(1-1/k)),rep(1/sqrt(k),k))
}
R <- rotation.simplex(4)
A <- make.simplex.n1(4)
R %*% A -> B
B
apply(B^2,2,sum)
t(B) %*% B