寻找已知数量的圆心,以最大化固定距离内的点数


10

我有一组二维数据,我想在其中找到指定数量的圆心()的中心,这些圆使指定距离()内的点总数达到最大。NR

例如,我有10,000个数据点,我想找到圆的中心,它们在的半径内捕获了尽可能多的点。预先给出了5个中心和10个半径,而不是从数据中得出的。(Xi,Yi)N=5R=10

圆内数据点的存在是二进制“或”或“命题”。如果,则相距11个单位与100个单位之外的点的值没有差异,因为它们都>10。类似地,在圆内,靠近中心与靠近边缘也没有任何附加值。 。数据点在圆圈之一中或不在圆圈中。R=10

是否有一个好的算法可以用来解决这个问题?这些似乎与聚类技术有关,但不是最小化平均距离,如果该点在个点中的任意一个点的内,则“距离”函数为0 ,否则为1。RN

我更喜欢在R中找到一种方法来执行此操作,但是任何方法都是可以理解的。


允许圆重叠吗?
curious_cat

1
这实质上是栅格数据集上的邻域(或焦点)操作。最好检查GIS站点以查看是否已回答,并检查R软件包以进行栅格分析。
安迪W

1
允许圆重叠,但是两个圆所覆盖的数据点将不会重复计算。感谢您指向栅格数据集上邻域/焦点操作的指针。我将根据这些内容进行搜索。
Colonel.triq 2013年

@Andy W尽管解决方案自然会涉及焦点操作,但是这个问题超出了GIS社区恕我直言,因为这确实是一个(相当困难的)优化问题。这并不是一个简单的最大平均焦距网格。我建议将其保留一段时间,然后,如果没有令人满意的解决方案出现,请迁移到面向编程的站点。
whuber

....或迁移到math.overflow?他们可能对此也有一些见识。
curious_cat

Answers:


1

这是一个变异k均值问题。中心的半径无关紧要,只要假定它们相等即可。

链接:

它将把圆心放在点出现概率最高的位置。

经典K均值过程:

  1. 将群集计数设置为5
  2. 将每个点随机分组
  3. 对于每个聚类,计算平均位置
  4. 对于每个点,计算到每个新平均位置的距离
  5. 将成员资格与最近的集群相关联
  6. 重复进行直到完成(重复,位置更改或其他错误指标)

选项:

  • 您可以在3之后使用一些松弛度较低的方法,在该方法中,您将平均位置缓慢地移向新位置。
  • 这是一个离散系统,因此无法完美收敛。有时确实如此,您可以在积分停止更改成员资格时结束,但是有时它们只是稍微摆动一下。
  • 如果您要编写自己的代码(大多数人都应该这样做),则可以使用上面的POR k均值作为起点,并根据圆圈所独有且完全包含的百分比来对EM进行一些更改。

为什么K-means攻击问题:

  • 这等效于在分量的协方差相等的情况下拟合高斯混合模型。混合成分的中心将位于期望最高的位置。恒定概率的曲线将是圆。这是EM算法,因此具有渐近收敛性。成员资格是硬的,而不是软的。
  • 我认为,如果等方差成分混合模型的基本假设是合理的“接近”,无论这意味着什么,那么该方法将是合适的。如果您只是随机分配点,则不太适合。

应该有一个类似于“零膨胀的泊松”的类似物,其中存在一个非高斯分量,它吸收了均匀分布。

如果您想“调整”模型并确信有足够的采样点,则可以使用k均值进行初始化,然后制作一个增强的k均值调节器,以将圆弧半径以外的点从竞争中删除。它会稍微扰动您拥有的圆,但是在提供数据的情况下,可能会稍微改善性能。


您能否更清楚地了解K均值如何解决此问题?
ub

谢谢你的建议。我仍然不清楚K-means方法是否可以解决问题?考虑以正常(0,1)生成的数据的三个群集的示例,其中中心偏移5个单位左右。K均值中心将给出最大密度。现在,切出一些带有“孔”的点,以便删除距离中心小于0.5的数据。K均值仍将显示大约相同的中心,但是如果您试图获得N = 3,R = 0.5的最大覆盖率,那显然不是正确的答案(因为甜甜圈孔中没有数据)。我误会了吗?
Colonel.triq

有时间的时候,我们会更多地调查您的问题,以获得更好的答案。我喜欢允许负重。有时可以处理数据甜甜圈以及径向有理多项式。
EngrStudent

0

有人可能有更好的形式化算法,但这是一种蛮力方法(黑客?)。我将使用六边形合并算法之一来计算2D直方图。就像hexbinR

我会使用大约限制半径为R的圆的六边形大小,然后在前N个bin上进行排序。如果您在N远处有明显的垃圾箱,那就太好了。现在,一种方法是从顶部密度六边形的中心以2 * R比例(沿x和y方向)局部绕圆移动。计算密度可以在本地大致优化位置。这将解释一个事实,即六边形不是相对于固定原点的移动窗口。

如果附近所有顶级垃圾箱都必须要有一些更聪明的方法来在附近移动圈子。

请注意,我可以想到一些极端的情况,这些情况下,这种幼稚的策略将严重失败。但是,这只是一个起点。

同时,我希望有人有更好的算法。


1
像这样的东西可能会解决这个问题,至少大约为一个循环。(这可以很容易地通过GIS使用焦点计数来完成。)但是,它不能解决多圆问题。
whuber

@whuber:求解一个圆,然后丢弃该圆内的所有点,然后重复原始算法,该怎么办?您能看到失败的情况吗?
curious_cat

是的,很容易。(您是一个“贪婪算法”。)考虑一维,点在。你的算法进入第一圈覆盖和第二覆盖:八个点全盘。一个更好的解决方案涵盖了用一个圆圈,与另一:9分。0 1 2 20 21 28 29 30 31 32 39 40 28 29 30 31 32 0 1 2 20 21 28 29 30 30 31 32 R=10,N=20,1,2,20,21,28,29,30,31,32,39,4028,29,30,31,320,1,220,21,28,29,3030,31,32,39,40
ub

@whuber:是的。你是对的。尽管在某些情况下(取决于许多情况),取决于输入点的结构,贪婪和非贪婪的解决方案可能是相同的还是接近的?我不知道。
curious_cat

@whuber:问题似乎主要来自边界。如果(有点像我在答复中提到的)一个移动的窗口+R-R,然后把其中的一个栈和选择上的所有可行的解决方案。例如,在您的1D例子在击中28,29,30,31,32它会直到窗口滑动18-28,并38-48寻求所有feasable解决方案。然后,可以在其中寻找最大点屈服组合。不确定是否有帮助?我正在尝试查看是否可以挽救我的天真的算法?:)
curious_cat
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.