- こちらの続き
- グラフにはノードとエッジがある
- 今、連結されたノードについて考える
- エッジは2つのノードの関係を表していると見る
- エッジで直接つながっていない2ノードについて、2通りの見方をすることができる
- 直接につながっていない→関係がない
- 直接につながっていないけれども、パスはある→パスが関係を表している
- 後者で考える
- すべてのノードが相互にパスを持っているようなグラフのノードペア間の最短距離の行列(最短距離行列)を考えよう
- 今、あるノードのセットがあって、そのノードセットに関して2つの全域グラフ(すべてのノードペア間にパスがある)があるときに、その2つのグラフの違いを、そのグラフの最短距離行列を用いて
- で表すことにする
- ここで、最短距離行列は、有向であることを仮定し(無向であっても、対称行列であると便宜上、仮定し)ておこう
- このような統計量を「最短距離行列差総和」とでも呼ぶことにする
- 「最短距離行列差総和」が統計量として、いい感じ、であるためには、単純な2グラフを比較したときに納得しやすい結果が得られることが最低限、満足されるべき条件である
- 単純な2つのグラフ、と言えば、どちらも1本鎖なグラフの場合がよいだろう
- 縦軸と横軸に値が取れる。これが相互に「よく似ている」というのは、グラフ1の値(横軸)とグラフ2の値(縦軸)との線形回帰とか、その上での相関とかの良しあしのことである
N<-100
X1<-sort(runif(N))
X2<-sort(runif(N))
plot(X1,X2,type="l")
- では、このような場合に、線形相関の残差の平方和と、先に挙げた「最短距離行列差総和」とが、「まあまあ、いい感じ」になっていたらよいわけで、それを確かめてみる
N<-100
X1<-sort(runif(N))
X2<-sort(runif(N))
plot(X1,X2,type="l")
OriX1<-X1/(max(X1)-min(X1))
OriX2<-X2/(max(X2)-min(X2))
Niter<-100
S1<-S2<-rep(0,Niter)
for(j in 1:Niter){
X1<-OriX1
X2<-OriX2
n<-sample(1:N,1)
s<-sample(1:n)
X2[1:n]<-X2[s]
M1<-M2<-matrix(0,N,N)
for(i in 1:(N-1)){
M1[i,i+1]<-abs(X1[i+1]-X1[i])
M2[i,i+1]<-abs(X2[i+1]-X2[i])
}
g1<-graph.adjacency(M1,weighted=TRUE)
g2<-graph.adjacency(M2,weighted=TRUE)
sh.path1<-shortest.paths(g1)
sh.path2<-shortest.paths(g2)
diff.path<-sh.path1-sh.path2
S1[j]<-sum(abs(diff.path))
lm.out<-lm(X2~X1)
S2[j]<-sqrt(sum((X2-lm.out[[5]])^2))
}
plot(S1,S2)