优化凸壳的搜索

时间:2017-01-19 15:46:06

标签: python optimization convex-hull

我有一个大型矩阵或2D数组,M个浮点数。现在,我的矩阵有10,000行和31列。该矩阵中的每一行代表一个向量。我想要计算行集的convex hull

由于这个矩阵非常大,我正在寻找一种快速的方法。我当前的方法uses this package可以和O(n²)一样慢,其中n是向量的数量。我的目标是将此算法扩展到更大的矩阵。

是否有比O(n²)速度快的方法?

我更喜欢使用Python,但我不是在寻找代码。我正在寻找一种可以自己编码的通用算法。

3 个答案:

答案 0 :(得分:0)

对于固定维度d,Chazelle [1]在1993年提供了一个最优算法,在最坏的情况下需要O(n^[d/2]),其中n是点数和[d/2]表示整数除以2. scipy.spatial包使用QHull,对于2D和3D点,它可能与O(n^2)一样慢。 <{1}}绑定不适用于任意维度。

在任意维度上计算凸包的大多数实用算法都实现了随机增量构造,我相信这也是QHull所做的。计算高维凸壳通常被认为是一个难题。查看此常见问题解答[2]。

答案 1 :(得分:-1)

在一般情况下(任意维数),凸壳复杂度在ω(n·log n)处是低限的,因为它可以简化为排序算法。

但是,你正在二维中进行一种称为“平面凸包”的特殊情况。因此,您可以使用Chan's algorithm来改善ω(n·log h)的界限,其中n是总点数,h是凸包中的点数(出于显而易见的原因,这种解决方案被称为“敏感输出算法”)。

最后,请注意:您的算法以及many other alternatives具有平均复杂度ω(n·log n),尽管在最坏的情况下会增长到ω(n^2)。因此,说它具有二次复杂性是错误的,因为最坏的情况往往非常罕见。

答案 2 :(得分:-1)

我在C#中用O(n log h)编写了一个算法,而不是调用Ouellet Convex Hull。所有代码都在链接中提供,等等。

今天我最终确定了“在线”版本,这个版本可以让你在当时一点喂它并保持每点O(log h)。在一般情况下,它比Chan快至少2倍。

文章没有谈到“在线”部分(明天我会开始写一些东西)。但是代码可以在项目中的GitHub访问:OuelletConvexHullAvl2Online。

用法:

a = tf.layers.conv2d(input, 3, 3, padding='same', name='a')
b = tf.layers.conv2d(a, 1, 3, padding='same', name='b')
loss = tf.reduce_mean(tf.pow(b-1,2))
optimizer = tf.train.GradientDescentOptimizer()
train_op = optimizer.minimize(loss,var_list=???)