【问题标题】:Algorithm for selecting outer points on a graph ("rich" convex hull)在图上选择外部点的算法(“丰富”凸包)
【发布时间】:2013-11-21 16:38:55
【问题描述】:

我正在寻找一种有效的方法来选择离中心最远的大部分点(2D 欧几里得图)。这类似于凸包,但会包括(许多)更多点。进一步的标准:

  • 选择/集合(“K”)中的点数必须在指定范围内。它很可能不会很窄,但它最适用于不同的范围(例如 0.01*N

  • 算法必须能够平衡距中心的距离和“局部密度”。如果图形范围的上部附近有密集区域,而下部附近有稀疏区域,那么算法必须确保从下部选择一些点,即使它们比上部的点更靠近中心地区。 (见下例)

  • 奖励:考虑到特定点(或点和中心)的距离,而不是与中心的简单距离,将是完美的。

到目前为止,我的尝试主要集中在使用“鸽巢”(将图形划分为 CxR 框,根据坐标将点分配给框)并选择“外部”框,直到我们在集合中有足够的点。但是,我没有成功平衡选择(由于固定框大小而过度选择的密集区域),也没有成功使用选定点作为参考而不是(仅)中心。

我(糟糕地)画了一个Example:红点是点,绿色形状是我想要的一个例子(在绿色之外=选中)。对于稀疏区域,边界形状更靠近中心以找到合适的点(但不一定找到任何点,如果它们离中心太近)。黄色框是我的基于鸽子洞的算法的一个示例。即使在尝试针对稀疏区域进行调整时,它也不能很好地管理。

欢迎提出任何想法!

【问题讨论】:

    标签: graph-algorithm convex-hull


    【解决方案1】:

    我认为没有任何标准算法可以满足您的需求。你将不得不发挥创造力。假设您的点嵌入在 2D 欧几里得空间中,这里有一些想法:

    1. 迭代计算多个凸包。例如,计算凸包,保留作为凸包一部分的点,然后计算另一个凸包,忽略原始凸包中的点。继续这样做,直到你有足够数量的点,基本上每次迭代都在周长上拔掉点。这种方法的唯一问题是它不适用于数据集中的凹面(例如,您发布的样本底部的凹面)。

    2. 为您的数据拟合 Gaussian 并保持所有内容 > N 标准 偏离平均值(其中 N 是您必须 选择)。如果您的数据是高斯数据,这应该可以很好地工作。如果 不是,你总是可以用几个高斯模型(而不是 一),并保持联合概率小于某个阈值的点。使用多个高斯可能会很好地处理凹面。
      参考文献
      http://en.wikipedia.org/wiki/Gaussian_function
      How to fit a gaussian to data in matlab/octave?\

    3. 使用 核密度估计 - 如果您创建核密度 表面,您可以在某个高度切片表面(例如,转动 它变成一个高原),给你一个周边的形状(形状 高原)周围的点。诀窍是把它切成薄片 正确的位置,因为你最终可能没有得分 在形状之外,但通过正确的选择,您可以轻松地 得到你画的绿色形状。如果您明智地选择切片点(这可能很难做到),这种方法会很好地工作并在您的示例中为您提供绿色形状。这种方法的最大缺点是计算量非常大。更多信息: http://en.wikipedia.org/wiki/Multivariate_kernel_density_estimation

    4. 使用 alpha 形状 来获得紧紧包裹的一般形状 点集的外周长。然后侵蚀形状a 很少强迫形状之外的一些点。我对 alpha 形状没有太多经验,但这种方法在计算上也会非常昂贵。更多信息: http://doc.cgal.org/latest/Alpha_shapes_2/index.html

    【讨论】:

    • 这两者在计算方面看起来都相当昂贵。知道这两种方法的复杂性吗?
    • 是的,你是对的 - KDE 和 alpha 形状方法在计算上都非常昂贵。我添加了一些额外的想法。
    • 谢谢;非常有趣的想法。我会好好看看每一个,看看我能不能想出一种启发式的方式来发挥他们的长处。
    • 你找到了一个很好的方法吗?
    猜你喜欢
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    • 2015-05-24
    相关资源
    最近更新 更多