Algorithm DBSCAN算法(递归逻辑)

Algorithm DBSCAN算法(递归逻辑),algorithm,recursion,dbscan,Algorithm,Recursion,Dbscan,我的理解是,如果访问核心点的邻居的核心点,它将加入当前检查的集群,对吗?但是递归是如何发生的呢?因为我们已经定义了以下循环: NeighborPts = NeighborPts joined with NeighborPts' 在加入过程之前,因此expandCluster函数不会检查NeighborPts'中的任何附加点,如果新NeighborPts'实际上有一个点是同一集群的另一个核心点,那么该算法将如何进行 我有一个用Java实现“expandCluster”方法的代码:

我的理解是,如果访问核心点的邻居的核心点,它将加入当前检查的集群,对吗?但是递归是如何发生的呢?因为我们已经定义了以下循环:

      NeighborPts = NeighborPts joined with NeighborPts'
在加入过程之前,因此expandCluster函数不会检查NeighborPts'中的任何附加点,如果新NeighborPts'实际上有一个点是同一集群的另一个核心点,那么该算法将如何进行

我有一个用Java实现“expandCluster”方法的代码:

   for each point P' in NeighborPts 
public void expand(向量区域,c组,双距离,整数分钟){
对于(int i=0;i=minPts){//检查核心点
region.addAll(v);//加入邻居
}
}
if(群集[idx]==0){
c、 元素.add(patterns.get(idx));
clustered[idx]=clusters.size()+1;
}
}
}
通过此代码修改数据采集后,是否将重新访问数据采集
区域
。addAll(v)

我的理解是,如果核心点来自核心的邻居 访问点后,它将加入当前检查的群集, 对吧?

是的,你是对的,你可以安全地移除线路

如果p'未被访问

然而,这是没有效率的

如果已经访问了点p’,则无需计算其邻域并将其与p的邻域连接

它被访问意味着:它是一个噪声点,它已经在集群中,或者它是一个边界点。 如果它已经在集群中并且是核心点,这意味着它的邻居已经被处理过了。 如果它是一个边境点,那么它的邻国就不能加入

但是递归是如何发生的呢

排队

对于邻域中的每个点p'

你必须考虑<代码>邻居/<代码>作为一个动态的点容器。第一次输入for循环时,

neightrpts
包含
X
点。如果连接添加
Y
指向
NeighborPts
,则for循环将访问
X
Y
集合。然后对集合
X
Y
重复此操作,递归就是这样发生的

数据收集区域将在会议结束后重新访问吗 通过此代码修改数据收集 地区。addAll(v)


是的,每次你调用
region.addAll(v)
region.size()
都会增加,这证实了让你困惑的递归行为。

非常感谢,我不知道
addAll()
会产生这种行为,这让我对递归感到困惑。
   for each point P' in NeighborPts 
public void expand(Vector<Integer> region, Group c, double dist, int minPts){
    for(int i = 0; i < region.size(); i++){
        int idx = region.get(i);
        if(labels[idx] == 0){                         // check if point is visited
            labels[idx] = 1;                          // mark as visited
            Vector<Integer> v = region(idx, dist);    // check for neighboring point
            if (v.size() >= minPts){                  // check if core point
                region.addAll(v);                     // join the NeighborPts 
            }
        }
        if(clustered[idx] == 0){
            c.elements.add(patterns.get(idx));
            clustered[idx] = clusters.size()+1;
        }
    }
}