【发布时间】:2020-04-26 23:56:06
【问题描述】:
我正在寻找一种更有效的方法来获取Hamming distance 方面的距离矩阵。
背景
我知道包 e1071 中有一个函数 hamming.distance() 来计算距离矩阵,但我怀疑在涉及具有多行的大矩阵时它可能会非常慢,因为它应用了嵌套的 for 循环进行计算.
到目前为止,我在下面的代码中有一个更快的方法(请参阅methodB)。但是,它只适用于二进制域,即{0,1}^n。但是,当遇到包含两个以上元素的域时,它不可用,即{0,1,2,...,K-1}^n。从这个意义上说,methodB 不适用于通用汉明距离。
目标
我的目标是找到一种具有以下特点的方法:
- 仅由基础 R 中的函数组成(不使用
Rcpp重写函数以加快速度) - 对于特殊情况
k=2,比我的方法更快methodB() - 可以泛化为任何正整数
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))
基准给出了
microbenchmark::microbenchmark(
methodA(m),
methodB(m),
unit = "relative",
check = "equivalent",
times = 50
)
Unit: relative
expr min lq mean median uq max neval
methodA(m) 33.45844 33.81716 33.963 34.30313 34.92493 14.92111 50
methodB(m) 1.00000 1.00000 1.000 1.00000 1.00000 1.00000 50
提前欣赏!
【问题讨论】:
-
这可能会让你感兴趣:stackoverflow.com/questions/59942412/…
-
@chinsoon12 谢谢你的信息,我去看看
标签: r algorithm performance matrix hamming-distance