计算R中两个向量的汉明距离?

Sav*_*nry 5 r

我正在尝试计算R中两个向量之间的汉明距离.我目前正在尝试使用"e1071"包和hamming.distance函数,如下所示:

library(e1071)
H <- hamming.distance(X) 
Run Code Online (Sandbox Code Playgroud)

其中X是一个带有2行的数据帧,并且(在我的特定数据中)有667列,每个观察值为0或1.

最初我得到了错误:

Error: evaluation nested too deeply: infinite recursion / options(expressions=)?
Run Code Online (Sandbox Code Playgroud)

经过一些研究,似乎一个修复可能会增加R中的基本选项.我通过选项(表达式= 5000),然后尝试使用不同的值代替5000.但这只产生错误:

Error: C stack usage is too close to the limit
Run Code Online (Sandbox Code Playgroud)

我不是一个程序员,并且针对这个最近的错误的修复似乎与包e1071中的某些东西有关,可能没有正确调用(或在正确的时间).

关于我做错了什么的任何想法?我最终想要大量向量之间的汉明距离,这只是一个起点.如果这与内存分配有关,有什么建议可以处理吗?

Hon*_*Ooi 13

我不知道hamming.distance内部是如何工作的,但是计算2个向量的距离的简单方法就是

sum(x1 != x2)
Run Code Online (Sandbox Code Playgroud)

或者,在这种情况下,

sum(X[1,] != X[2,])
Run Code Online (Sandbox Code Playgroud)

如果向量的总数不是太大(例如,几千),你可以在嵌套循环中实现它:

n <- nrow(X)
m <- matrix(nrow=n, ncol=n)
for(i in seq_len(n - 1))
    for(j in seq(i, n))
        m[j, i] <- m[i, j] <- sum(X[i,] != X[j,])
Run Code Online (Sandbox Code Playgroud)

警告:未经测试.


Pet*_*ont 8

警告关于使用HAMMING.DISTANCE from PACKAGE e1071!

这个包的实现强制将对象与booleans进行比较,使用as.logical.这意味着0的值将为FALSE,任何非零值都将为TRUE.这意味着对于序列:0 1 2与0 1 1相比,汉明距离将报告为0而不是正确的值1 - 此包将1和2视为相等,因为as.logical(1)== as.logical(2).

这是错误的(在我看来)实现:

    > library("e1071", lib.loc="C:/Program Files/R/R-2.15.3/library")
    Loading required package: class
    > hamming.distance
    function (x, y) 
    {
        z <- NULL
        if (is.vector(x) && is.vector(y)) {
            z <- sum(as.logical(x) != as.logical(y))
        }
        else {
            z <- matrix(0, nrow = nrow(x), ncol = nrow(x))
            for (k in 1:(nrow(x) - 1)) {
                for (l in (k + 1):nrow(x)) {
                    z[k, l] <- hamming.distance(x[k, ], x[l, ])
                    z[l, k] <- z[k, l]
                }
            }
            dimnames(z) <- list(dimnames(x)[[1]], dimnames(x)[[1]])
        }
        z
    }
    <environment: namespace:e1071>
Run Code Online (Sandbox Code Playgroud)

我的建议:不要使用.如上所述,汉明距离很难实现.


Sim*_*nek 7

hamming.distance需要两个向量或矩阵,但不是数据框,所以你想要的也是

m = as.matrix(X)
hamming.distance(m[1,], m[2,])
Run Code Online (Sandbox Code Playgroud)

要么

hamming.distance(as.matrix(X))
Run Code Online (Sandbox Code Playgroud)

但正如所指出的那样,在你的特殊情况下也是如此

sum(m[1,] != m[2,])
Run Code Online (Sandbox Code Playgroud)

(一般情况下,data.frame如果你所拥有的不是异质结构,则避免使用s,因为它们比矩阵慢得多)