gpt4 book ai didi

r - 在 R 中优化我自己的距离函数

转载 作者:行者123 更新时间:2023-12-04 05:30:05 32 4
gpt4 key购买 nike

我正在尝试为我的数据创建一个新的距离函数。但是,与 stats 包中的 dist 函数相比,我的代码的性能非常慢。例如,查看欧几里得距离的结果:

mydist = function (x){

euclidean = function (a, b){
sqrt(sum((a-b)^2))
}

distances = matrix(0, nrow=nrow(x), ncol=nrow(x))
for (i in 1:nrow(x))
for (j in 1:(i-1)){ # <- corrected this
if (j > 0){
distances[i,j]=euclidean(x[i,], x[j,])
distances[j,i]=distances[i,j]
}
}

distances
}


m=matrix(1:800, ncol=2)
system.time(as.dist(mydist(m)))
usuário sistema decorrido
0.714 0.000 0.716 # <- updated values with corrected version

system.time(dist(m))
usuário sistema decorrido
0.004 0.000 0.002

我不会使用欧几里得距离。我正在开发一个新的,使用一些特定于我的数据的统计数据,比代理包的统计数据要复杂得多。我在数据集中有数百个变量和数千个示例(行)。不能等几个小时来计算距离。

我已经尝试了使用外部和应用的另一个代码。它比两个循环快,但仍然很慢。 任何人都可以提出任何建议吗?

最佳答案

关键是从整个矩阵中减去每一行而不是每一行。由于减法是按列完成的,因此只需转置矩阵即可。

m=matrix(1:800, ncol=2)
system.time(a<-as.dist(mydist(m)))
# user system elapsed
# 1.32 0.00 1.32

t.m<-t(m)
system.time(x<-as.dist(apply(m,1,function(x) sqrt(colSums((x - t.m)^2)))))
# user system elapsed
# 0.04 0.00 0.03

any(x!=a) # FALSE

但是如果你真的想要速度,你应该使用 C 库。

关于r - 在 R 中优化我自己的距离函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12751501/

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