2017-11-03 15 views
0

私はPandasデータフレームを持っています(下記の小さな例を参照)。観測値(行)間のユークリッド距離を3列(フィーチャ)の値に基づいて計算したい。私はscipy.spatial.distance.pdistを使用しています。実行後の距離の抽出scipy.spatial.distance.pdist

返されたオブジェクト(dist)には、20個の観測値(行)の間に190個の距離が含まれていることを理解しています。 1行目と2行目の距離、1行目と3行目、1行目と20行目の間、2行目と3行目、2行目と2行目の間に距離がある「展開されていない」三角行列です第4など、

しかし、わかりません。そして、どうすれば20×20の対称行列を構築できますか?

私の究極の目的: 観測(行)ごとに、最も近い5つの近隣(つまり、そこから最小の距離の行)を見つけてそれらの5つの距離を合計したいと考えています。正方行列の場合は、各列に関数を適用するだけです。しかし、今私は 'dist'に対処する方法がわかりません。

ありがとうございました!

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)

答えて

1

あなたはscipy.spatial.distance.squareformdistを渡すことができます。これはペアごとの距離のn行1列の配列を正方行列形式に変換します。

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

ありがとうございました! – user3245256