很抱歉,如果之前已发布此消息。我在Google和Stackoverflow上寻找答案,但找不到解决方案。
现在我在R中有两个数据矩阵。我试图循环遍历矩阵中的每一行,并在另一个矩阵中找到与某个距离度量最相似的行(对于现在最小的平方)。我想出了一种方法,但它是O(n ^ 2),这对我的数据来说是禁止的。
我认为这可能类似于一些字典学习技巧,但我找不到任何东西。
谢谢!
两个矩阵只有30个n个矩阵,每个条目都有一个数字。
distance.fun=function(mat1,mat2){
match=c()
for (i in 1:nrow(mat1)){
if (all(is.na(mat1[i,]))==FALSE){
dist=c()
for (j in 1:nrow(mat2)){
dist[j]=sum((mat1[i,]-mat2[j,])^2)
match[i]=which(min(dist) %in% dist)
}
}
}
return(match)
}
答案 0 :(得分:0)
更好的策略是首先计算距离矩阵,然后提取分钟。以下是使用simualted数据的示例
set.seed(15)
mat1<-matrix(runif(2*25), ncol=2)
mat2<-matrix(runif(2*25), ncol=2)
这是一个辅助函数,可以计算一个矩阵到另一个矩阵的值之间的距离。它使用内置的dist
函数,但它确实进行了不必要的组内比较,我们最终必须将其过滤掉,但整体表现可能会更好。
distab<-function(m1, m2) {
stopifnot(ncol(m1)==ncol(m2))
m<-as.matrix(dist(rbind(m1, m2)))[1:nrow(m1), -(1:nrow(m1))]
rownames(m)<-rownames(m1)
colnames(m)<-rownames(m2)
m
}
mydist<-distab(mat1, mat2)
现在我们有组间距离,我们只需要最小化匹配。
best <- apply(mydist, 2, which.min)
rr <- cbind(m1.row=seq.int(nrow(mat1)), best.m2.row = best)
head(rr) #just print a few
# m1.row best.m2.row
# [1,] 1 1
# [2,] 2 14
# [3,] 3 7
# [4,] 4 3
# [5,] 5 23
# [6,] 6 15
请注意,使用这样的策略(我们与您的原始实现一样),mat1
中的多行可能与mat2
中的同一行和{{1中的某些行匹配要与mat2
无法匹配。