phomパッケージ in R

  • CRANのphomページ
  • phomパッケージが準拠しているのは、こちらのToplogy and Data by G. Carlsson
  • phomパッケージがすること
    • 空間の点の集合として得られたデータを用いる
    • (単体的)複体を構成
    • 複体のホモロジーを計算する
  • phomパッケージの複体構成法
    • Vietoris-Rips
    • Lazy-Witness
  • Vietoris-Rips
    • 2点間の「距離」が指定値以下であるような2点間のみを連結する
    • できた森から(単体的)複体の条件に合うように、2次元以上の複体の構成を決める
  • Lazy-Witness
    • Vietoris-Ripsよりノイズの影響に対して強い
    • 比較的少数の代表点がトポロジーを決めるのでは、という考えに基づいた構成法
    • ある閾値によって、「入っている・入っていない」の判断をしながら構成する
    • 構成しながら、「すでに構成体に入っている点」は相手にせず、作業行程でつながっていない点を入れていく
  • Homologyを計算する
  • Homology計算では
    • dim 0は位相空間の数、dim 1は、穴、dim 2はさらに高次の穴…
    • interval値が大きいほど「本物らしさ」が大きい
  • 2次元円の中空の度合いを変化させたときの、次元別のintervalの値の変化を見よう
    • 右に行くにつれ、円周になっていく
    • 最上段はその様子
    • 中段は、dim 0 のinterval
    • 下段は、dim 1 のinterval
    • 一つながりの位相空間であることは、dim 0 のintervalが比較的大きいものが1つだけある(しかも、中空の程度に寄らず)ことが示されている
    • dim 1(円)が一つあることが、右に行くほど確実になっていることがdim 1のintervalの大きくなることで示されている


  • 3次元球とその中空化。点の数が少ないと、3次元球の中空というよりも、2次元円がたくさんある(3次元球面上の円がたくさん見つかる)ような推定結果になる(Npt=100とかだと)
  • 点の数を増やすとdim 2 が1つ見つかるようになる

library(phom)

# 球、中空球
k<-2 # 空間の次元
Npt<-100 # 点の数

# 外側の円の半径
r1<-1
# パラメタ化する内側の円の半径
r2s<-seq(from=0,to=1,length=5)
# pHom()関数での閾値
max.dim<-2
max.f<-0.7
intervals<-list()
par(ask=FALSE)
par(mfcol=c(3,5))
for(i in 1:length(r2s)){
	r2<-r2s[i]
	rs<-runif(Npt,min=r2,max=r1)
	d<-matrix(rnorm(k*Npt),ncol=k)
	d<-d/sqrt(apply(d^2,1,sum))*rs
	intervals[[i]]<-pHom(d,max.dim,max.f,mode="lw",metric="euclidean")
	plot(d)
	for(j in 0:max.dim){
		title.st<-paste("dim",j)
		plotBarcodeDiagram(intervals[[i]],j,max.f,title=title.st)
	}

}
par(mfcol=c(1,1))
# 外側の円の半径
r1<-1
# パラメタ化する内側の円の半径
r2s<-seq(from=0,to=1,length=5)
# pHom()関数での閾値
max.dim<-2
max.f<-0.8
intervals<-list()
par(ask=FALSE)
par(mfcol=c(2,5))
for(i in 1:length(r2s)){
	r2<-r2s[i]
	rs<-runif(Npt,min=r2,max=r1)
	d<-matrix(rnorm(k*Npt),ncol=k)
	d<-d/sqrt(apply(d^2,1,sum))*rs
	intervals[[i]]<-pHom(d,max.dim,max.f,mode="lw",metric="euclidean")
	plot(d)
	for(j in 0:max.dim){
		title.st<-paste("dim",j)
		#plotBarcodeDiagram(intervals[[i]],j,max.f,title=title.st)
		

	}
	plotPersistenceDiagram(intervals[[i]],max.dim,max.f,title=title.st)
}
par(mfcol=c(1,1))
# 3次元にしてみる
library(phom)

# 球、中空球
k<-3 # 空間の次元
Npt<-500 # 点の数

# 外側の円の半径
r1<-1
# パラメタ化する内側の円の半径
r2s<-seq(from=0,to=1,length=5)
# pHom()関数での閾値
max.dim<-k
max.f<-0.6
intervals<-list()
par(ask=FALSE)
par(mfcol=c(2,5))
for(i in 1:length(r2s)){
	r2<-r2s[i]
	rs<-runif(Npt,min=r2,max=r1)
	d<-matrix(rnorm(k*Npt),ncol=k)
	d<-d/sqrt(apply(d^2,1,sum))*rs
	intervals[[i]]<-pHom(d,max.dim,max.f,mode="lw",metric="euclidean")
	plot(d)
	for(j in 0:max.dim){
		title.st<-paste("dim",j)
		#plotBarcodeDiagram(intervals[[i]],j,max.f,title=title.st)
		

	}
	plotPersistenceDiagram(intervals[[i]],max.dim,max.f,title=title.st)
}
par(mfcol=c(1,1))