Re: Clusteranalyse Distanzmatrix programmieren
Verfasst: Do Aug 22, 2019 3:41 pm
Ich hatte auch an apply() oder sogar an outer() gedacht, aber es gibt diesmal mindestens einen kleinen Haken:
man kann bei Nutzung dieser Funktionen die Eigenschaft, dass die Ergebnismatrix symmetrisch ist, schlecht in die Berechnung einfließen lassen.
Deshalb habe ich mich diesmal für die klassische doppelte for-Schleife entschieden.
Eine Lösung mit outer() erscheint mir schwierig auf Grund der Arbeitsweise von outer().
Gruß, Jörg
man kann bei Nutzung dieser Funktionen die Eigenschaft, dass die Ergebnismatrix symmetrisch ist, schlecht in die Berechnung einfließen lassen.
Deshalb habe ich mich diesmal für die klassische doppelte for-Schleife entschieden.
Code: Alles auswählen
set.seed(42)
Dat <- data.frame(StreckenID = 1:400, Laenge = runif(400, 1,1000), MaxSteigung = 10*rbeta(400,1,8),
Hoehenmeter = abs(rnorm(400,100,20)), AnteilSchotterwege = rbeta(400, 4,4))
euc.dist <- function(x1, x2) sqrt(sum((x1 - x2)^2))
X <- as.matrix(Dat[-1])
n <- nrow(Dat)
myDistMat <- matrix(0, n, n)
for (i in 1:(n-1)) for (j in (i+1):n) {
myDistMat[i,j] <- euc.dist(X[i,], X[j,])
myDistMat[j,i] <- myDistMat[i,j]
}
D2 <- sapply(1:n, function(i) sapply(1:n, function(j) euc.dist(X[i,], X[j,])))
identical(myDistMat, D2)
D3 <- apply(X, 1, function(x1) sapply(1:n, function(j) euc.dist(x1, X[j,])))
identical(myDistMat, D3)
D4 <- apply(X, 1, function(x2) apply(X, 1, euc.dist, x2=x2))
identical(myDistMat, D4)
Gruß, Jörg