我想计算数据矩阵和一组中心的欧几里德距离。
我使用过这个功能:
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
我在尺寸小得多的矩阵上尝试了这个,并且工作正常。但是,它似乎不适用于我当前的数据集和中心矩阵。
有人能让我知道我做错了什么吗?提前谢谢了。
答案 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)