矩阵的聚类(同质性测量)

机器算法验证 聚类 空间的
2022-03-25 00:23:02

我有一个 2 暗矩阵,我想知道所有较高的值都在左上角。我不能只将它投影到 R^3 中并使用标准聚类算法,因为我不想将值本身视为一个维度。

有没有我可以使用的算法?

编辑:

重新表述它,假设它就像

| 高价值...低价值 |
| ...
| 低值... ... |
| ...
| 高价值 .. 低价值 |

我想知道左上角和左下角有一个高值“集群”。

编辑2:

矩阵代表一个图像。每个单元格的值代表该坐标处物质的浓度。我想知道图像的均匀程度(即物质“混合在一起”的程度)。此外,我想知道非同质性(如果有的话)来自哪里。

4个回答

这个问题是关于空间相关性的。存在许多方法来表征和量化这一点。它们的共同点是将一个位置的值与附近位置的值进行比较。通常,参考分布是某种空间随机过程,其中数据是从点到点独立生成的(“完全空间随机性”)。一些方法仅描述平均行为,而另一些方法提供更详细的探索工具来识别极值集群。

对于三种不同的方法,请查看 (1) 关于地统计学/克里金法/变异法的文献;(2) 其他空间相关性度量,例如 Ripley 的 K 和 L 函数或Getis-Ord统计量Gi(3) 地理加权回归。可以在 ESRI.com 上找到对所有这些的可访问的、非技术的和某种正确的解释。不幸的是,维基百科的文章很少而且质量参差不齐。

前两种方法得到了 R 软件包的良好支持,例如spatstatgeoRglm(2) 也有免费软件,其中最著名的是GeodaCrimeStat我知道没有免费的 GWR 实现(#3),但是它的发明者维护了很好的资源。

您还可以考虑Moran's I,它在 R 包“ape”中提供。然后简单地使用基于距离的加权:

nRows <- 30
nCols <- 15

nPixels <- nRows * nCols

# Create a Random Image
image <- matrix(sample.int(256, nPixels, replace=TRUE),
                nrow=nRows, ncol=nCols) - 1L

# 1D to 2D Index Function
reverseIndex <- function ( vectorIdx, nRows, nCols )
{
  # If you're using row major for some odd reason, you'll
  # need to flip these.

  J <- floor((vectorIdx - 1L) / nCols)
  I <- (vectorIdx - 1L) - nCols*J

  # Return:
  c(I+1L, J+1L)
} 

# Distance Function
distFunc <- function(I, J)
{
  idx1 <- reverseIndex(I, nRows, nCols)
  idx2 <- reverseIndex(J, nRows, nCols)
  idDiff <- idx1 - idx2

  # Return:
  sqrt(idDiff %*% idDiff)
}

# Create Distance Matrix
matrix(mapply(distFunc, 
              rep(seq_len(nPixels), nPixels),
              rep(seq_len(nPixels), each=nPixels)),
       nrow=nPixels, ncol=nPixels)


# Invert Distance for Moran's I
invDist <- 1 / dist
diag(invDist) <- 0

# Compute Moran's I:
ape::Moran.I(as.vector(image), dist)

请注意,这将仅提供关联的度量和测试,它不会确定关联在您的矩阵中的位置。

好问题。找到“左上角的高值簇”(与相关性相反)的一种简单方法是将图像拆分为图块并查看图块均值。例如,

means of 100 x 100 tiles:
[[ 82  78  80  94  99 100]
 [ 80  53  66  62  80 100]
 [ 82  61  65  64  72  98]
 [ 87  83  99  81  80 100]
 [100 100 100 100 100 100]]

means of 50 x 50 tiles:
[[100  85  84 100  70  96 100 100 100 100 100]
 [ 83  59  57  71  67  88  89  86  98 100 100]
 [ 87  58  54  49  71  74  71  61  61 100 100]
 [100  76  58  52  59  61  55  59  65  95 100]
 [100  62  59  60  57  63  60  60  59  97 100]
 [100  68  65  59  59  82  76  61  61  70  95]
 [ 83  64  76  66  96 100  96  61  80  67 100]
 [100 100  97  92 100 100  84  82  83  88 100]
 [100 100 100 100 100 100 100 100 100 100 100]]

(每个图块中具有平均高度/颜色的图会好 10 倍)。

(如果您正在寻找图像中的特征,什么是“特征”?例如红色停止标志,如 用于特征表示的直方图中

我们的目标只是找出一个度量来告诉我们所有像素的混合程度。给定 2 个值分布完全相同的数据矩阵,如果第一个值在空间组中有序或聚集在一起,并且第二个值分散良好(高点不靠近其他高点,低点不靠近其他高点低),评估这种分散/结块的方法是什么?矩阵将具有完全相同的方差或标准差,因此这不是一个好方法。一个想法是使用 2D 傅里叶变换,因为更块状的图像直观地具有较低的频率,但我不确定这是否真的是这种评估的常见或有用的做法。