Seite 1 von 2
Clusteranalyse Distanzmatrix programmieren
Verfasst: Do Aug 22, 2019 12:19 pm
von habicht-44
Guten Tag,
ich stehe vor einem Problem im Rahmen einer Weiterbildung in Business Intelligence:
Ich habe folgende Funktion der Euklidischen Distanz:
euc.dist <- function(x1, x2) sqrt(sum((x1 - x2)^2))
Und dann habe ich eine Ausgangsdatenmatrix mit 400 Datensätzen.
Wie schaffe ich es nun die Abstände aller Paarkombinationen der 400 Datensätze auf die Funktion anzuwenden (ohne jeden Merkmalsträger per Hand eintippen zu müssen)?
Anmerkung: Es dürfen laut Aufgabenstellung keine Pakete verwendet werden, sondern die Lösung muss mit den Grundlagen der Programmierung umgesetzt werden.
Für Hilfen wäre ich sehr dankbar!
Re: Clusteranalyse Distanzmatrix programmieren
Verfasst: Do Aug 22, 2019 1:41 pm
von jogo
Hallo Habicht,
habicht-44 hat geschrieben: Do Aug 22, 2019 12:19 pm
Ich habe folgende Funktion der Euklidischen Distanz:
Und dann habe ich eine Ausgangsdatenmatrix mit 400 Datensätzen.
Wie schaffe ich es nun die Abstände aller Paarkombinationen der 400 Datensätze auf die Funktion anzuwenden (ohne jeden Merkmalsträger per Hand eintippen zu müssen)?
kannst Du bitte mal den Output von
in Deine nächste Nachricht kopieren?
Gruß, Jörg
Re: Clusteranalyse Distanzmatrix programmieren
Verfasst: Do Aug 22, 2019 2:17 pm
von habicht-44
Hallo Jörg,
leider nein, da ich keinen Zugriff auf die CSV-Datei habe (Bearbeitungszeit der Seminararbeit läuft sobald ich das Thema final wähle, dann bekomme ich die CSV-Datei). Da ich noch grundsätzliche Probleme mit R habe, habe ich mich noch nicht zur Prüfung angemeldet.
Was ich jedoch angeben kann ist den Tabellenkopf:
StreckenID, Laenge, MaxSteigung, Hoehenmeter, AnteilSchotterwege
Es gibt insgesamt 400 Datensätze gemessen über die Strecken-ID.
Beste Grüße,
Re: Clusteranalyse Distanzmatrix programmieren
Verfasst: Do Aug 22, 2019 2:21 pm
von bigben
Hallo Habicht!
Als erstes brauchst Du mal alle 400 Paarkombinationen und weil Du in R unterwegs bist, ist das ganz einfach: Jeder Deiner Datensätze braucht eine Nummer. Üblicherweise könnte man dafür die Nummer der Zeile in der Matrix nehmen.
Die Funktion
combn kann Dir alle 2er-Konstellationen aus diesen Nummer geben. Vereinfacht mal für den Fall, dass es die Fälle 1 bis 4 gäbe:
Code: Alles auswählen
> ?combn
> combn(1:4, 2)
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 1 1 2 2 3
[2,] 2 3 4 3 4 4
Jede Spalte in diesem Ergebnis beschreibt eine Kombination, deren Abstand Du berechnen musst. Über die Spalten kannst Du beispielsweise in einer for-Schleife laufen:
Code: Alles auswählen
kombinationen <- combn(1:4, 2)
for(i in 1:ncol(kombinationen)){
cat("Berechne Abstand ")
cat(kombinationen[1,i])
cat(" von ")
cat(kombinationen[2,i])
cat(".\n")
}
Kommst Du damit erstmal selbst weiter?
LG,
Bernhard
Re: Clusteranalyse Distanzmatrix programmieren
Verfasst: Do Aug 22, 2019 2:34 pm
von bigben
habicht-44 hat geschrieben: Do Aug 22, 2019 12:19 pmAnmerkung: Es dürfen laut Aufgabenstellung keine Pakete verwendet werden, sondern die Lösung muss mit den Grundlagen der Programmierung umgesetzt werden.
Ich finde die Aufgabenstellung uneindeutig, denn R kennt die Funktion dist, ohne dass man irgendwelche Pakete einlesen müsste:
Code: Alles auswählen
daten <- matrix(rnorm(100), ncol=10)
dist(daten, method = "euclidean")
Wenn 'dist' nicht zu den "Grundlagen der Programmierung" gehört, muss man auch hinterfragen, ob die oben von mir genannte Funktion 'combn' erlaubt ist oder nicht. Nötigenfalls muss man sie durch eine geschachtelte Schleife ersetzen:
Code: Alles auswählen
alle_kombinationen <- function(x){
l <- length(x)
for(i in 1:(l-1)){
for(j in (i+1):l){
cat(x[i])
cat(" und ")
cat(x[j])
cat("\n")
}
}
}
alle_kombinationen(1:4)
alle_kombinationen(c("Fritz", "Hannelore", "Stefan", "Sabine"))
LG,
Bernhard
Re: Clusteranalyse Distanzmatrix programmieren
Verfasst: Do Aug 22, 2019 2:51 pm
von habicht-44
Hallo Bernhard,
vielen Dank, auf diese Lösung wäre ich als Einsteiger nie gekommen!
Aber ich glaube, ich verstehe was du geschrieben hast.
Dann werde ich das mal so nachbauen
Viele Grüße
Re: Clusteranalyse Distanzmatrix programmieren
Verfasst: Do Aug 22, 2019 2:59 pm
von jogo
Hallo Habicht,
habicht-44 hat geschrieben: Do Aug 22, 2019 2:17 pm
leider nein, da ich keinen Zugriff auf die CSV-Datei habe (Bearbeitungszeit der Seminararbeit läuft sobald ich das Thema final wähle, dann bekomme ich die CSV-Datei). Da ich noch grundsätzliche Probleme mit R habe, habe ich mich noch nicht zur Prüfung angemeldet.
Was ich jedoch angeben kann ist den Tabellenkopf:
StreckenID, Laenge, MaxSteigung, Hoehenmeter, AnteilSchotterwege
Es gibt insgesamt 400 Datensätze gemessen über die Strecken-ID.
also für eine verwertbare Clusterananlyse halte ich die die einfache euklidische Distanz für diese Daten ob der verschiedenen Skalierung der Variablen für unangebracht, denn z.B. ob ich einen km mehr fahre oder ob statt dessen der AnteilSchotterwege von 0 auf 1 (entspricht 100%) steigt.
Als akademisches Bespiel kann man das vielleicht trotzdem so machen. Wichtig:
- die StreckenID darf nicht Teil der Distanzberechnung sein.
Code: Alles auswählen
Dat <- read.csv(...)
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]
}
Wenn man möchte, kann man auch noch die Zeilen- und Spaltennamen von
myDistMat gefällig setzen.
Gruß, Jörg
Re: Clusteranalyse Distanzmatrix programmieren
Verfasst: Do Aug 22, 2019 3:05 pm
von bigben
habicht-44 hat geschrieben: Do Aug 22, 2019 2:17 pmWas ich jedoch angeben kann ist den Tabellenkopf:
StreckenID, Laenge, MaxSteigung, Hoehenmeter, AnteilSchotterwege
Daraus kannst Du Dir mittels Rs Zufallsgenerator leicht einen eigenen Datensatz zum Ausprobieren erstellen:
Code: Alles auswählen
testdaten <- 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))
head(testdaten, 20)
HTH,
Bernhard
Re: Clusteranalyse Distanzmatrix programmieren
Verfasst: Do Aug 22, 2019 3:28 pm
von habicht-44
Danke für eure Ideen, ich muss das nochmal in Ruhe nachvollziehen.
Glaubt Ihr, dass man auch was mit Funktionen aus der apply-Familie bewegen kann?
Re: Clusteranalyse Distanzmatrix programmieren
Verfasst: Do Aug 22, 2019 3:35 pm
von bigben
Hallo Habicht,
das ist eine ungewöhnliche Fragestellung. Normalerweise fragen Anfänger, die nicht auf eine for-Lösung kommen, nicht nach apply-Lösungen. Wenn das mit dem apply Teil der Aufgabenstellung ist, dann wäre es nett, wenn Du möglichst jetzt die vollständige/endgültige Aufgabe postest und uns nicht nach und nach Antworten finden lässt auf Aufgaben, die es so gar nicht gibt.
Wenn Du aus Eigeninteresse eine apply-Lösung suchst, dann schreib bitte, bei welchem Schritt Du gerne eine apply-Lösung hättest. Als Daumenregel gilt nach meiner Erfahrung, dass Jörg für fast alles auch eine apply-Lösung auf Lager hat. Ob das dann jeweils einfacher nachzuvollziehen ist, als geschachtelte Schleifen, ist eine andere Frage.
LG,
Bernhard