8

scikit-learn DBSCAN 実装のカスタム クラスタリング関数を指定しようとしています。

def geodistance(latLngA, latLngB):
    print latLngA, latLngB
    return vincenty(latLngA, latLngB).miles

cluster_labels = DBSCAN(
            eps=500,
            min_samples=max(2, len(found_geopoints)/10),
            metric=geodistance
).fit(np.array(found_geopoints)).labels_

ただし、距離関数への引数を出力すると、期待したものとはまったく異なります。

[ 0.53084126  0.19584111  0.99640966  0.88013373  0.33753788  0.79983037
  0.71716144  0.85832664  0.63559538  0.23032912]
[ 0.53084126  0.19584111  0.99640966  0.88013373  0.33753788  0.79983037
  0.71716144  0.85832664  0.63559538  0.23032912]

これは私の found_geopoints 配列がどのように見えるかです:

[[  4.24680600e+01   1.40868060e+02]
 [ -2.97677600e+01  -6.20477000e+01]
 [  3.97550400e+01   2.90069000e+00]
 [  4.21144200e+01   1.43442500e+01]
 [  8.56111000e+00   1.24771390e+02]
...

では、距離関数の引数が緯度経度のペアではないのはなぜですか?

4

2 に答える 2

4

http://scikit-learn.org/stable/modules/generated/sklearn.metrics.pairwise.pairwise_distances.htmlを使用して距離行列を計算する回避策を見つけたようです。 次に、それを引数として使用しますDBSCAN(metric='precomputed').fit(distance_matrix)

于 2014-05-02T05:38:35.077 に答える
1

scikit-learn でこれを行うことができます: ボール ツリー アルゴリズムで haversine メトリックを使用し、ラジアン単位を DBSCAN フィット メソッドに渡します。

このチュートリアルでは、scikit-learn の DBSCANで、緯度と経度のポイント間の正確な測地距離に基づいてクラスター化する hasersine メトリックを使用して、空間緯度経度データをクラスター化する方法を示します。

df = pd.read_csv('gps.csv')
coords = df.as_matrix(columns=['lat', 'lon'])
db = DBSCAN(eps=eps, min_samples=ms, algorithm='ball_tree', metric='haversine').fit(np.radians(coords))

座標はラジアン単位でメソッドに渡され.fit()、epsilon パラメータ値もラジアン単位でなければならないことに注意してください。

イプシロンを 1.5km にしたい場合、ラジアン単位のイプシロン パラメータ値は = 1.5/6371 になります。

于 2016-08-02T22:52:21.320 に答える