假设我有一个在 6 维空间中给出的点云,我可以根据需要使其尽可能密集。这些点最终位于低维多面体的表面上(即点向量 (x1, x2, ... x6) 似乎是共面的)。
我想找到这个未知多面体的顶点,我目前的尝试通过 Python 中的 scipy 接口使用 qhull 算法。一开始我只会收到错误消息,显然是由低维输入和/或许多退化点引起的。我尝试了几种蛮力方法来消除退化点,但不是很成功,所以最后,我认为所有这些点都必须位于凸包上。
这个问题非常有帮助,因为它建议通过主成分分析进行降维。如果我将点投影到 4D 超平面,qhull 算法运行没有错误(对于任何更高的维度它都不会运行)。
from scipy.spatial import ConvexHull
from sklearn.decomposition import PCA
model = PCA(n_components=4).fit(initial_points)
proj_points = model.transform(initial_points)
hull = ConvexHull(proj_points, qhull_options = "Qx")
上述问题的答案提到,在计算投影点的凸包后,需要将单纯形转换回来。但是 qhull 输出仅包含索引,为什么这些与初始点的索引不匹配?
现在我的问题是我不知道使用哪种精度来实际获得正确的顶点。无论我制作的点云有多密集,获得的顶点都以不同的精度不同。例如,对于 (10000, 6) 数组中的初始点,我得到(其中 E0.03 是它的最大值):
hull1 = ConvexHull(proj_points, qhull_options = "Qx, E0.03")
print len(hull1.vertices)
print hull1.vertices
5
[ 437 2116 3978 7519 9381]
并将其绘制在轴 0、1、2 的一些(不是非常丰富的)投影中(其中蓝色点代表初始点云的选择):
但是为了获得更高的精度(当然),我得到了不同的集合:
hull2 = ConvexHull(proj_points, qhull_options = "Qx, E0.003")
print len(hull2.vertices)
print hull2.vertices
29
[ 74 75 436 437 756 1117 2116 2366 2618 2937 3297 3615 3616 3978 3979
4340 4561 4657 4659 4924 5338 5797 6336 7519 7882 8200 9381 9427 9470]
相同的投影(只是角度略有不同):
我怀疑第一张图片没有足够的顶点,而第二张图片可能有太多。虽然我当然无法从这些图中提取严格的信息。但是有没有一种很好的方法来找出使用哪种精度?或者也许是一个完全不同的方法来解决这个问题(我已经尝试了一些)?