使用sklearn进行空间数据聚类

问题描述:

我有经纬度数据点阵列,我希望进行分层聚类。这里是我的代码:使用sklearn进行空间数据聚类

position = zip(longitude, latitude) 
X = np.asarray(position) 

knn_graph = kneighbors_graph(X, 30, include_self=False, metric= haversine) 

for connectivity in (None, knn_graph): 
    for n_clusters in(5,8,10,15,20): 
     plt.figure(figsize=(4, 5)) 
     cnt = 0 
     for index, linkage in enumerate(('average', 'complete', 'ward')): 
       model = AgglomerativeClustering(linkage = linkage, 
               connectivity = connectivity, 
               n_clusters = n_clusters) 
       model.fit(X) 
       plt.scatter(X[:, 0], X[:, 1], c=model.labels_, 
          cmap=plt.cm.spectral) 
       plt.title('linkage=%s (ncluster) %s)' % (linkage, n_clusters), 
             fontdict=dict(verticalalignment='top')) 
       plt.axis([37.1, 37.9, -122.6, -121.6]) 
    plt.show() 

问题是kneighbors_graph有一个叫metric参数,它是我们如何定义的目标,http://scikit-learn.org/stable/modules/generated/sklearn.neighbors.kneighbors_graph.html我想定义自己的(实际距离关于logitude和纬度与地球半径)。让我似乎无法插入我自己的功能,任何想法?

+0

和'affinity =“haversine”'不起作用?然后使用预先计算的距离矩阵或ELKI。 –

+0

@ Anony-Mousse,嗯,它现在有用,我只是忘了“”(愚蠢的)。顺便说一下,在knn_graph中,距离由“haversine”定义,当进行凝聚聚类时,我们试图最小化的函数,即“平均完整的病房距离”,这个距离也是正半轴距离或不? – printemp

+0

您需要将'affinity'传递给聚类。请参阅文档。 –

注意

  • 的距离函数需要字符串通常(例如"haversine"

  • 你有在您使用的距离,然后KNN图作为亲和性位置集群。

  • 等级聚类有两种类型的距离,因此有两个距离参数。一个是物体的距离(例如有机物),另一个是聚类的距离,通常通过聚合(例如,最大值,最小值)从该其他值得出。两者通常被称为“距离”。在sklearn中,第一个叫做affinity