【问题标题】:Calculating distance from centroids计算与质心的距离
【发布时间】:2016-08-11 05:45:13
【问题描述】:

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

我用过这个功能:

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

我已经在尺寸小得多的矩阵上进行了尝试,效果很好。但是,它似乎不适用于我当前的一组数据和中心矩阵。

谁能告诉我我做错了什么?提前谢谢了。

【问题讨论】:

    标签: r matrix


    【解决方案1】:

    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)
    

    【讨论】:

      猜你喜欢
      • 2021-01-14
      • 1970-01-01
      • 2017-03-13
      • 2019-12-09
      • 2017-05-01
      • 1970-01-01
      • 2020-03-28
      • 2017-04-21
      相关资源
      最近更新 更多