(速度挑战)以通用汉明距离为基础计算距离矩阵的任何更快方法?

时间:2020-01-09 11:25:48

标签: r algorithm performance matrix hamming-distance

我正在寻找一种更有效的方法来获取根据Hamming distance得出的距离矩阵。

背景

我知道软件包hamming.distance()中有一个函数e1071用于计算距离矩阵,但是我怀疑当涉及到一个包含多行的大矩阵时,它可能会非常慢,因为它应用了嵌套{{ 1}}循环进行计算。

到目前为止,在下面的代码中,我有一个更快的方法(请参阅for)。但是,它仅适用于二进制域,即methodB。但是,当遇到包含两个以上元素(即{0,1}^n)的域时,此功能不可用。从这个意义上讲,{0,1,2,...,K-1}^n不是通用汉明距离。

客观

我的目标是找到一种具有以下功能的方法:

  • 仅由基数R中的函数组成(不使用methodB重写函数以加快速度)
  • 对于特殊情况Rcpp
  • 比我的方法methodB()更快
  • 可以概括为任何正整数k=2
  • 优于k软件包中hamming.distance()的速度

我的代码

e1071

和基准给出

library(e1071)
# vector length, i.e., number of matrix
n <- 7
# number of elements to consist of domain {0,1,...,k-1}^n
k <- 2
# matrix for computing hamming distances by rows
m <- as.matrix(do.call(expand.grid,replicate(n,list(0:k-1))))

# applying `hamming.distance()` from package "e1071", which is generic so it is available for any positive integer `k`
methodA <- function(M) hamming.distance(M)
# my customized method from base R function `dist()`, which is not available for cases `k >= 2`
methodB <- function(M) as.matrix(round(dist(M,upper = T,diag = T)**2))

提前感谢!

3 个答案:

答案 0 :(得分:2)

//insertSheet:
var spreadsheet = $("#spreadsheet").data("kendoSpreadsheet");
spreadsheet.insertSheet({name:'TEST'}); //you can set more than "name"

//removeSheet:
var spreadsheet = $("#spreadsheet").data("kendoSpreadsheet");
var sheetWillBeDeleted = spreadsheet.sheetByName("TEST"); //you can also use sheetByIndex function to get the sheet by index.
spreadsheet.removeSheet(sheetWillBeDeleted);

答案 1 :(得分:2)

我发现这个博客有四篇关于计算汉明矩阵的文章。我不想因此声名鹊起,但也许可以看看它。 https://johanndejong.wordpress.com/2015/10/02/faster-hamming-distance-in-r-2/

hamming <- function(X) {
  D <- (1 - X) %*% t(X)
  D + t(D)
}

> microbenchmark::microbenchmark(
+   methodB(m),
+   hamming(m),
+   unit = "relative",
+   times = 50
+ )
Unit: relative
       expr    min       lq     mean   median       uq      max neval
 methodB(m) 1.0000 1.000000 1.000000 1.000000 1.000000 1.000000    50
 hamming(m) 1.2502 1.299844 1.436486 1.301461 1.302033 4.607748    50

PS:我没有足够的声誉,只能将此作为评论。

答案 2 :(得分:-1)

您尝试使用Rcpp吗?我有一个非常相似的问题!请在此处查看答案:https://stackoverflow.com/a/60067825/3237589