2017-11-27 3 views
0

Ich erkläre, was ich zu entwickeln habe.Euklidischen Abstand zu einer Matrix hinzufügen

Nehmen wir an, ich muss eine Funktion ausführen, die für den Empfang von zwei Matrizen verantwortlich ist, die die gleiche Anzahl von Spalten haben, sich aber in der Anzahl der Zeilen unterscheiden können.

Zusammenfassend werden wir zwei Matrizen von Vektoren mit der gleichen Dimension aber unterschiedlicher Anzahl N von Elementen haben.

Ich muss den euklidischen Abstand zwischen jedem der Vektoren, die meine zwei Matrizen bilden, berechnen und dann in einer anderen Matrix speichern, die den euklidischen Abstand zwischen all meinen Vektoren enthält.

Dies ist der Code, den ich entwickelt haben:

def compute_distances(x, y): 
    # Dimension: 
    N, d = x.shape 
    M, d_ = y.shape 

    # The dimension should be the same 
    if d != d_: 
     print "Dimensiones de x e y no coinciden, no puedo calcular las distancias..." 
     return None 

    # Calculate distance with loops: 
    D = np.zeros((N, M)) 
    i = 0 
    j = 0 
    for v1 in x: 
     for v2 in y: 
      if(j != M): 
       D[i,j] = math.sqrt(sum([(xi-yi)**2 for xi,yi in zip(v1,v2)])) 
      #print "[",i,",",j,"]" 
       j = j + 1 
      else: 
       j = 0 
     i = i + 1; 

    print D 

In diesem Verfahren die beiden Matrizen Ich erhalte später eine Matrix zu erstellen, die die euklidischen Abstände zwischen den Vektoren meiner Matrizen x und y haben.

Das Problem ist das Folgende, ich weiß nicht wie, zu jedem der berechneten euklidischen Abstandswerte muss ich die korrekte Position der neuen Matrix D zuweisen, die ich erzeugt habe.

Meine Hauptfunktion hat die folgende Struktur:

n = 1000 
m = 700 
d = 10 

x = np.random.randn(n, d) 
y = np.random.randn(m, d) 

print "x shape =", x.shape 
print "y shape =", y.shape 

D_bucle = da.compute_distances(x, y) 
D_cdist = cdist(x, y) 

print np.max(np.abs(D_cdist - D_bucle)) 

B_cdist berechnet die euklidische Distanz effiziente Methoden. Es muss das gleiche Ergebnis wie D_bucle haben, das das gleiche wie das andere aber mit nicht effizientem Code berechnet, aber ich bekomme nicht, was das Ergebnis sein sollte.

Ich denke, es ist, wenn ich meine Euklidische Matrix erstellen, die es nicht richtig macht, dann sind die Berechnungen falsch.

Aktualisiert !!! Ich habe gerade meine Lösung aktualisiert, mein Problem ist, dass ich zuerst nicht wusste, wie man der D-Matrix mein korrektes euklidisches Vektorergebnis für jedes Vektorenpaar zuordnet, Jetzt weiß ich, wie man es anordnet, aber jetzt ist mein Problem nur das erste Linie von D-Matrix ist ein korrektes Ergebnis im Vergleich zu cdist Funktion

+0

Ich nehme an, du verwendest ['math.hypot()'] (https: //docs.python. org/3/library/math.html # math.hypot) um die Entfernungswerte zu berechnen – martineau

+0

Sie berechnen 'n' x 'm' Abstände? – wwii

+0

[Numpy Broadcast zur Durchführung euklidischer Distanz vektorisiert] (https: // stackoverflow. com/q/27948363/2823755) – wwii

Antwort

0

nicht genau zu wissen, was Sie fragen, aber ich habe ein Problem sehen, die Ihre Ergebnisse erklären können:

for v1 in x: 
    for v2 in y: 
    D = math.sqrt(sum([(xi-yi)**2 for xi,yi in zip(v1,v2)])) 

Sie überschreiben die Wert von D jeder der NxM-Zeiten, die Sie durch diese Schleife gehen. Wenn Sie fertig sind, enthält D nur die Entfernung des letzten Vergleichs. Du brauchst vielleicht so etwas wie D [i, j] = math.sqrt (...

+0

'könnte etwas wie D [i, j]' anstelle von ** könnte ** und ** etwas wie **, können Sie eine Lösung/Reparatur für diesen Mangel liefern? – wwii

+0

ja, Ich war vage, weil ich mit numpy nicht vertraut bin, welches die Matrix in diesem Fall liefert –

+0

Das ist meine Lösung, aber ich denke, es macht es nicht richtig, weil der Vergleich der Cdist-Funktion und meiner euklidischen Funktion nur die erste Zeile ist Beide Ergebnisse sind korrekt .i = 0 j = 0 für v1 in x: für v2 in y: if (j! = M): D [i, j] = math.sqrt (Summe ([(xi-yi) **) 2 für xi, yi in zip (v1, v2)])) #print "[", ",", j, "]" j = j + 1 sonst: j = 0 i = i + 1; – fiticida

Verwandte Themen