在R中优化自己的距离函数 [英] Optimize my own distance function in R
本文介绍了在R中优化自己的距离函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试为我的数据创建新的距离函数。然而,与来自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
我不会使用欧几里得距离。我正在开发一个新的,使用一些特定于我的数据的统计数据的复杂得多的数据,例如,不同于代理程序包的统计数据。我在数据集中有数百个变量和数千个示例(行)。不能只为了计算距离而等上几个小时。
我尝试了另一个代码,使用的是out with Apply。它比两个循环快,但仍然很慢。有人能提出建议吗?
推荐答案
关键是从整个矩阵中减去每一行,而不是每一行。由于减法是按列进行的,因此只需转置矩阵即可。
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中优化自己的距离函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文