2011-02-04 3 views
41

점 P가 점 집합 X로 형성된 볼록 선의 내부에 있는지 테스트하는 가장 간단한 방법은 무엇입니까?선체 자체를 계산하지 않고 점 집합에 대한 convex hull 내부에 점이 있는지 확인합니다.

저는 볼록 선체 자체를 명시 적으로 계산하지 않는 고차원 공간 (예 : 최대 40 차원)에서 작동하는 알고리즘을 원합니다. 어떤 아이디어?

+1

특별한 이유가 있습니까? 볼록 선체를 계산하는 것은 비용이 많이 들지 않으며 (O (n) n) 문제를 크게 단순화합니다. – templatetypedef

+4

@templatetypedef : convex hull을 계산하는 것은 2 차원에서 그리 값이 비싸지 않습니다. 그러나 치수의 수를 늘리면 지수가 더 비쌉니다. 당신은 40 차원 문제에 대해 그것을하고 싶지 않습니다. – btilly

+1

아마도이 질문은 [mathoverflow] (http://mathoverflow.com)에 더 적합할까요? – wich

답변

9

다차원 공간에서 상당히 번거로운 것처럼 볼록 선체 자체를 계산할 필요가 없습니다. sum(ki*vi) 여기서 0 <= ki <= 1sum(ki) = 1로 제시 할 수있다 점 [v1, v2, .., vn]의 볼록 선체 내부

모든 벡터 (점) v하십시오 well-known property of convex hulls이있다. 대응하여, 볼록 선체 밖의 어떤 점도 그러한 표현을 가질 수 없습니다.

m 차원 공간에서 n 알 수없는 m 선형 방정식 집합을 제공합니다.

편집
나는 일반적인 경우에서이 새로운 문제의 복잡성에 대해 잘 모르겠지만, m = 2 것이 선형 보인다. 아마,이 분야에서 더 많은 경험을 가진 누군가 나를 교정 할 것입니다.

+4

사실 m 차원 공간에서 당신은 단지 때문에 Carathéodory의 정리의 m + 1 포인트가 필요합니다. – lhf

+1

@lhf 답변의 정확성에는 영향을 미치지 않지만 좋은 메모입니다. (또한 방정식을 푸는 데 적용하는 방법이 명확하지 않습니다.) –

+3

문제는 선형 대수가 방정식에 대한 n-m 차원 공간 솔루션을 쉽게 제공하지만 불평등을 만족시킬 수있는 쉬운 방법을 제공하지 않는다는 것입니다. 따라서 인용 한 정리는 한 점이 m + 1 점의 볼록 선상에 있음을 보여주는 좋은 방법이지만 더 큰 점 집합에 대해서는 상기 정리를 사용하기 위해 올바른 m + 1 점 집합을 찾아야합니다 . n은 시도 할 m + 1 세트를 선택합니다. 40 차원에서 문제가 될 것입니다. – btilly

1

일반적으로 작동 할만하지만 보장 할 수없는 경험적 답변을 기꺼이 받아 들일 의향이 있습니까? 그렇다면이 임의의 아이디어를 시도해 볼 수 있습니다.

X의 모든 요소에 대한 거리의 3 분의 합을 빼고 X에있는 요소의 수를 P 배에 곱한 거리의 입방체를 f (x)라고하고, 임의의 어딘가에서 시작하여 언덕을 사용하십시오 P에서 멀리 떨어져있는 구에서 x에 대해 f (x)를 최대화하기위한 등산 알고리즘. 퇴보 한 경우를 제외하고 P가 볼록 선체에없는 경우 P는 초평면에 대한 법선을 찾을 확률이 매우 높아야합니다. 한 쪽은 X, 다른 쪽은 X에있는 모든 것입니다.

19

점은 그 점에서 다른 점까지의 모든 벡터의 방향이 그 주위의 원/구/초 피쉬의 절반보다 작은 경우에만 다른 점의 볼록 선보다 바깥에 있습니다.

+1

!+1 –

+0

둘째로,이 속성은 'm'차원을 확인하는 것이 까다로울 것입니다. 'm' 선형 방정식을 푸는 것보다 쉽지 않습니다. –

+0

이것은 실제로 아주 좋은 알고리즘입니다. "hypersphere의 1/2보다 작음"을 확인하려면 두 방향 사이의 내적을 확인하고 2가 음수인지 (즉 반대 방향인지) 확인하십시오. 또는 내가 놓친 적이 있습니까? –

21

문제는 선형 프로그램의 실현 가능한 점을 찾아 냄으로써 해결할 수 있습니다. 기존의 솔버에 LP를 연결하는 것과는 대조적으로 자세한 내용에 관심이 있다면 Boyd and Vandenberghe's excellent book on convex optimization에서 11.4 장을 읽는 것이 좋습니다.

  1. x^T는 전치이며

    세트 A = (X[1] X[2] ... X[n]) 즉, 첫 번째 열 v1이고, 상기 제 v2 등 다음 LP 문제를 해결

    ,

    minimize (over x): 1 
    s.t.  Ax = P 
         x^T * [1] = 1 
         x[i] >= 0 \forall i 
    

    x

  2. [1]은 모두 1 벡터입니다.

문제는 점이 볼록한 선체에있는 경우 해결 방법이 있습니다.

+0

이것에 대한 구현이 있는가? 이 코드를 작성하는 데 매우 힘든 시간을 보내고 있습니다. –

+0

어떤 LP 해석을 사용합니까? http://lpsolve.sourceforge.net/5.5/는 오픈 소스 LP 솔버로서 사용하기가 간단합니다. 편집 : 당신이 전체를 찾고있어 깨닫지 못했다; 불행히도 그러한 패키지에 대해서는 잘 알지 못합니다. – user1071136

+0

저는 현재 브라우저에서 이것을 프로그래밍하고 있으므로 현재 http://numericjs.com/documentation.html을 사용하고 있습니다 - 저는 불평등에 대한 변형을하는 데 어려움을 겪고 있습니다. 여기에 예제가 있습니다. http://www.joyofdata.de/blog/testing-linear-separability-linear-programming-r-glpk/하지만 R에 익숙하지 않아 문제가 계속 발생합니다! –

2

16 개의 치수에서 동일한 문제가있었습니다.너무 많은 얼굴을 생성해야했기 때문에 qhull도 제대로 작동하지 않았기 때문에 필자는 새로운 초 점과 참조 데이터 사이에 분리 초평면을 찾을 수 있는지 테스트하여 직접 접근 방식을 개발했습니다 (이를 "HyperHull"이라고 함)) .

