如何在 DBSCAN sklearn 中获取质心?

Posted

技术标签:

【中文标题】如何在 DBSCAN sklearn 中获取质心?【英文标题】:How to get the centorids in DBSCAN sklearn? 【发布时间】:2020-09-24 16:39:09 【问题描述】:

我正在使用 DBSCAN 进行聚类。但是,现在我想从代表它的每个集群中选择一个点,但我意识到 DBSCAN 没有 km​​eans 中的质心。

但是,我发现 DBSCAN 有一个名为 core points 的东西。我正在考虑是否可以使用这些核心点或任何其他替代方法从每个集群中获取代表点。

我已经在下面提到了我使用的代码。

import numpy as np
from math import pi
from sklearn.cluster import DBSCAN

#points containing time value in minutes
points = [100, 200, 600, 659, 700]

def convert_to_radian(x):
    return((x / (24 * 60)) * 2 * pi)

rad_function = np.vectorize(convert_to_radian)
points_rad = rad_function(points)

#generate distance matrix from each point
dist = points_rad[None,:] - points_rad[:, None]

#Assign shortest distances from each point
dist[((dist > pi) & (dist <= (2*pi)))] = dist[((dist > pi) & (dist <= (2*pi)))] -(2*pi)
dist[((dist > (-2*pi)) & (dist <= (-1*pi)))] = dist[((dist > (-2*pi)) & (dist <= (-1*pi)))] + (2*pi) 
dist = abs(dist)

#check dist
print(dist)

#using default values, set metric to 'precomputed'
db = DBSCAN(eps=((100 / (24*60)) * 2 * pi ), min_samples = 2, metric='precomputed')

#check db
print(db)

db.fit(dist)

#get labels
labels = db.labels_

#get number of clusters
no_clusters = len(set(labels)) - (1 if -1 in labels else 0)

print('No of clusters:', no_clusters)
print('Cluster 0 : ', np.nonzero(labels == 0)[0])
print('Cluster 1 : ', np.nonzero(labels == 1)[0])

print(db.core_sample_indices_)

如果需要,我很乐意提供更多详细信息。

【问题讨论】:

以防万一您不知道:Kmeans 是一种基于质心的方法(每个聚类只是一个质心,所有点都属于最近的质心)。 DBSCAN 是基于密度的,因此生成的簇可以具有任何形状,只要点之间的距离足够近。因此,DBSCAN 也可能会在中心产生一个“球”簇,周围有一个“圆”簇。在这种情况下,两个集群将具有相同的“质心”,这就是为什么计算 DBSCAN 结果的质心可能具有高度误导性的原因。所以在使用这些质心时要小心(或使用基于质心的方法)。 【参考方案1】:

你为什么不估计得到的估计聚类的质心?

points_of_cluster_0 = dist[labels==0,:]
centroid_of_cluster_0 = np.mean(points_of_cluster_0, axis=0) 
print(centroid_of_cluster_0)

points_of_cluster_1 = dist[labels==1,:]
centroid_of_cluster_1 = np.mean(points_of_cluster_1, axis=0)
print(centroid_of_cluster_1)

【讨论】:

它对纬度和经度值产生错误的结果。 什么意思?在哪个数据集/问题中? 考虑两点:0.0, -179.0 和 0.0, 179.0。它们的质心是0.0,0.0,离它们很远。 哦,是的。我的答案是关于欧几里得坐标。您需要找到另一种获取 GPS 坐标的方法。将它们转换为其他系统。最好的

以上是关于如何在 DBSCAN sklearn 中获取质心?的主要内容,如果未能解决你的问题,请参考以下文章

Sklearn.KMeans() :获取类质心标签并引用数据集

DBSCAN与kmeans,OPTICS区别?

Sklearn:到每个集群的质心的平均距离

如何计算 Sklearn 中点到质心的平均距离的平均值? [复制]

在 python 中的 sklearn 中绘制 DBSCAN 中的特定点

聚类算法讲解:KMEANS和DBSCAN