首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加速R中逐点差和的计算

加速R中逐点差和的计算
EN

Stack Overflow用户
提问于 2019-10-04 06:48:56
回答 4查看 59关注 0票数 1

假设我有两个数据集。第一个是:

代码语言:javascript
复制
t1<-sample(1:10,10,replace = T)
t2<-sample(1:10,10,replace = T)
t3<-sample(1:10,10,replace = T)
t4<-sample(11:20,10,replace = T)
t5<-sample(11:20,10,replace = T)
xtrain<-rbind(t1,t2,t3,t4,t5)
xtrain
   [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
t1    7    3    9   10    4    9    2    1    6     9
t2    5    1    1    6    5    3   10    2    6     3
t3    8    6    9    7    9    2    3    5    1     8
t4   16   18   14   17   19   20   15   15   20    19
t5   13   14   18   13   11   19   13   17   16    14

第二个是:

代码语言:javascript
复制
t6<-sample(1:10,10,replace = T)
t7<-sample(11:20,10,replace = T)
xtest<-rbind(t6,t7)
xtest
   [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
t6    1    5    8    2   10    2    3    4    8     5
t7   14   18   15   12   17   20   17   13   16    17

我想做的是计算每一行xtest和每一行xtrain之间的距离之和。例如:

代码语言:javascript
复制
sum((7-1)^2+(3-5)^2+(9-8)^2+.....(9-5)^2)
sum((5-1)^2+(1-5)^2+(1-8)^2+.....(4-5)^2)
...
sum((14-13)^2+(18-14)^2+(15-18)^2+.....(17-14)^2) 

我目前使用的是两个for循环(见下文),我认为这不能处理大型数据集:

代码语言:javascript
复制
sumPD<-function(vector1,vector2){
  sumPD1<-sum((vector1-vector2)^2)
  return(sumPD1)
}
loc<-matrix(NA,nrow=dim(xtrain)[1],ncol=dim(xtest)[1])
for(j in 1:dim(xtest)[1]){    
  for(i in 1:dim(xtrain)[1]){
     loc[i,j]<-sumPD(xtrain[i,],xtest[j,])
   }
 }

我想请教一下如何修改代码以使其高效。提前谢谢你!希望能有一个很好的讨论!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-10-04 07:07:39

rdist包具有快速计算这些成对距离的函数:

代码语言:javascript
复制
rdist::cdist(xtrain, xtest)^2

输出:

代码语言:javascript
复制
     [,1] [,2]
[1,]   65 1029
[2,]   94 1324
[3,]  165 1103
[4,] 1189  213
[5,] 1271  191
票数 3
EN

Stack Overflow用户

发布于 2019-10-04 06:51:48

一种选择是outer

代码语言:javascript
复制
f1 <- Vectorize(function(i, j) sumPD(xtrain[i,], xtest[j,]))
loc2 <- outer(seq_len(nrow(xtrain)), seq_len(nrow(xtest)), f1)
identical(loc, loc2)
#[1] TRUE
票数 2
EN

Stack Overflow用户

发布于 2019-10-04 07:11:58

你可以转置你的矩阵,使用向量差和一个循环:

代码语言:javascript
复制
ftrain <- t(xtrain)
ftest <- t(xtest)


sapply(1:(dim(ftest)[2]),function(i){
  colSums((ftrain - ftest[,i])^2)
})


   [,1] [,2]
t1  103 1182
t2  125 1262
t3  130 1121
t4 1478  159
t5 1329  142

colSums是相当高效的,但是如果你想要更快的速度,可以看看there

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58227816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档