gpt4 book ai didi

r - 如何计算大型数据帧的欧氏距离(并仅保存摘要)

转载 作者:行者123 更新时间:2023-12-02 00:09:09 28 4
gpt4 key购买 nike

我编写了一个简短的“for”循环来查找数据框中每一行与所有其他行之间的最小欧氏距离(并记录哪一行最近)。从理论上讲,这避免了与尝试计算非常大的矩阵的距离度量相关的错误。然而,虽然在内存中保存的不多,但对于大型矩阵来说它非常非常慢(我的 ~150K 行的用例仍在运行)。

我想知道是否有人可以在矢量化我的函数、使用 apply 或类似方法方面给我建议或指出正确的方向。对于看似简单的问题表示歉意,但我仍在努力以矢量化方式思考。

提前致谢(并感谢您的耐心等待)。

require(proxy)

df<-data.frame(matrix(runif(10*10),nrow=10,ncol=10), row.names=paste("site",seq(1:10)))

min.dist<-function(df) {
#df for results
all.min.dist<-data.frame()
#set up for loop
for(k in 1:nrow(df)) {
#calcuate dissimilarity between each row and all other rows
df.dist<-dist(df[k,],df[-k,])
# find minimum distance
min.dist<-min(df.dist)
# get rowname for minimum distance (id of nearest point)
closest.row<-row.names(df)[-k][which.min(df.dist)]
#combine outputs
all.min.dist<-rbind(all.min.dist,data.frame(orig_row=row.names(df)[k],
dist=min.dist, closest_row=closest.row))
}
#return results
return(all.min.dist)
}
#example
min.dist(df)

最佳答案

这应该是一个好的开始。它使用快速矩阵运算并避免了不断增长的对象构造,这两者都在评论中有所建议。

min.dist <- function(df) {

which.closest <- function(k, df) {
d <- colSums((df[, -k] - df[, k]) ^ 2)
m <- which.min(d)
data.frame(orig_row = row.names(df)[k],
dist = sqrt(d[m]),
closest_row = row.names(df)[-k][m])
}

do.call(rbind, lapply(1:nrow(df), which.closest, t(as.matrix(df))))
}

如果这仍然太慢,作为建议的改进,您可以一次计算 k 个点的距离,而不是单个点。 k 的大小需要在速度和内存使用之间做出折衷。

编辑:另请阅读 https://stackoverflow.com/a/16670220/1201032

关于r - 如何计算大型数据帧的欧氏距离(并仅保存摘要),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16474179/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com