Casco convexo em dimensões mais altas, encontrando os vértices de um politopo

Suponha que eu tenha uma nuvem de pontos dada no espaço tridimensional, que eu possa tornar tão densa quanto necessário. Esses pontos acabam se encontrando na superfície de um pólipo de menor dimensão (ou seja, os vetores de pontos (x1, x2, ... x6) parecem ser coplanares).

Gostaria de encontrar os vértices desse polítopo desconhecido e minha tentativa atual faz uso do algoritmo qhull, através da interface scipy em Python. No começo, eu só recebia mensagens de erro, aparentemente causadas pela entrada dimensional mais baixa e / ou pelos muitos pontos degenerados. Eu tentei alguns métodos de força bruta para eliminar os pontos degenerados, mas não muito bem-sucedidos e, portanto, no final, suponho que todos esses pontos estejam no casco convexo.

Essa questão tem sido muito útil, pois sugere uma redução de dimensão via Análise de Componentes Principais. Se eu projetar os pontos em um hiperplano 4D, o algoritmo qhull será executado sem erros (para qualquer dimensão superior, ele não será executado).

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")

A resposta na pergunta acima menciona que os simples precisam ser transformados de volta depois que alguém calcula o casco convexo dos pontos projetados. Mas a saída qhull consiste apenas nos índices, e por que eles não coincidiriam com os índices dos pontos iniciais?

Agora, meu problema é que não sei qual precisão usar para realmente obter os vértices adequados. Independentemente da densidade da nuvem de pontos, os vértices obtidos diferem com diferentes precisões. Por exemplo, para pontos iniciais em uma matriz (10000, 6), recebo (onde E0.03 é o máximo para o qual isso funciona):

hull1 = ConvexHull(proj_points, qhull_options = "Qx, E0.03")
print len(hull1.vertices)
print hull1.vertices

5
[ 437 2116 3978 7519 9381]

E plotando-o em alguma projeção (não muito informativa) dos eixos 0,1,2 (onde os pontos azuis representam uma seleção da nuvem de pontos inicial):

 Mas, para uma precisão mais alta (é claro), recebo um conjunto diferente:

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]

Mesma projeção (ângulo ligeiramente diferente):

Eu suspeitaria que a primeira imagem não tenha vértices suficientes e que a segunda talvez tenha muitos. Embora, é claro, não consiga extrair informações rigorosas dessas tramas. Mas existe uma boa maneira de descobrir qual precisão usar? Ou talvez uma abordagem completamente diferente para esse problema (eu já tentei alguns)?

questionAnswers(1)

yourAnswerToTheQuestion