【问题标题】:Canberra Distance Matrix Manual Calculation堪培拉距离矩阵手动计算
【发布时间】:2017-03-23 01:16:47
【问题描述】:

canberra distance - inconsistent results 类似,我编写了自己的距离计算,但我想对更大的数据集执行此操作,然后根据结果创建距离矩阵。

我的初始功能是

canb.dist <- function(x, j) sum((abs(x-j))/(abs(x)+abs(j)))

现在,我想将此函数应用于数据框中的每一对行,然后根据该计算创建一个距离矩阵。假设我的数据是:

data<-data.frame(replicate(500,sample(1:100,50,rep=TRUE)))

我正在努力研究下一部分,如何将其应用于每一对行,然后创建一个基本上模仿的矩阵

dist(data,method="canberra")

我尝试过:

for (y in 1:50)
{
    for (z in 2:50)
    {
    canb.dist(data[y,1:500],data[z,1:500])
    }
}

但显然不是。有没有办法遍历每一对并手动复制距离矩阵?

【问题讨论】:

    标签: r distance


    【解决方案1】:

    您可以使用combn 创建行对并计算每对行的堪培拉距离。然后转换为dist 类,使用稀疏Matrix 包将索引和值转换为矩阵

    #OP's data
    set.seed(1)
    canb.dist <- function(x, j) sum((abs(x-j))/(abs(x)+abs(j)))
    data <- data.frame(replicate(500,sample(1:100,50,rep=TRUE)))
    refdist <- dist(data, method="canberra")
    
    #convert to matrix
    mat <- as.matrix(data)
    
    #sequence of row indices
    rowidx <- seq_len(nrow(mat))
    
    #calculate OP's Canberra dist for each pair of rows
    triangular <- combn(rowidx, 2, function(x) c(x[1], x[2], canb.dist(mat[x[1],], mat[x[2],])))
    
    #construct the matrix given the indices and values using Matrix library,
    #convert into a matrix before converting into a dist class
    #the values refer to the diagonal, lower triangular and upper triangular
    library(Matrix)
    ansdist <- as.dist(as.matrix(sparseMatrix(
        i=c(rowidx, triangular[1,], triangular[2,]), 
        j=c(rowidx, triangular[2,], triangular[1,]),
        x=c(rep(0, length(rowidx)), triangular[3,], triangular[3,])
    )))
    
    #idea from http://stackoverflow.com/questions/17375056/r-sparse-matrix-conversion/17375747#17375747
    range(as.matrix(refdist) - as.matrix(ansdist))
    

    【讨论】:

    • 这非常有效。我没想到它会像结果一样复杂,但非常感谢!
    猜你喜欢
    • 2016-12-18
    • 2023-01-31
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多