DBSCAN kdist-绘制多个谷
DBSCAN kdist-Plot multiple valleys
我正在使用 Sander 等。 1998 确定 MinPts 和 epsilon 在我的数据集上使用 DBSCAN。
正如 Sanders 等人所建议的那样,minpts=dim*2-1=k(在我的例子中是 9 个维度 --> minpts=k=17)。
在论文中应该选择"first valley"。我可以看到两个山谷,但第一个是哪个?您会为 epsilon 选择什么值?
kdistplot_with_duplicates
由于 Sanders 还建议只有在没有重复项的情况下才应使用此方法,如果没有重复项:(尽管我认为在这种情况下应该无关紧要)
kdistplot_without_duplicates。
哪个山谷应该被视为 "first" 山谷?
使用的代码:
ns = 17
nbrs = NearestNeighbors(n_neighbors=ns, metric='euclidean').fit(data)
distances, indices = nbrs.kneighbors(data)
distanceDec = sorted(distances[:,ns-1], reverse=True)
plt.plot(list(range(1,683+1)), distanceDec)
左边是谷(epsilon的最小值):有了这个值,左边所有的点都不聚类(被认为是噪声),右边的所有点都会聚类。
您可以阅读原文 DBSCAN paper 并特别查看图 4 以更好地理解基本原理。
这表明可能存在层次结构的集群,或具有不同密度的集群。
在这种情况下,DBSCAN 上的单个 阈值是不够的。您可以尝试两次聚类,使用两个不同的阈值。或者您使用分层版本,例如 OPTICS 和 HDBSCAN。最近,人们对 HDBSCAN 非常满意,我用 OPTICS 得到了更好的结果(我相信有一个很好的理由 why,即我希望边界点成为集群的一部分)
我正在使用 Sander 等。 1998 确定 MinPts 和 epsilon 在我的数据集上使用 DBSCAN。 正如 Sanders 等人所建议的那样,minpts=dim*2-1=k(在我的例子中是 9 个维度 --> minpts=k=17)。 在论文中应该选择"first valley"。我可以看到两个山谷,但第一个是哪个?您会为 epsilon 选择什么值? kdistplot_with_duplicates
由于 Sanders 还建议只有在没有重复项的情况下才应使用此方法,如果没有重复项:(尽管我认为在这种情况下应该无关紧要) kdistplot_without_duplicates。 哪个山谷应该被视为 "first" 山谷?
使用的代码:
ns = 17
nbrs = NearestNeighbors(n_neighbors=ns, metric='euclidean').fit(data)
distances, indices = nbrs.kneighbors(data)
distanceDec = sorted(distances[:,ns-1], reverse=True)
plt.plot(list(range(1,683+1)), distanceDec)
左边是谷(epsilon的最小值):有了这个值,左边所有的点都不聚类(被认为是噪声),右边的所有点都会聚类。
您可以阅读原文 DBSCAN paper 并特别查看图 4 以更好地理解基本原理。
这表明可能存在层次结构的集群,或具有不同密度的集群。
在这种情况下,DBSCAN 上的单个 阈值是不够的。您可以尝试两次聚类,使用两个不同的阈值。或者您使用分层版本,例如 OPTICS 和 HDBSCAN。最近,人们对 HDBSCAN 非常满意,我用 OPTICS 得到了更好的结果(我相信有一个很好的理由 why,即我希望边界点成为集群的一部分)