我有纬度和经度数据点的数组,我想做分层聚类。这是我的代码:
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我想定义自己的目标(关于逻辑和纬度的真实距离)和地球半径)。让我看来我无法插入自己的功能,任何想法?
答案 0 :(得分:1)
请注意
距离函数通常需要一个字符串(例如"haversine"
)
您有两个位置,您可以使用距离,然后将和作为群集的亲和力。
层次聚类有两种类型的距离,因此有两种距离参数。一个是物体的距离(例如,半身),另一个是群集的距离,其通常通过聚合(例如,最大值,最小值)从该另一个物体得到。两者通常被称为“距离”。在sklearn中,第一个称为affinity
。