Clusteranalyse Distanzmatrix programmieren

Wie rufe ich R-Funktionen auf, wie selektiere ich Daten, ich weiß nicht genau ....

Moderatoren: EDi, jogo

habicht-44
Beiträge: 7
Registriert: So Mai 19, 2019 6:30 pm

Clusteranalyse Distanzmatrix programmieren

Beitrag 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!
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Clusteranalyse Distanzmatrix programmieren

Beitrag von jogo »

Hallo Habicht,
habicht-44 hat geschrieben: Do Aug 22, 2019 12:19 pm Ich habe folgende Funktion der Euklidischen Distanz:

Code: Alles auswählen

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)?
kannst Du bitte mal den Output von

Code: Alles auswählen

dput(head(Ausgangsdatenmatrix))
in Deine nächste Nachricht kopieren?

Gruß, Jörg
habicht-44
Beiträge: 7
Registriert: So Mai 19, 2019 6:30 pm

Re: Clusteranalyse Distanzmatrix programmieren

Beitrag 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,
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Clusteranalyse Distanzmatrix programmieren

Beitrag 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
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Clusteranalyse Distanzmatrix programmieren

Beitrag 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
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
habicht-44
Beiträge: 7
Registriert: So Mai 19, 2019 6:30 pm

Re: Clusteranalyse Distanzmatrix programmieren

Beitrag 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
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Clusteranalyse Distanzmatrix programmieren

Beitrag 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
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Clusteranalyse Distanzmatrix programmieren

Beitrag 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
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
habicht-44
Beiträge: 7
Registriert: So Mai 19, 2019 6:30 pm

Re: Clusteranalyse Distanzmatrix programmieren

Beitrag 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?
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Clusteranalyse Distanzmatrix programmieren

Beitrag 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
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Antworten