2017-11-03 7 views
0

Ich habe einen Pandas-Datenrahmen (siehe kleines Beispiel unten). Ich möchte euklidische Abstände zwischen Beobachtungen (Zeilen) basierend auf ihren Werten in 3 Spalten (Features) berechnen. Ich benutze scipy.spatial.distance.pdist.Entfernungen extrahieren nach dem Ausführen von scipy.spatial.distance.pdist

Ich verstehe, dass das zurückgegebene Objekt (Dist) 190 Abstände zwischen meinen 20 Beobachtungen (Zeilen) enthält. Ich nehme an, es ist eine "entfaltete" Dreiecksmatrix - mit Abständen zwischen der ersten Reihe und der zweiten, dann wahrscheinlich zwischen der ersten Reihe und der dritten, ... zwischen 1. und 20., dann zwischen 2. und 3., 2. und 4. usw. usw.

Allerdings bin ich mir nicht sicher. Und: Wie könnte ich eine symmetrische 20 mal 20 Matrix mit Abständen darin bauen?

Mein oberstes Ziel: Für jede Beobachtung (Zeile) Ich möchte seine nächsten 5 Nachbarn finden (d. H. Zeilen mit dem geringsten Abstand) und summieren diese 5 Entfernungen. Wenn ich eine quadratische Matrix hätte, könnte ich einfach eine Funktion auf jede Spalte anwenden. Aber im Moment bin ich mir nicht sicher, wie ich mit 'dist' umgehen soll.

Vielen Dank für Ihre Hilfe!

import numpy as np 
import pandas as pd 
# Generate fake Pandas data frame 
a = pd.Series(np.random.normal(1, 0.1, 20)) 
df = pd.DataFrame(a, columns=['a']) 
df['b'] = pd.Series(np.random.normal(2, 0.1, 20)) 
df['c'] = pd.Series(np.random.normal(3, 0.1, 20)) 
import scipy 
dist = scipy.spatial.distance.pdist(df, metric='euclidean') 

dist.shape # (190,)

Antwort

1

Sie dist-scipy.spatial.distance.squareform passieren können. Es konvertiert ein n-mal-1-Array von paarweisen Abständen in eine quadratische Matrixform.

d_matrix = scipy.spatial.distance.squareform(dist) 
+0

Vielen Dank! – user3245256

Verwandte Themen