R矩阵中相似邻域值的检测

R矩阵中相似邻域值的检测,r,R,我有一个10x10的矩阵,其中有0和1,而1通常是聚集在一起的。我试图将1的簇提取到它们自己的矩阵列表中。解释:这是我的起始矩阵: field <- matrix(0,10,10) field[3:4,3:4]<-1 field[6:7,7]<-1 field[7:8,8]<-1 field[8,6]<-1 field [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [1,] 0 0 0

我有一个10x10的矩阵,其中有0和1,而1通常是聚集在一起的。我试图将1的簇提取到它们自己的矩阵列表中。解释:这是我的起始矩阵:

field <- matrix(0,10,10)
field[3:4,3:4]<-1
field[6:7,7]<-1
field[7:8,8]<-1
field[8,6]<-1
field
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    0    0    0    0    0    0    0    0    0     0
[2,]    0    0    0    0    0    0    0    0    0     0
[3,]    0    0    1    1    0    0    0    0    0     0
[4,]    0    0    1    1    0    0    0    0    0     0
[5,]    0    0    0    0    0    0    0    0    0     0
[6,]    0    0    0    0    0    0    1    0    0     0
[7,]    0    0    0    0    0    0    1    1    0     0
[8,]    0    0    0    0    0    1    0    1    0     0
[9,]    0    0    0    0    0    0    0    0    0     0
[10,]   0    0    0    0    0    0    0    0    0     0

我甚至不知道如何在概念上做到这一点。是否存在用于相关目的的任何类型的软件包,或任何人可以为此提供的任何帮助/解释?还是根本不可能?谢谢你的帮助

首先,您需要定义相似性度量。关于这一点,没有什么可担心的

一个简单的方法是计算

比如说

# Generate the matrix
field <- matrix(0,10,10)
field[3:4,3:4]<-1
field[6:7,7]<-1
field[7:8,8]<-1
field[8,6]<-1

# Our similarity function, adapt as needed    
simil <- function(m1, m2)
  {
  # Check dimensions are the same
  if (any(dim(m1) != dim(m2)))
    stop(paste("ERROR: matrices are not the same size: ",
               nrow(m1), "x", ncol(m1), "vs", 
               nrow(m2), "x", ncol(m2)))

  # Linearize the matrices
  m1 <- as.vector(m1)
  m2 <- as.vector(m2)

  # Cosine similarity
  similarity <- (m1%*%m2)/sqrt((m1%*%m1) * (m2%*%m2))

  return(similarity)
  }
我们现在生成所有可能的矩阵,我已经为循环使用了两个嵌套的
,这通常是低效的,但是对于小矩阵并不重要

field.len <- 4

subfields <- list()
i <- 1
for (col in (1:(ncol(field)-field.len+1)))
  {
  for (row in (1:(nrow(field)-field.len+1)))
      {
      submatrix <- field[row:(row+field.len-1),col:(col+field.len-1)] 

      # Discard zero matrices
      if (sum(submatrix) > 0)
        {
        subfields[[i]] <- submatrix
        i <- i+1
        }
      }
  }
两个不太相似的矩阵

> simil.matrix[10,5]
[1] 0.25
> subfields[[10]]
     [,1] [,2] [,3] [,4]
[1,]    0    0    0    0
[2,]    1    1    0    0
[3,]    1    1    0    0
[4,]    0    0    0    0
> subfields[[5]]
     [,1] [,2] [,3] [,4]
[1,]    0    0    0    0
[2,]    0    0    0    0
[3,]    0    1    1    0
[4,]    0    1    1    0
还有两个不同的

> simil.matrix[4,5]
[1] 0
> subfields[[4]]
     [,1] [,2] [,3] [,4]
[1,]    0    0    1    1
[2,]    0    0    0    0
[3,]    0    0    0    0
[4,]    0    0    0    0
> subfields[[5]]
     [,1] [,2] [,3] [,4]
[1,]    0    0    0    0
[2,]    0    0    0    0
[3,]    0    1    1    0
[4,]    0    1    1    0

可能有更好的方法,但这似乎是一个很好的开始。

相关:一旦定义了相似性(或距离)度量,您将遍历所有可能的子矩阵并找到最佳匹配。我会尝试一个迭代解决方案:取第一个
1
,然后增加周围的边框大小,直到它只包含零。提取子矩阵,将所有值设置为
0
,重复。集群的条件是什么?一组完全由对角、垂直或水平邻接连接的1,与任何其他1都没有邻接?是的,Spacedman,这正是我的意思。我有一个可能的解决方案,包括使用
igraph
创建具有对角连接的晶格图,删除与
字段==1
对应的图节点,然后在子图上循环。抱歉,这不是一个可行的解决方案,但可能会让您开始。
field.len <- 4

subfields <- list()
i <- 1
for (col in (1:(ncol(field)-field.len+1)))
  {
  for (row in (1:(nrow(field)-field.len+1)))
      {
      submatrix <- field[row:(row+field.len-1),col:(col+field.len-1)] 

      # Discard zero matrices
      if (sum(submatrix) > 0)
        {
        subfields[[i]] <- submatrix
        i <- i+1
        }
      }
  }
simil.matrix <- sapply(subfields, function(sf1)
  {
  res <- sapply(subfields, function(sf2)
    {
    res <- simil(sf1, sf2)

    res
    })

  res
  })
> simil.matrix[1,24]
[1] 0.8660254
> subfields[[1]]
     [,1] [,2] [,3] [,4]
[1,]    0    0    0    0
[2,]    0    0    0    0
[3,]    0    0    1    1
[4,]    0    0    1    1
> subfields[[24]]
     [,1] [,2] [,3] [,4]
[1,]    0    0    0    0
[2,]    0    0    0    0
[3,]    0    0    1    0
[4,]    0    0    1    1
> simil.matrix[10,5]
[1] 0.25
> subfields[[10]]
     [,1] [,2] [,3] [,4]
[1,]    0    0    0    0
[2,]    1    1    0    0
[3,]    1    1    0    0
[4,]    0    0    0    0
> subfields[[5]]
     [,1] [,2] [,3] [,4]
[1,]    0    0    0    0
[2,]    0    0    0    0
[3,]    0    1    1    0
[4,]    0    1    1    0
> simil.matrix[4,5]
[1] 0
> subfields[[4]]
     [,1] [,2] [,3] [,4]
[1,]    0    0    1    1
[2,]    0    0    0    0
[3,]    0    0    0    0
[4,]    0    0    0    0
> subfields[[5]]
     [,1] [,2] [,3] [,4]
[1,]    0    0    0    0
[2,]    0    0    0    0
[3,]    0    1    1    0
[4,]    0    1    1    0