R

时间:2016-11-18 14:59:30

标签: r pattern-matching nearest-neighbor

我想在三维空间中匹配点。

因此,我使用的是此问题中描述的匈牙利方法:Finding the best matching pairwise points from 2 vectors

这是我使用R的例子:

# packages
library(rgl)
library(clue)
library(plyr)
library(fields)

set.seed(1)
a <- c(rep(2,7), 3,4,5,6,3,4,5,6,7,7,7,7,7,7) # x values
b <- c(rep(3,7),3,3,3,3, 3,3,3,3,3,3,3,3,3,3) # y values
c <- c(seq(1,7),1,1,1,1,7,7,7,7,1,2,3,4,5,6) # z values

# transform the points
set.seed(2)
a1 <- a + seq(1,length(a)) 
b1 <- b + 8 
c1 <- c + 9 


# plot the data
plot3d(a,b,c,  col="red", pch=16,size=10)
plot3d(a1,b1,c1, lwd=10, col="blue", pch=16,size=10, add=TRUE)

# run the Hungarian Method
A <- cbind(a,b,c)
B <- cbind(a1,b1,c1)

distances <- rdist(A,B) # calculate Euclidean Distance between points
min.dist <- solve_LSAP(distances) # minimizing the sum of distance 

min.dist.num <- as.numeric(min.dist)

# plot the minimized lines between point sets
for (ii in 1:dim(B)[1]){

  D <- c(A[ii,1], B[min.dist.num[ii],1])
  R <- c(A[ii,2], B[min.dist.num[ii],2])
  W <- c(A[ii,3], B[min.dist.num[ii],3])
  segments3d(D,R,W,col=2,lwd=1)

}
# calculate the share of points that is matched correctly
sum(1:dim(B)[1]==min.dist.num)/dim(B)[1]* 100

red: original ponts, blue: transformed points

这里的问题是只有5%的点正确匹配(参见代码的最后一行)。在我看来,主要的麻烦是算法没有考虑对象的结构(正方形)

问题:是否有任何方法可以更好地处理此样本数据?

在我的原始数据中,点的维度结构更加复杂。我有一堆数据,在这个云中有多个子图。

我主要寻求R中的解决方案,但也欢迎其他实现(例如MATLAB,Excel,Java)。

0 个答案:

没有答案