繁体   English   中英

计算距质心的距离

[英]Calculating distance from centroids

我想计算数据矩阵和一组中心的欧几里德距离。

我用过这个函数:

Euclid <- function(df, centers) {
    distanceMatrix <- matrix(NA, nrow=dim(df)[1], ncol=dim(centers)[1])
    for(i in 1:nrow(centers)) {
    distanceMatrix[,i] <- sqrt(rowSums(t(t(df)-centers[i,])^2))
    }
    distanceMatrix
}

df是数据矩阵,其中点为行,维度为列。 它有840个点和11个维度。

head(df)   

  v1     v2    v3     v4     v5     v6     v7     v8     v9      v10   v11  
1 -0.81  0.24  -0.36  -0.68  -0.51  -0.26  -0.82   0.53   0.19   0.17   0.92
2  1.23  0.24   0.11   0.65   0.67   0.56   0.43  -0.19  -0.31   0.55   0.45
3 -0.81 -0.59  -0.36  -0.35   0.28   0.15   0.02  -0.19   0.68   0.17  -0.02

centers是12行和11维的中心矩阵。

head(centers)  

  v1     v2    v3     v4     v5     v6     v7     v8     v9     v10   v11  
1 0.29   0.09  0.19   0.02   -0.07  0.13  -0.01  0.09   0.02   0.15  0.09
2 0.04   0.03  0.10   0.01   0.01   0.01   0.03  0.01   0.31   0.04  0.45
3 0.07   0.02 -0.02  -0.02   0.48   0.36  -0.66 -0.09   0.21  -0.03 -0.78

但是,应用Euclid函数会导致以下错误:

distsToCenters <- Euclid(df, centers)
  Error in distanceMatrix[, i] <- sqrt(rowSums(t(t(df) - centers[i,  : 
  number of items to replace is not a multiple of replacement length

我已经在尺寸小得多的矩阵上尝试过这种方法并且工作正常。 但是,它似乎不适用于我当前的数据集和中心矩阵。

有人能让我知道我做错了什么吗? 提前谢谢了。

data.frames适用于处理数据。 但与matrix类相比,工作方式不同。 你在这里有一个讨厌的错误,有点违反直觉。 尝试替换sqrt(rowSums(t(t(df)-centers[i,])^2))

sqrt(rowSums(t(t(as.matrix(df))-as.matrix(centers)[i,])^2))
# or at the start
df <- as.matrix(df); centers <- as.matrix(centers)

一个工作的例子:

Euclid <- function(df, centers) {
  distanceMatrix <- matrix(NA, nrow = nrow(df), ncol = nrow(centers))
  df <- as.matrix(df)
  centers <- as.matrix(centers)
  for(i in 1:nrow(centers)) {
    distanceMatrix[, i] <- sqrt( colSums( (t(df) - centers[i, ])^2 ) )
  }
  return(distanceMatrix)
}

tmp1 <- data.frame(x=rnorm(5), y = rnorm(5))
tmp2 <- data.frame(x=rnorm(2), y = rnorm(2))

tmp1
tmp2
Euclid(tmp1, tmp2)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM