2016-06-21 7 views
-1

Ich muss eine Abstandsmatrix aus einer Matrix erstellen, die den Abstand zwischen den Spalten zurückgibt.Erstellen einer Abstandsmatrix in R (ohne dist() zu verwenden)

Ich weiß,, dass es eine Funktion namens dist() existiert, aber ich kann es nicht verwenden, weil ich nicht gemeinsame Distanzfunktionen verwenden werde.

Ich dachte über die Anwendung, aber ich weiß nicht, wie man es schreibt.

Die Schleife ich geschaffen habe, ist:

apply(df, 1, dist) 

zu verwenden:

dista <- function(A,distance){ 
    dist_matrix=matrix(0,dim(A)[2],dim(A)[2]) 
    for (i in 1:(dim(A)[2]-1)){ 
    for(j in (i+1):(dim(A)[2])){ 
     if(distance=='cosine') dist_matrix[j,i]<- (1-sum(A[,i]*A[,j]))/(sqrt(sum(A[,i]^2))+sqrt(sum(A[,j]^2))) 
    } 
    } 
    dist_matrix 
} 
+2

Können Sie ein Beispiel für Ihre Datenspalten und Ihre erwartete Ausgabe veröffentlichen? Vielleicht ist sogar der Schleifencode, den du geschrieben hast, langsam? – Gopala

+0

Mehr Details würden helfen. –

+0

Ich habe gerade die Schleife geschrieben, meine Matrix ist 129569Rows x 60columns – cdom

Antwort

1

Sie einige Datenrahmen wie folgt Unter der Annahme haben:

df <- data.frame(x = rnorm(10, 5, 1), y = rnorm(10)) 

Sie können wie folgt verwendet werden gelten eine Kundenabstandsfunktion, können Sie den Anruf zu dist oben mit ersetzen:

apply(df, 1, my_own_dist) 

Natürlich durchläuft diese Schleife jede Datenzeile und ist immer noch langsamer als eine matrixbasierte Berechnung. Zu wissen, was Ihre Entfernungsfunktion tatsächlich tut, könnte Ihnen helfen, einen noch effizienteren Weg zu finden, das Problem anzugehen.

EDIT auf Kommentar basiert unten ....

Wenn Sie versuchen, paarweise Abstand zwischen jedem Paar von Spalten in Ihrer ursprünglichen Matrix A zu berechnen, können Sie so etwas wie dies versuchen:

apply(combn(1:ncol(A), 2), 2, function(x) my_dist_function(A[, x])) 

Zuerst alle eindeutigen Spaltenpaare generieren und nacheinander durchlaufen

+0

Danke, aber ich benutze den Cosinus-Abstand also, wie kann ich es schreiben? – cdom

+0

Wenn du versuchst paarweise Abstände zwischen jedem Spaltenpaar in deiner ursprünglichen Matrix A zu berechnen, kannst du etwas wie folgt ausprobieren: 'apply (combn (1: ncol (A), 2), 2, Funktion (x) my_dist_function (A [, x])) '. Zuerst alle eindeutigen Spaltenpaare generieren und nacheinander durchlaufen – Gopala

+0

Danke, das ist genau das, was ich brauche – cdom

Verwandte Themen