请原谅缺少正式术语,我最近才接触 ML。
出于学习目的,我决定尝试 DBSCAN 算法的 Ruby 实现 ( https://github.com/matiasinsaurralde/dbscan )。
基于 https://github.com/matiasinsaurralde/dbscan/blob/master/examples/simple.rb 的简单示例构建我创建了一个包含 1000 个数组的数组,每个数组包含两个随机值“x”和“y”(一个 2d 点),然后将这些数据输入 DBSCAN 算法(根据需要调整“epsilon”和“最小距离” )。
data_sample = Array.new(1000) { Array.new(2) { rand(100).round } }
dbscan = DBSCAN( data_sample, :epsilon => 3, :min_points => 2, :distance => :euclidean_distance )
然后我将生成的数据(聚类和非聚类数据)导出到 Excel,以绘制聚类和非聚类数据的图表。
这是我想到的:
现在有一件事我不确定:对于某些彼此非常接近的点,或者共享相同的 x 和 y 的点,我看到的是两个点之一,而不是使其成为理智的点另一个点的簇,被归类为非簇。
看一下点 47、74:属于一个簇的点位于另一个非簇点的“上方”。这种情况也会发生在 14、87、77,64、20,61 以及许多其他位置(对于某些点,它们具有相同的 x 和 y)。
现在正如我所说,我仍在接近这一点,所以有人可以告诉我是否对我所看到的有解释吗?这与 DBSCAN 算法的内部工作原理有关吗?或者说更有可能是算法的实现过程中出现了一些错误?或者我做出了一些错误的假设?
我希望这就是您需要知道的全部内容,但如果您需要更多信息,请直接询问。
最佳答案
所以里面其实有两个问题:
- 两个非常接近的点是否有可能具有不同的标签?特别是其中一个是“非集群”的?
是的,这是可能的,并且直接来自 dbscan 方法,该方法特别要求一个点具有给定数量的近邻,以便被分类为除“非集群”以外的任何类型
- 是否有可能完全相同位置的两个点最终出现在两个不同的簇中?
不,这是不可能的。因此,要么这些点不相同(也许您正在比较它们的舍入表示,而不是真实的?),要么实现有错误。
关于arrays - 这是 DBSCAN 算法的预期行为吗(两个相同的数据样本不适契约(Contract)一簇)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37105720/