2016-08-11 13 views
1

Ich möchte den euklidischen Abstand einer Datenmatrix und einer Menge von Zentren berechnen.Berechnen der Entfernung von den Schwerpunkten

Ich habe diese Funktion verwendet:

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 ist die Datenmatrix mit Punkten als Zeilen und Abmessungen wie Spalten. Es hat 840 Punkte und 11 Dimensionen.

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 ist die Matrix von Zentren mit 12 Zeilen und 11 Dimensionen.

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 

jedoch die Anwendung die Euclid Funktion in dem folgenden Fehler in Folge:

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 

Ich habe dies mit vielen kleineren Dimensionen auf Matrizen versucht, und es hat geklappt. Es scheint jedoch nicht zu meinem aktuellen Satz von Daten und Center-Matrizen zu funktionieren.

Würde mir jemand sagen können, was ich falsch gemacht habe? Vielen Dank im Voraus.

Antwort

0

data.frames sind gut für den Umgang mit Daten. Aber arbeiten anders als die matrix Klasse. Was Sie hier haben, ist ein böser Bug, der etwas kontraintuitiv ist. Versuchen Sie sqrt(rowSums(t(t(df)-centers[i,])^2)) von

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

ein funktionierendes Beispiel zu ersetzen:

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) 
Verwandte Themen