计算距质心

时间:2016-08-11 05:45:13

标签: r matrix

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

我使用过这个功能:

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

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

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

1 个答案:

答案 0 :(得分:0)

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)