メモ

############
############
# のたくり雲作成 ここから
############
############

# サンプル数
Ns <- 200
# マーカー数
Nm <- 50
# サンプルのパターン数(群数)
Ns.pt <- Ns
# マーカーのパターン数(群数)
Nm.pt <- 5
# サンプル・マーカーの存在位置を多次元空間酔歩の道として作る
trail <- matrix(rnorm(Ns.pt*Nm.pt),Ns.pt,Nm.pt)
trail <- apply(trail,2,cumsum)
# 3次元分だけ見てみよう
library(rgl)
plot3d(trail[,1:3])
matplot(trail,type="l")
# パターン数(群数)ごとにいくつのサンプル、いくつのマーカーを帰属させるかをランダムに決める
library(MCMCpack)
ps <- rdirichlet(1,rep(1,Ns.pt))
pm <- rdirichlet(1,rep(1,Nm.pt))
ss <- sample(1:Ns.pt,Ns,replace=TRUE,prob=ps)
sm <- sample(1:Nm.pt,Nm,replace=TRUE,prob=pm)
# 行数=サンプル数、列数=マーカー数の行列
M <- trail[ss,sm]
# 少し乱す
M <- jitter(M,100)

############
############
# のたくり雲作成 ここまで
############
############

# 距離行列を作って

DD <- as.matrix(dist(M,diag = TRUE,upper = TRUE))
# ある基準距離より近いときにエッジを引き、そうでないときにはエッジを引かないことにする
# そのような隣接行列を作る
k <- mean(DD)/3
library(igraph)
DD.2 <- matrix(0,length(DD[,1]),length(DD[1,]))
DD.2[which(DD < k)] <-1
diag(DD.2) <- 0
# グラフオブジェクトにする
g2 <- graph.adjacency(DD.2,mode="undirected")
plot(g2)
# グラフの最大クリークを列挙する
max.cliques <- maximal.cliques(g2)
#all.cliques <- cliques(g2)

# クリークの関係を確認して、クリークをノードとしたときの隣接行列を作る

D.cliques <- matrix(0,length(max.cliques),length(max.cliques))
library(sets)
max.cliques.sets <- lapply(max.cliques,as.set)
for(i in 1:(length(max.cliques)-1)){
	for(j in (i+1) : length(max.cliques)){
		tmp_intersection <- set_intersection(max.cliques.sets[[i]],max.cliques.sets[[j]])
		if(!set_is_empty(tmp_intersection)){
			D.cliques[i,j] <- D.cliques[j,i] <- 1
		}
	}
}
# クリークをノードとするグラフを作る
g.cliques <- graph.adjacency(D.cliques,mode="undirected")
par(mfcol=c(2,2))
# データ点のグラフ
plot(g2)
# クリークのグラフ
coords.cl <- layout.kamada.kawai(g.cliques)
plot(g.cliques,layout=coords.cl)
# クリークのグラフ、ただしエッジを引かず、クリークの大きさをクリークに帰属するデータ点数に比例させる
size.cl <- unlist(lapply(max.cliques,length))
plot(coords.cl,cex = size.cl*0.1,pch=20)