2017-01-16 9 views
1

ベクトルの要素間のユークリッドペアワイズ距離を計算しています。私はsklearnパッケージのpairwise_distances関数を使用します。しかし、いくつかの要素の結果の行列はほぼ対称的です。等しいと思われる要素の値は、1つの例で小数点の後ろの15桁までしか等しくありません。sklearnのペアワイズ距離の結果が予想外に非対称です

入力行列の対称性を仮定した下流解析でエラーが発生したので、これを実現しました。私は値を丸めることができますが、これを引き起こしているのは分かりますか?ここで

は、(それがパンダのデータフレームの列です)私はのためのペア賢明な距離を計算しようとしていますベクトルである:ここでは

lag_measure_data[['bios_level']].values 

array([[ 0.76881030949999995538490793478558771312236785888671875 ], 
    [ 0.              ], 
    [ 0.67783090619999997183953155399649403989315032958984375 ], 
    [ 0.3228176074999999922710003374959342181682586669921875 ], 
    [ 0.75822395549999999087020796650904230773448944091796875 ], 
    [ 0.469808621599999975959605080788605846464633941650390625], 
    [ 0.989529862699999984698706612107343971729278564453125 ], 
    [ 0.              ], 
    [ 0.5575436799999999859522858969285152852535247802734375 ], 
    [ 0.9756440299999999954394525047973729670047760009765625 ], 
    [ 0.66511863289999995085821637985645793378353118896484375 ], 
    [ 0.978062709200000046649847718072123825550079345703125 ], 
    [ 0.473957179800000016900440868994337506592273712158203125], 
    [ 0.82409385540000001935112550199846737086772918701171875 ], 
    [ 0.56548685279999999497846374651999212801456451416015625 ], 
    [ 0.399505730399999980928527065771049819886684417724609375], 
    [ 0.474232963900000026313819034839980304241180419921875 ], 
    [ 0.34276307189999999369689476225175894796848297119140625 ], 
    [ 0.9985316859999999739017084721126593649387359619140625 ], 
    [ 0.9063241512999999915933813099400140345096588134765625 ], 
    [ 0.              ]]) 

は、私は距離行列を取得するために使用するコマンドである。

d_matrix_lag = pairwise_distances(lag_measure_data[['bios_level']].values) 

それはあまりにも面倒であるように私はここに出力距離行列を印刷していないが、最初の行の例として、第4列の値は

0.445992701999999907602756366あります031826473772525787353515625

4行1列の値が

0.4459927019999998520916051347739994525909423828125

+0

このような距離を与えるベクターとは何ですか? – Dmitry

+0

私が印刷した配列の1番目と4番目の要素を比較すれば、これらの結果をうまく再現できます。 pairwise_distances(0.3228176074999999922710003374959342181682586669921875,0.76881030949999995538490793478558771312236785888671875) OUT [700]:配列([0.4459927019999998520916051347739994525909423828125]) pairwise_distances(0.76881030949999995538490793478558771312236785888671875,0.3228176074999999922710003374959342181682586669921875) OUT [701]:配列([0.445992701999999907602756366031826473772525787353515625])I上記コメントで – user277194

+0

2つの引数の場所を切り替えると2つの浮動小数点のためのペアのcalcualtionを2回実行し、結果はわずかに異なります – user277194

答えて

3

いる間、私はあなたのエラー私の対称性のためのテスト再現することができます:

import numpy as np 

a = np.array([[ 0.76881030949999995538490793478558771312236785888671875 ], 
    [ 0.              ], 
    [ 0.67783090619999997183953155399649403989315032958984375 ], 
    [ 0.3228176074999999922710003374959342181682586669921875 ], 
    [ 0.75822395549999999087020796650904230773448944091796875 ], 
    [ 0.469808621599999975959605080788605846464633941650390625], 
    [ 0.989529862699999984698706612107343971729278564453125 ], 
    [ 0.              ], 
    [ 0.5575436799999999859522858969285152852535247802734375 ], 
    [ 0.9756440299999999954394525047973729670047760009765625 ], 
    [ 0.66511863289999995085821637985645793378353118896484375 ], 
    [ 0.978062709200000046649847718072123825550079345703125 ], 
    [ 0.473957179800000016900440868994337506592273712158203125], 
    [ 0.82409385540000001935112550199846737086772918701171875 ], 
    [ 0.56548685279999999497846374651999212801456451416015625 ], 
    [ 0.399505730399999980928527065771049819886684417724609375], 
    [ 0.474232963900000026313819034839980304241180419921875 ], 
    [ 0.34276307189999999369689476225175894796848297119140625 ], 
    [ 0.9985316859999999739017084721126593649387359619140625 ], 
    [ 0.9063241512999999915933813099400140345096588134765625 ], 
    [ 0.              ]]) 

from sklearn.metrics.pairwise import pairwise_distances 
dist_sklearn = pairwise_distances(a) 
print((dist_sklearn.transpose() == dist_sklearn).all()) 

が出力としてFalseを取得。代わりにscipy.spatial.distanceを使用してみてください。これは私に対称行列を与えた

from scipy.spatial.distance import pdist, squareform 

dist = pdist(a) 
sq = squareform(dist) 
print((sq.transpose() == sq).all()) 

あなたは)(ペアワイズ距離計算の距離ベクトルを取得しますが、squareformで距離行列に変換することができます。 ほしいと思っています。

+0

私はこれ以上のひどい頭痛を得ていたこのおかげでありがとう。何らかの理由で私は距離行列を丸めることさえ困難でした。私はPythonの私の信仰を失い始めていた... – user277194

+0

あなたの歓迎。 Pythonの信用を失うことはありません;) – NKlink0r

関連する問題