【问题标题】:Compute row-wise Mahalanobis Distance by a predefined covariance matrix通过预定义的协方差矩阵计算逐行马氏距离
【发布时间】:2020-03-01 18:47:36
【问题描述】:

我的数据如下所示:

> data.table(vara = rnorm(10), varb = rnorm(10), centa = rnorm(10), centb = rnorm(10))
           vara        varb       centa       centb
 1:  1.00419673  0.69347399  1.01359426 -0.98483999
 2:  0.49754529  0.93508341 -0.05607498 -0.77689024
 3: -2.37846521  0.66655093  1.52329674  0.13905182
 4:  0.30811512  0.07880182 -0.06553791 -1.64129333
 5: -0.87033370 -0.52522052 -0.79229174  0.92361533
 6: -1.02852317  0.54176228  1.17719753 -1.90073183
 7:  0.50358147  1.09485983 -1.71104946  1.80488113
 8: -0.77273213  0.25078481  0.42496541  0.21571760
 9:  0.05100357 -0.56005040 -0.39855705  1.69918850
10: -0.34916896  0.15693242  1.30007343 -0.03628893

我想计算中心为 (centa, centb) 对 (vara, varb) 的马氏距离。协方差矩阵是预定义的。这将是一个 2x2 矩阵。我需要为每一行测量距离。

谢谢!

【问题讨论】:

    标签: r dataframe dplyr data.table


    【解决方案1】:

    由于它是一个 2x2 矩阵,因此求逆的成本不会太高。你可以试试

    Minv <- solve(matrix(c(1,0.2,0.2,1), nrow=2L))
    DT[, mah_dist := {
            x <- c(vara - centa, varb - centb) 
            sqrt(x %*% Minv %*% x)
        }, 1L:nrow(DT)]
    

    输出:

                vara       varb       centa      centb  mah_dist
     1:  1.262954285  0.7635935 -0.22426789 -0.2357066 1.6507441
     2: -0.326233361 -0.7990092  0.37739565 -0.5428883 0.7134176
     3:  1.329799263 -1.1476570  0.13333636 -0.4333103 1.5423502
     4:  1.272429321 -0.2894616  0.80418951 -0.6494716 0.5414365
     5:  0.414641434 -0.2992151 -0.05710677  0.7267507 1.2369112
     6: -1.539950042 -0.4115108  0.50360797  1.1519118 2.3590344
     7: -0.928567035  0.2522234  1.08576936  0.9921604 2.0435022
     8: -0.294720447 -0.8919211 -0.69095384 -0.4295131 0.6801583
     9: -0.005767173  0.4356833 -1.28459935  1.2383041 1.6739981
    10:  2.404653389 -1.2375384  0.04672617 -0.2793463 2.7729519
    

    数据:

    set.seed(0L)
    DT <- data.table(vara = rnorm(10), varb = rnorm(10), centa = rnorm(10), centb = rnorm(10))
    Minv <- solve(matrix(c(1,0.2,0.2,1), nrow=2L))
    

    【讨论】:

      【解决方案2】:

      试试这个方法

      library(distances)
      library(dplyr)
      df <- data.frame(vara = rnorm(10), varb = rnorm(10), centa = rnorm(10), centb = rnorm(10)) 
      
      df_1 <- df%>% 
        transmute(vara_centa = vara - centa,
                  varb_centb = varb - centb)
      
      distances(df_1, normalize = "mahalanobize")
      

      自定义归一化矩阵

      mcov <- matrix(c(1, 0.2, 0.2, 1), nrow = 2)
      distances(df_1, normalize = mcov)
      

      【讨论】:

      • 谢谢。我发现你的回答很有用
      猜你喜欢
      • 2012-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多