来自邻近列表的R邻接矩阵

时间:2017-10-28 09:35:24

标签: r knn adjacency-matrix

我使用以下方法从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 ...

如何从此列表中创建邻接矩阵?

2 个答案:

答案 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 

希望有所帮助。