5

我想使用 k-means 聚类从自组织地图中对码本进行聚类。但是,鉴于数据的“空间”性质,我想限制聚类,以便只有连续的节点聚集在一起。看了一圈后,我决定尝试使用包skater中的功能spdep

这是我一直在做的一个例子。

# the 'codebook' data obtained from the self-organizing map. 
# My grid is 15 by 15 nodes. 
data <- data.frame(var1=rnorm(15*15, mean = 0, sd = 1), var2=rnorm(15*15, mean = 5, sd = 2))

# creating a matrix with all edges listed 
# (so basically one row to show a connection between each pair of adjacent nodes) 
require(spdep)
nbs <- cell2nb(nrow=15, ncol=15)

edges <- data.frame(node=rep(1:(tt.grid$xdim*tt.grid$ydim), each=4))
edges$nb <- NA 
for (i in 1:(tt.grid$xdim*tt.grid$ydim)) {   
   vals <- nbs[[i]][1:4]   
   edges$nb[(i-1)*4+1] <- vals[1]   
   edges$nb[(i-1)*4+2] <- vals[2]   
   edges$nb[(i-1)*4+3] <- vals[3]   
   edges$nb[(i-1)*4+3] <-
   vals[4] } 
edges <- edges[which(!is.na(edges$nb)),] 
edges$from <- apply(edges[c("node", "nb")], 1, min) 
edges$to <- apply(edges[c("node", "nb")], 1, max) 
edges <- edges[c("to", "from")]
edges <- edges[!duplicated(edges),] 
edges <- as.matrix(edges)

我知道上面的代码真的很笨拙而且不优雅(请多多包涵)。我尝试使用mstree(nb2listw(nbs))[,1:2],但它没有列出所有链接。我不确定我是否完全理解这是在做什么,所以我手动创建了我的边矩阵。

然后我尝试将此矩阵用于溜冰者功能

test <- skater(edges=edges, data=data, ncuts=5)

但我收到以下错误消息: Error in colMeans(data[id, , drop = FALSE]) : error in evaluating the argument 'x' in selecting a method for function 'colMeans': Error in data[id, , drop = FALSE] : subscript out of bounds

但是,如果我使用mstree边缘,我不会收到错误消息,但结果根本没有意义。

test <- skater(edges=mstree(nb2listw(nbs))[,1:2], data=data, ncuts=5)

非常感谢有关此错误消息的任何帮助(或有关如何进行我想做的空间受限聚类的替代建议)。

4

0 回答 0