估计任意分布数据的边界

时间:2010-05-18 10:07:30

标签: python spatial sampling

我有二维离散空间数据。我想对这些数据的空间边界进行近似,以便我可以在其上生成另一个数据集。

理想情况下,这将是一组有序的(x,y)点,matplotlib可以使用plt.Polygon()补丁进行绘制。

我最初的尝试非常不优雅:我在数据上放置一个精细的网格,并且在单元格中找到数据的地方,就会创建一个方格的matplotlib补丁。因此,边界的分辨率取决于网格的采样频率。这是一个例子,灰色区域是包含数据的单元格,黑色表示没有数据。

1st attempt http://astro.dur.ac.uk/~dmurphy/data_limits.png

好的,问题解决了 - 为什么我还在这里?嗯....我想要一个更“优雅”的解决方案,或者至少一个更快的解决方案(即我不想继续“真正的”工作,我想要有一些乐趣!)。我能想到的最佳方式是射线追踪方法 - 例如:

  1. 从xmin到xmax,在y = ymin,检查数据边界是否以间隔dx
  2. 交叉
  3. y = ymin + dy,do 1
  4. 做1-2,但现在在y
  5. 中进行采样

    另一种方法是定义一个中心,并在r-theta空间中进行采样 - 即以dtheta为增量的径向辐条。

    两者都会产生一组(x,y)点,但是如何命令/链接相邻点来创建边界?

    最近邻法是不合适的,例如(借用地理学),地峡(想想连接N& S America的巴拿马)可能会关闭并隔离地区。这也可能不太适合数据中看到的漏洞,我想将它们表示为不同的plt.Polygon。

    解决方案可能来自解决区域最大化问题。对于定义数据限制的一组点,这些点中包含的最大连续区域是多少要形成封闭区域,第n个点的相邻点是多少?如何在这个方案中处理漏洞 - 这现在是错误的拓扑吗?

    道歉,很多是我在大声思考。我会对一些提示,建议或解决方案表示感谢。我怀疑这是许多解决方案技术经常被研究的问题,但我正在寻找一些简单的代码和快速运行的东西...我想每个人都是,真的!

    ~~~~~~~~~~~~~~~~~~~~~~~~~

    好的,这是使用Mark关于凸壳的想法的尝试#2: alt text http://astro.dur.ac.uk/~dmurphy/data_limitsv2.png

    为此,我使用qhull包中的qconvex,让它返回极端顶点。对于那些感兴趣的人:

    cat [data] | qconvex Fx>出

    周边的采样似乎很低,尽管我没有在设置上玩得太多,但我不相信我可以提高保真度。

2 个答案:

答案 0 :(得分:2)

我认为你所寻找的是the Convex Hull of the data这将给出一组点,如果连接将意味着你的所有点都在连接点上或内部

答案 1 :(得分:0)

我可能会混淆一些东西,但是没有确定最大和最小x和y水平的动机是什么?除非您拥有大量数据,否则您可以简单地迭代您的点,从而快速确定最低和最高水平。

这不是最有效的示例,但如果您的数据集很小,这将不会特别慢:

import random
data = [(random.randint(-100, 100), random.randint(-100, 100)) for i in range(1000)]

x_min = min([point[0] for point in data])
x_max = max([point[0] for point in data])

y_min = min([point[1] for point in data])
y_max = max([point[1] for point in data])