Die meisten effizienten Art und Weise zu konstruieren-ähnlichkeit-matrix
Bin ich über die folgenden links, um eine "euklidische Ähnlichkeit Matrix" (die ich konvertieren, um ein DataFrame).
https://stats.stackexchange.com/questions/53068/euclidean-distance-score-and-similarity
http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.spatial.distance.euclidean.html
Den Weg, die ich mache es ist ein iterativer Ansatz, der funktioniert, aber es dauert eine Weile, wenn die Datensätze groß. Die pd-pandas.DataFrame.corr() ist wirklich schnell und hilfreich für pearson-Korrelationen.
Wie kann ich eine euklidische Ähnlichkeit Maßnahme w/o erschöpfend iteration?
Meine naive folgenden code:
#Euclidean Similarity
#Create DataFrame
DF_var = pd.DataFrame.from_dict({"s1":[1.2,3.4,10.2],"s2":[1.4,3.1,10.7],"s3":[2.1,3.7,11.3],"s4":[1.5,3.2,10.9]}).T
DF_var.columns = ["g1","g2","g3"]
# g1 g2 g3
# s1 1.2 3.4 10.2
# s2 1.4 3.1 10.7
# s3 2.1 3.7 11.3
# s4 1.5 3.2 10.9
#Create empty matrix to fill
M_euclid = np.zeros((DF_var.shape[1],DF_var.shape[1]))
#Iterate through DataFrame columns to measure euclidean distance
for i in range(DF_var.shape[1]):
u = DF_var[DF_var.columns[i]]
for j in range(DF_var.shape[1]):
v = DF_var[DF_var.columns[j]]
#Euclidean distance -> Euclidean similarity
M_euclid[i,j] = (1/(1+sp.spatial.distance.euclidean(u,v)))
DF_euclid = pd.DataFrame(M_euclid,columns=DF_var.columns,index=DF_var.columns)
# g1 g2 g3
# g1 1.000000 0.215963 0.051408
# g2 0.215963 1.000000 0.063021
# g3 0.051408 0.063021 1.000000
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es zwei nützliche Funktion innerhalb
scipy.spatial.distance
, die Sie dafür benutzen können:pdist
undsquareform
. Mitpdist
geben Sie den paarweisen Abstand zwischen Beobachtungen, wie ein eindimensionales array, undsquareform
konvertiert diese zu einer Distanz-matrix.Einem Haken ist, dass
pdist
verwendet distanzmaße von Standard-und nicht ähnlichkeit, also müssen Sie Sie manuell festlegen, Ihre ähnlichkeit-Funktion. Die Beurteilung durch die kommentierte Ausgabe in Ihren code, Ihre DataFrame ist auch nicht in der Orientierungpdist
erwartet, also habe ich rückgängig gemacht, das transponieren, Sie haben in Ihrem code.Ich denke, Sie können einfach verwenden Sie
pdist
undsquareform
zur Ausstrahlung direkt auf Ihrem DataFrame:Du willst
scipy.spatial.distance.pdist
odersklearn.metrics.pairwise.pairwise_distances
Die einfachste Möglichkeit, die ich finden kann das gleiche Ergebnis zu erhalten wie der OP, ist die Verwendung distance_matrix, auch von scipy.Objektart. Die ganze Sache kann man in einer Art-von-langen Linie.
Den obigen code kopieren und einfügen, und führen Sie in die python-IDE.
Dies ist, was ich getan habe: