首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >每对观测的Mahalanobis距离

每对观测的Mahalanobis距离
EN

Stack Overflow用户
提问于 2016-12-07 19:23:13
回答 1查看 1.1K关注 0票数 2

我正在试图计算dataset dat的每个观测之间的Mahalanobis距离,其中每一行都是一个观察,每一列都是一个变量。这种距离的定义是:

我写了一个函数来完成它,但我觉得它很慢。在R中有更好的方法来计算这个吗?

要生成一些数据来测试函数,请执行以下操作:

代码语言:javascript
复制
generateData <- function(nObs, nVar){
  library(MASS)
  mvrnorm(n=nObs, rep(0,nVar), diag(nVar))
  }

这是我到目前为止写的函数。对于我的数据(800个obs和90个变量),它们都可以工作,method = "forLoop"method = "apply"分别需要大约30秒和33秒的时间。

代码语言:javascript
复制
mhbd_calc2 <- function(dat, method) { #Method is either "forLoop" or "apply"
  dat <- as.matrix(na.omit(dat))
  nObs <- nrow(dat)
  mhbd <- matrix(nrow=nObs,ncol = nObs)
  cv_mat_inv = solve(var(dat))

  distMH = function(x){  #Mahalanobis distance function
    diff = dat[x[1],]-dat[x[2],]
    diff %*% cv_mat_inv %*% diff
  }

  if(method=="forLoop")
  {
    for (i in 1:nObs){
      for(j in 1:i){
        mhbd[i,j] <- distMH(c(i,j))
      }
    }
  }
  if(method=="apply")
  {
    mhbd[lower.tri(mhbd)] = apply(combn(nrow(dat),2),2, distMH)
  }
  result = sqrt(mhbd)
  colnames(result)=rownames(dat)
  rownames(result)=rownames(dat)
  return(as.dist(result))
}

注:我试过使用outer(),但速度更慢(60秒)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-07 19:34:52

你需要一些数学知识。

  1. 做一个Cholesky因子的经验协方差,然后标准化你的观察;
  2. 利用dist计算变换后的欧氏距离。
代码语言:javascript
复制
dist.maha <- function (dat) {
  X <- as.matrix(na.omit(dat))  ## ensure a valid matrix
  V <- cov(X)  ## empirical covariance; positive definite
  L <- t(chol(V))  ## lower triangular factor
  stdX <- t(forwardsolve(L, t(X)))  ## standardization
  dist(stdX)  ## use `dist`
  }

示例

代码语言:javascript
复制
set.seed(0)
x <- matrix(rnorm(6 * 3), 6, 3)

dist.maha(x)
#         1        2        3        4        5
#2 2.362109                                    
#3 1.725084 1.495655                           
#4 2.959946 2.715641 2.690788                  
#5 3.044610 1.218184 1.531026 2.717390         
#6 2.740958 1.694767 2.877993 2.978265 2.794879

结果与您的mhbd_calc2一致。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41025674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档