我正在寻找一种更有效的方法来获取根据Hamming distance得出的距离矩阵。
背景
我知道软件包hamming.distance()
中有一个函数e1071
用于计算距离矩阵,但是我怀疑当涉及到一个包含多行的大矩阵时,它可能会非常慢,因为它应用了嵌套{{ 1}}循环进行计算。
到目前为止,在下面的代码中,我有一个更快的方法(请参阅for
)。但是,它仅适用于二进制域,即methodB
。但是,当遇到包含两个以上元素(即{0,1}^n
)的域时,此功能不可用。从这个意义上讲,{0,1,2,...,K-1}^n
不是通用汉明距离。
客观
我的目标是找到一种具有以下功能的方法:
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))
提前感谢!
答案 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