使用R创建距离矩阵(不使用dist()函数)

3

我需要从一个矩阵中创建一个距离矩阵,该矩阵返回列之间的距离。

我知道存在一个名为dist()的函数,但我不能使用它,因为我将使用不常见的距离函数。

我想使用apply,但我不知道如何编写。

我创建的循环是:

 dista <- function(A,distance){
  dist_matrix=matrix(0,dim(A)[2],dim(A)[2])
  for (i in 1:(dim(A)[2]-1)){
    for(j in (i+1):(dim(A)[2])){
      if(distance=='cosine') dist_matrix[j,i]<- (1-sum(A[,i]*A[,j]))/(sqrt(sum(A[,i]^2))+sqrt(sum(A[,j]^2)))
    }
  }
  dist_matrix
}

2
你能否发布一下你的数据列和期望的输出示例?甚至可以提供你编写的循环代码,以便我们了解它为何运行缓慢? - Gopala
更多细节会有所帮助。 - John Coleman
我刚刚写了循环,我的矩阵是129569行x 60列。 - cdom
如何看待 http://www.inside-r.org/packages/cran/lsa/docs/cosine?(我刚刚谷歌了“R成对余弦距离”) - Ben Bolker
是的!这很有帮助,但我怎么能不用循环来编写它呢? - cdom
我认为该函数会为您构建整个距离矩阵。你试过了吗? - Ben Bolker
1个回答

2
假设您有一个类似于以下数据框的数据:

df <- data.frame(x = rnorm(10, 5, 1), y = rnorm(10))

你可以按照以下方式使用apply:
apply(df, 1, dist)

为了使用自定义的距离函数,您可以用以下代码替换上面的 dist 调用:
apply(df, 1, my_own_dist)

当然,这会循环遍历每一行数据,并且仍然比基于矩阵的计算慢。了解您的距离函数实际上是做什么可能有助于人们找到更有效的方法来解决问题。
根据下面的评论进行编辑....
如果您正在尝试计算原始矩阵A中每对列之间的成对距离,则可以尝试以下内容:
apply(combn(1:ncol(A), 2), 2, function(x) my_dist_function(A[, x]))

首先生成所有唯一的列对,并逐个运行它们。

谢谢,但我使用余弦距离,那么我该怎么写呢? - cdom
如果您想计算原始矩阵A中每一对列之间的成对距离,可以尝试以下方法:apply(combn(1:ncol(A), 2), 2, function(x) my_dist_function(A[, x]))。首先生成所有唯一的列对,并逐个运行它们。 - Gopala
谢谢,这正是我所需要的。 - cdom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接