초평면 차 볼록 프로그래밍 문제로 변환 될 수있는 분리하는를 찾는 문제는 (참조 : SVM). 나는 파이썬에서 cvxopt를 사용하여 170 줄 이하의 코드 (I/O 포함)를 사용했다. 이 알고리즘은 문제가 존재하더라도 모든 차원에서 수정없이 작동하며, 선체의 점 수를 높이는 차원이 높습니다 (참조 : On the convex hull of random points in a polytope 참조). 선체가 명시 적으로 구성되지는 않았으므로 점만 내부에 있는지 여부에 관계없이 알고리즘은 예를 들어 점에 비해 매우 큰 차원에서 매우 큰 장점이 있습니다. 빠른 선체.

이 알고리즘은 "천연"및 병렬 프로세서의 수와 같아야 가속화 될 수있다. 원래 포스트는 3 년 전 이었지만

+1

구현 또는 일부를 github에 올려 놓을 수 있다면 많은 사람들이 높이 평가할 수 있습니다. 나는 믿는다 (http://www.mathworks.com/matlabcentral/answers/77363-very-high-dimensional-convex-hulls). 아마도 당신에게는 매우 간단 해 보입니다. – j13r

2

, 어쩌면이 대답은 여전히 ​​도움이 될 것입니다. Gilbert-Johnson-Keerthi (GJK) 알고리즘은 두 볼록 다각형 사이의 최단 거리를 찾는데, 각각은 생성기 집합의 볼록한 선체로 정의됩니다. 특히 볼록 선체 자체는 계산할 필요가 없습니다. 특수한 경우에 대해 질문하는 경우가 있는데, 폴리토프 중 하나는 하나의 요점에 불과합니다. 왜 GJK 알고리즘을 사용하여 P와 점 X의 볼록 선체 사이의 거리를 계산해 볼까요? 그 거리가 0이면 P는 X 내부 (또는 적어도 경계에 있음)입니다. 지원 코드와 함께 ClosestPointInConvexPolytopeGJK.m이라는 Octave/Matlab의 GJK 구현은 http://www.99main.com/~centore/MunsellAndKubelkaMunkToolbox/MunsellAndKubelkaMunkToolbox.html에서 사용할 수 있습니다. GJK 알고리즘에 대한 간단한 설명은 Sect. 2, 논문 번호 : http://www.99main.com/~centore/ColourSciencePapers/GJKinConstrainedLeastSquares.pdf. 저는 31 차원 공간에서 매우 작은 세트 X에 대해 GJK 알고리즘을 사용했으며 좋은 결과를 얻었습니다. GJK의 성능이 다른 사람들이 추천하는 선형 프로그래밍 방법과 비교하면 (어떤 비교가 흥미로울지라도) 불확실하다. GJK 방법은 볼록 선체를 계산하거나 선형 불평등의 관점에서 선체를 표현하는 것을 피하는데, 둘 다 시간 소모적 일 수 있습니다. 희망이 답변은 도움이됩니다.

관련 문제