coordinates - 3d 坐标上的 DBSCAN 找不到簇

标签 coordinates cluster-analysis dbscan

我正在尝试对 1428 个点的 3D 坐标 DataFrame 中的点进行聚类。 这些簇是相对平坦的平面,是细长的云DataFrame 。它们是非常明显的集群,所以我希望尝试无监督集群(不输入预期的集群数量)KMeans 没有正确地将它们分开,并且确实需要集群的数量: Kmeans plot results

数据如下:

                 5             6         7
0      9207.495280  18922.083277  4932.864
1      5831.199280   3441.735280  5756.326
2      8985.735280  12511.719280  7099.844
3      8858.223280  28883.151280  5689.652
4      6801.399277   6468.759280  7142.524
...            ...           ...       ...
1423  10332.927277  22041.855280  5136.252
1424   6874.971277  12937.563277  5467.216
1425   8952.471280  28849.887280  5710.522
1426   7900.611277  19128.255280  4803.122
1427  10234.635277  18734.631280  5631.286

[1428 rows x 3 columns]

我希望 DBSCAN 能够更好地处理这些数据。但是,当我尝试以下操作时(我尝试了 eps 和 min_samples 但没有成功):

from sklearn.cluster import DBSCAN
dbscan = DBSCAN(eps=10, min_samples = 50)
clusters = dbscan.fit_predict(X)

print('Clusters found', dbscan.labels_)
len(clusters)

我得到这个输出:

Clusters found [-1 -1 -1 ... -1 -1 -1]

1428

我一直对如何让它发挥作用感到困惑,特别是因为 Kmeans 确实起作用了:

kmeans = sk_cluster.KMeans(init='k-means++', n_clusters=9, n_init=50)
kmeans.fit_predict(X)
centroids = kmeans.cluster_centers_
kmeans_labels = kmeans.labels_
error = kmeans.inertia_
print ("The total error of the clustering is: ", error)
print ('\nCluster labels')
The total error of the clustering is:  4994508618.792263

Cluster labels
[8 0 7 ... 3 8 1]

最佳答案

记住这条黄金法则:

在将数据输入 ML/DL 算法之前,始终对数据执行标准化。

原因是,你的列有不同的范围,可能一列的范围是[10000,20000],其他列的范围是[4000,5000],当你将这些坐标绘制在图表上时,它们会非常非常远,聚类/分类永远不会起作用,也许回归会起作用。缩放使每个列的范围达到相同的水平,但仍然保持距离,但比例不同。就像在谷歌地图中一样,当您放大时比例会减小,当您缩小时比例会增加。

你可以自由选择归一化算法,sklearn 上几乎有 20-30 种可用的算法。

编辑:

使用此代码:

from sklearn.preprocessing  import MinMaxScaler
scaler = MinMaxScaler()
scaler.fit(X)
X_norm = scaler.transform(X)

from sklearn.cluster import DBSCAN
dbscan = DBSCAN(eps=0.05, min_samples = 3,leaf_size=30)
clusters = dbscan.fit_predict(X_norm)

np.unique(dbscan.labels_)

array([-1,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
       16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
       33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47])

我发现,由于 DBSCAN 是一种基于密度的方法,我尝试了 sklearn 标准化器(来自 sklearn.preprocessing import normalize),它基本上转换为高斯分布,但它不起作用,而且在 DBSCAN 的情况下也不应该起作用,因为它要求每个特征具有相似的密度。

因此,我选择了 MinMax 缩放器,因为它应该使每个特征的密度变得相似,并且需要注意的是,由于缩放后的数据点小于 1,因此也应该在类似的范围内使用 epsilon。

谢谢:)

关于coordinates - 3d 坐标上的 DBSCAN 找不到簇,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65902125/

相关文章:

c++ - 如何在C++中保存坐标

ios - 导航到 MKMapView 上的注释位置

python - 对于DBSCAN python,是否必须同时进行标准化和规范化?

c - 多少 mxRealloc 可以影响 C-Mex matlab 代码?

scikit-learn - 使用 kmeans 计算簇质心

cluster-analysis - OPTICS 聚类算法的 ELKI 实现只检测到一个聚类

python - 从 Excel 中读取和比较坐标

jquery使用鼠标坐标偏移 'tooltip'样式悬停函数

matlab - 如何在 MATLAB 中生成 'clusterable' 数据集

python - 如何计算水平线和树线树形图之间的线交叉Python