使用sklearn进行空间数据聚类

时间:2016-11-16 19:32:35

标签: python scikit-learn cluster-analysis spatial

我有纬度和经度数据点的数组,我想做分层聚类。这是我的代码:

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我想定义自己的目标(关于逻辑和纬度的真实距离)和地球半径)。让我看来我无法插入自己的功能,任何想法?

1 个答案:

答案 0 :(得分:1)

请注意

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

  • 您有两个位置,您可以使用距离,然后将作为群集的亲和力。

  • 层次聚类有两种类型的距离,因此有两种距离参数。一个是物体的距离(例如,半身),另一个是群集的距离,其通常通过聚合(例如,最大值,最小值)从该另一个物体得到。两者通常被称为“距离”。在sklearn中,第一个称为affinity