我使用以下方法从mydata创建了一个邻居列表:
邻居< - get.knn(mydata,k = 5)
它看起来像这样:
[,1] [,2] [,3] [,4] [,5]
[1,] 12 80 39 82 41
[2,] 133 52 10 58 150
[3,] 47 59 18 129 72
[4,] 48 150 84 162 155
[5,] 6 50 65 90 105
[6,] 50 90 65 54 105
[7,] 125 10 133 130 134
[8,] 9 93 49 95 53
[9,] 8 94 93 50 49
[10,] 125 7 131 98 58
[11,] etc ...
如何从此列表中创建邻接矩阵?
答案 0 :(得分:0)
以下是否有帮助:
让knn矩阵如下:
lines <- "
12 80 39 82 41
133 52 10 58 150
47 59 18 129 72
48 150 84 162 155
6 50 65 90 105
50 90 65 54 105
125 10 133 130 134
9 93 49 95 53
8 94 93 50 49
125 7 131 98 58
"
t <- read.table(text=lines,header=FALSE)
并且有一个稀疏矩阵:
library('Matrix')
m <- Matrix(0,nrow=200,ncol=200,sparse=TRUE)
现在更新最近邻居的每个元素,以获得显示最近邻居的矩阵:
for (i in 1:dim(t)[1]) {
for (j in 1:dim(t)[2]) {
m[i,t[i,j]] = 1
}
}
> m
200 x 200 sparse Matrix of class "dgCMatrix"
[1,] . . . . . . . . . . . 1 . . . . . . . . . . . . . . . . . . . . . . . . . . 1 . 1 . . . . . . . . . . . . . . . . ......
[2,] . . . . . . . . . 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 . . . . . ......
[3,] . . . . . . . . . . . . . . . . . 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 . . . . . . . . . . ......
[4,] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 . . . . . . . . . ......
[5,] . . . . . 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 . . . . . . . ......
[6,] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 . . . 1 . . . ......
[7,] . . . . . . . . . 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ......
[8,] . . . . . . . . 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 . . . 1 . . . . ......
[9,] . . . . . . . 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 . . . . . . . ......
..............................
........suppressing columns and rows in show(); maybe adjust 'options(max.print= *, width = *)'
..............................
[193,] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ......
[194,] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ......
[195,] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ......
[196,] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ......
[197,] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ......
[198,] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ......
[199,] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ......
[200,] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ......
答案 1 :(得分:0)
您可以使用双模式社会矩阵来创建邻接矩阵。这是一个详细的例子。
lines <- "
12 80 39 82 41
133 52 10 58 150
47 59 18 129 72
48 150 84 162 155
6 50 65 90 105
50 90 65 54 105
125 10 133 130 134
9 93 49 95 53
8 94 93 50 49
125 7 131 98 58
"
df <- read.table(text = lines, header = FALSE)
# create groups of neighboring
df <- cbind(df, group = rownames(df))
df <- reshape2::melt(df, id.vars = "group")
df <- df[, c(3, 1)]
df # each value is now associated to at least one group
# create a 2-mode sociomatrix
mat.2mode <- table(df)
mat.2mode # group(s) of each value
# create adjacency matrix as product of the 2-mode sociomatrix
adj.mat <- mat.2mode %*% t(mat.2mode)
adj.mat # final adjacency matrix
# if you want the diagonal to be 0
# diag(adj.mat) <- 0
希望有所帮助。