3D空间中的球体聚类点

时间:2017-05-17 10:04:14

标签: algorithm cluster-analysis

有3D空间,受立方体限制,边缘= 2000。

坐标系中心为点(0; 0; 0),因此最大/最小坐标值为1000 / -1000。

在K球体内部生成了10000个点,这些点位于立方体中。

每个球体的半径(R)为250。

球体中心位于不小于2 * R的距离。

需要确定哪个点与哪个球相关。

输入:10000个结构的数组,如:

struct Point {

            int number;
            int x;
            int y;
            int z;

}

其中number是点的唯一id,x,y,z - 它的坐标。

输出:

10000个结构的数组,如:

struct Point {

            int number;
            int cluster_id;

}

其中cluster_id是该点所属球体的唯一簇ID。

最初我考虑了以下解决方案:

1)找到从坐标中心(0; 0; 0)到点坐标的每个点的欧几里德距离。

2)按降序对这个距离数组进行排序。

3)从已排序的距离数组中获取点并输入一组新的群集最大值。

4)将数组中的以下点与集群最大值集合中的每个值进行比较(最初为1个值)。

如果它的欧几里德距离小于或等于2 * R,那么

将此点标记为属于Kth群集(范围= 1..N),否则将该点添加到群集最大值集。

5)重复步骤4.

我有两个问题:

1)如果Claster Maximals位于球体表面,我的算法只会出现问题。

2)另外,根据任务要求,可能存在2个球体只有1个且只有共同点的情况。

我想如果点属于2个球体,可以用这两个中的任何一个的cluster_id标记它。

请你为这项任务提供合适的解决方案吗?

1 个答案:

答案 0 :(得分:0)

给出半径,找到邻居最多的点。

以邻居的平均值为中心,删除半径范围内的所有内容。

重复直到没有密集点为止。

执行一些后处理以进一步优化未分配的点并确保最小距离。