2014-10-16 382 views
4

我正试图计算10维空间中9个点的凸包。通过scipy界面,我打电话scipy.spatial.ConvexHull(points)并得到QH6214 qhull input error: not enough points(9) to construct initial simplex (need 12)为什么在计算几个凸包的时候会出现Qhull错误?

我认为无论维度如何,凸包的定义是明确的。这里发生了什么?有没有不同的功能可以解决这个问题?

+1

“n”维空间中的非退化凸包由至少n + 1个点定义,例如,一维空间中的一段,二维空间中的三角形或三维空间中的四面体。 10维空间中的9个点定义了一个8维子空间。如果你将它指向它,那么在计算这个新的8维子空间中9个点的凸包时应该没有问题。然后,您可以将生成的凸包转换回10维空间。 – Jaime 2014-10-16 16:13:31

+0

或者,如果您对知道退化凸包的顶点感到高兴:如果少于'ndim + 1'点,它们全都在凸包中。 – 2014-10-16 16:15:31

+0

@pv。假设我在R^100工作,我有3分,全部共线。在这种情况下,我的凸包只应由两个极值点指定,而不是全部3个。 – Mark 2014-10-16 18:29:47

回答

2

也许在计算壳体之前投影超平面上的点将会起作用。

使用例如scikit-learn工具包中的主成分分析类sklearn.decomposition.PCA来减小尺寸。

vertices = np.random.randn(9, 10) 
from sklearn.decomposition import PCA 
model = PCA(n_components=8).fit(vertices) 

您可以从您的顶点使用model.transformmodel.inverse_transform现在来回变换的投射。

proj_vertices = model.transform(vertices) 
hull_kinda = ConvexHull(proj_vertices) 
hull_kinda.simplices 

这个输出是这样的

array([[6, 4, 3, 8, 0, 7, 5, 1], 
     [2, 4, 3, 8, 0, 7, 5, 1], 
     [2, 6, 3, 8, 0, 7, 5, 1], 
     [2, 6, 4, 8, 0, 7, 5, 1], 
     [2, 6, 4, 3, 0, 7, 5, 1], 
     [2, 6, 4, 3, 8, 7, 5, 1], 
     [2, 6, 4, 3, 8, 0, 5, 1], 
     [2, 6, 4, 3, 8, 0, 7, 1], 
     [2, 6, 4, 3, 8, 0, 7, 5]], dtype=int32) 

现在使用model.inverse_transform获得单纯回到你的10个维度。

相关问题