特異値分解による部分座標化

  • df次元空間にk個の点がある
  • k個の点はk-1次元空間に納めることができる
  • k-1次元の基底df次元空間に取ることで、k個の点の座標をk-1次元座標に置き換えることができる
  • それを特異値分解で行う話
# たとえば
# 空間の次元
df<-6
# 点の数
k<-4
# 点の座標を作る
RR<-matrix(rnorm(df*k),ncol=df)
# 点の位置ベクトルのノルムと位置ベクトルペアの内積を計算する
out1<-RR%*%t(RR)
# 特異値分解
svd.out<-svd(t(RR))
# 特異値分解の結果と、点の元の座標を用いて
# k次元座標にする
RR2<-RR%*%svd.out[[2]]
# そのノルムとペア内積
out2<-RR2%*%t(RR2)
# 見てみる
print(RR)
print(RR2)
# df次元とk次元とで差がない
print(range(out1-out2))
# k点がk次元座標になっているので、そのうちの1点を原点に取り直せばk-1次元になる
# そうなっていることを何度も確かめる回数
Niter<-100
# 確かめるループ
for(i in 1:Niter){
	# 空間の次元をループのたびに適当に取る
	df<-sample(2:20,1)
	# 点の数をループのたびに適当に取る
	k<-sample(2:df,1)
	# 点の座標を作る
	RR<-matrix(rnorm(df*k),ncol=df)
	# 点の位置ベクトルのノルムと位置ベクトルペアの内積を計算する
	out1<-RR%*%t(RR)
	# 特異値分解
	svd.out<-svd(t(RR))
	# 特異値分解の結果と、点の元の座標を用いて
	# k次元座標にする
	RR2<-RR%*%svd.out[[2]]
	# そのノルムとペア内積
	out2<-RR2%*%t(RR2)
	# df次元とk次元とで差がない
	print(range(out1-out2))
}