请原谅我没有使用正式术语,我最近才开始接触机器学习。
为了学习,我决定尝试使用Ruby实现DBSCAN算法(https://github.com/matiasinsaurralde/dbscan)。
基于https://github.com/matiasinsaurralde/dbscan/blob/master/examples/simple.rb中的简单示例,我创建了一个包含1000个数组的数组,每个数组包含两个随机值,“x”和“y”(一个二维点),然后我将这些数据输入到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方法,特别是要求一个点必须有足够多的近邻点,才能被分类为除“未簇”之外的任何类别。
- 两个位置完全相同的点是否可能最终进入两个不同的簇?
不,这是不可能的。因此,要么这些点并非完全相同(也许你在比较它们的四舍五入表示,而非真实值?),要么实现中有错误。