coordinates - 3d 坐标上的 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 导入归一化),它基本上可以转换为高斯分布,但它不起作用,并且在 DBSCAN 的情况下它不应该,因为它需要每个功能具有相似的密度。
因此,我选择了 MinMax 缩放器,因为它应该使每个特征密度相似,并且需要注意的是,由于缩放后的数据点小于 1,因此也应该在相似范围内使用 epsilon。
荣誉:)
推荐阅读
- sql - 将逗号分隔的字符串拆分为列
- powerbi - Microsoft Power BI - 发布到 Web,每个用户的许可证捕获是什么?
- node.js - 通过 post 请求发送文件
- django - Django密码重置电子邮件显示错误的域
- scala - Parquet 数据类型问题
- javascript - 在 jQuery 中创建多个相同的元素
- android - Data not updating in Android view pager
- ios - 钥匙串如何仅删除特定项目
- php-7 - PHP 7 不带参数的函数中的参数太少
- python-3.x - 如何在python中批量捕获stdout的输出?