使用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和纬度与地球半径)。让我似乎无法插入我自己的功能,任何想法?
答
注意
的距离函数需要字符串通常(例如
"haversine"
)你有在您使用的距离,然后KNN图和作为亲和性位置集群。
等级聚类有两种类型的距离,因此有两个距离参数。一个是物体的距离(例如有机物),另一个是聚类的距离,通常通过聚合(例如,最大值,最小值)从该其他值得出。两者通常被称为“距离”。在sklearn中,第一个叫做
affinity
。
和'affinity =“haversine”'不起作用?然后使用预先计算的距离矩阵或ELKI。 –
@ Anony-Mousse,嗯,它现在有用,我只是忘了“”(愚蠢的)。顺便说一下,在knn_graph中,距离由“haversine”定义,当进行凝聚聚类时,我们试图最小化的函数,即“平均完整的病房距离”,这个距离也是正半轴距离或不? – printemp
您需要将'affinity'传递给聚类。请参阅文档。 –