【发布时间】:2016-09-03 11:53:00
【问题描述】:
请原谅缺少正式条款,我最近才接触 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 算法的内部工作原理有关吗?还是更可能是算法的实现中出现了一些错误?还是我做出了一些错误的假设?
我希望这就是您需要知道的全部内容,但如果您需要更多信息,请尽管询问。
【问题讨论】:
-
与已知良好的实现进行比较,例如 ELKI 中的实现。
标签: arrays ruby machine-learning cluster-analysis dbscan