我有一个大型矩阵或2D数组,M
个浮点数。现在,我的矩阵有10,000行和31列。该矩阵中的每一行代表一个向量。我想要计算行集的convex hull。
由于这个矩阵非常大,我正在寻找一种快速的方法。我当前的方法uses this package可以和O(n²)一样慢,其中n是向量的数量。我的目标是将此算法扩展到更大的矩阵。
是否有比O(n²)速度快的方法?
我更喜欢使用Python,但我不是在寻找代码。我正在寻找一种可以自己编码的通用算法。
答案 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=???)