如何使用JMdist(varSel,R)进行Jeffries-Matusita光谱距离分析(Arcgis MLCMap:3个频段,23个等级)

kqhtkvqz  于 2023-03-15  发布在  其他
关注(0)|答案(1)|浏览(649)

我需要对R中的光谱可分性执行Jeffries-Matusita距离分析。我正在使用Arcgis,我想知道哪些类的统计数据(mean,sd,covariance matrix)被用在JMdist函数中。我一直在尝试,但我一直只得到NA的向量,该向量应该表示所有类组合的JM距离,我相信这是因为我没有使用正确的信息来运行函数。

wqsoz72f

wqsoz72f1#

杰弗里斯-松下JM距离使用Bhattacharyya指数度量一对概率分布之间的可分性。在遥感问题中,JM距离通常用于度量两组之间的光谱可分性(例如两个土地使用/土地转换类别)。因此,待评估的变量是光谱带。2这样你就可以得到使两个类之间的光谱可分性最大化的光谱带。
关于JM距离的一个重要问题是JM距离有两个版本。
原始JM距离定义为:

JMd_ij =√2(1-e^(-B_ij))

其中 B_ij 是分布 i 和分布 j 之间的巴塔查里亚“距离”。因此,JM距离可以在 [0,√2] 范围内取值。
然而,各种遥感手册和软件包,如SCP-Qgis使用以下公式:

JMd_ij =2(1-e^(-B_ij))

例如Richards & Jia (2006)的手册使用了这个版本。根据这个方程,JM距离可以取 [0,2] 范围内的值。这个差异很重要,因为应用平方根会使可分性值〉1变小,而值〈1变大。
因此,定义使用哪个版本的JM距离来报告结果是很重要的,特别是当您想将结果与其他研究的结果进行比较时。
varSel包使用JMd_ij =√ 2(1-e^(-Bij)),如其源代码所示:View(JMdist) .
你可以修改代码,使用理查兹& Jia(2006)的公式,如下所示:

JMdist_Richards_Jia_2006 <- function (g, X) 
{
  # Jeffries-Matusita Distance used in Richards & Jia (2006).
  
  # JM_ij = = √ 2(1-e^(-B_ij))
  # where B_ij is the Bhattacharyya "distance" between i and j.
  
  # Source:
  ## https://link.springer.com/book/10.1007/978-3-642-30062-2
  
  X <- as.matrix(X)
  nfeat <- ncol(X)
  nclass <- length(unique(g))
  mu <- by(X, g, colMeans)
  Cov <- by(X, g, stats::cov)
  ncomb <- t(utils::combn(unique(g), 2))
  Bhat <- c()
  jm <- c()
  for (j in 1:nrow(ncomb)) {
    mu.i <- mu[[ncomb[j, 1]]]
    cov.i <- Cov[[ncomb[j, 1]]]
    mu.j <- mu[[ncomb[j, 2]]]
    cov.j <- Cov[[ncomb[j, 2]]]
    if (nfeat == 1) {
      Bhat[j] <- (1/8) * t(mu.i - mu.j) %*% (solve((cov.i + 
                                                      cov.j)/2)) %*% (mu.i - mu.j) + 0.5 * log((((cov.i + 
                                                                                                    cov.j)/2))/(sqrt(((cov.i)) * ((cov.j)))), base = exp(1))
    }
    else {
      Bhat[j] <- (1/8) * t(mu.i - mu.j) %*% (solve((cov.i + 
                                                      cov.j)/2)) %*% (mu.i - mu.j) + 0.5 * log(det(((cov.i + 
                                                                                                       cov.j)/2))/(sqrt((det(cov.i)) * (det(cov.j)))), 
                                                                                               base = exp(1))
    }
    jm[j] <- 2 * (1 - exp(-Bhat[j]))
  }
  return(list(classComb = ncomb, jmdist = jm))
}

最后,如源代码所示,JMdist使用cov() R函数计算协方差矩阵。

相关问题