点Pが点集合Xで形成された凸包の中にあるかどうかを調べる最も簡単な方法は?船体自体を計算せずに点の集合の凸包の中に点があるかどうかを調べる
凸包自体を明示的に計算しない高次元の空間(例えば、最大40次元)で動作するアルゴリズムが必要です。何か案は?
点Pが点集合Xで形成された凸包の中にあるかどうかを調べる最も簡単な方法は?船体自体を計算せずに点の集合の凸包の中に点があるかどうかを調べる
凸包自体を明示的に計算しない高次元の空間(例えば、最大40次元)で動作するアルゴリズムが必要です。何か案は?
多次元空間では非常に面倒なので、凸包自体を計算する必要はありません。 well-known property of convex hullsがあります:
ポイント[v1, v2, .., vn]
の凸包内部v
はsum(ki*vi)
、0 <= ki <= 1
とsum(ki) = 1
として提示することができる任意のベクター(ポイント)。これに対応して、凸包の外側にはそのような表現はありません。
m次元空間では、n
未知数のm
の線形方程式の集合が得られます。
編集
は、私は一般的なケースでは、この新しい問題の複雑さについてはよく分からないんだけど、m = 2
のために、それは線形ようです。おそらく、この分野でより多くの経験を積んだ誰かが私を修正するでしょう。
実際にm次元の空間では、Carathéodoryの定理のためにm + 1点しか必要ありません:http://en.wikipedia.org/wiki/Carathéodory's_theorem_(convex_hull)難易度は、m + 1点が働くfindindです。 – lhf
@lhf答えの正しさには影響しませんが、それは良いメモです(そして、それらの方程式を解くためにそれをどのように適用するかは明確ではありません)。 –
問題は、線形代数はあなたの方程式にn-m次元の解空間を簡単に与えますが、不等式も満たす簡単な方法を提供しません。したがって、あなたが引用した定理は、点がm + 1点の凸包内にあることを示す良い方法ですが、より大きな点集合については、上記定理を利用するにはm + 1点の正しい集合を見つける必要があります。 nには、m + 1個のそのようなセットを試してみることができます。 40次元では問題になります。 – btilly
通常は動作するはずですが保証されていないヒューリスティックな回答を受け入れますか?あなたがしている場合は、このランダムなアイデアを試すことができます。
X内のすべての点までの距離の立方体の合計を差し引いて、Xの物の数をP倍した距離の立方体をf(x)とし、丘を使用しますPから非常に遠い球内のxについてf(x)を最大にするようなクライミングアルゴリズムである。縮退の場合を除いて、Pが凸包にない場合、これは超平面の法線を見つける可能性が非常に高いはずである。の片側にあり、Xのすべてが反対側にあります。
ポイントは、それから他のポイントまでのすべてのベクトルの方向がその周りの円/球/超球の半分未満である場合に限り、他のポイントの凸包の外側にあります。
これは素敵な 'O(m * n^2)'解のようです!+1 –
2番目のところでは、このプロパティは 'm'ディメンションをチェックするのが難しいでしょう。 'm'線方程式を解くよりも簡単ではありません。 –
これは実際には非常に良いアルゴリズムです。 「超球の1/2未満」をチェックするには、2つの方向の間のドット積をチェックし、2つが負である(つまり反対方向にある)かどうかを確認します。 または私は何かが恋しくなったのですか? –
問題は、リニアプログラムの実行可能ポイントを見つけることで解決できます。既存のソルバーにLPを接続するのではなく、詳細を知りたい場合は、Boyd and Vandenberghe's excellent book on convex optimizationの第11.4章を読むことをお勧めします。
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
[1]
はall-1ベクトルです。問題は、ポイントが凸包にある場合、解決策があります。
これについての実装はありますか?私はコードでこれを構築するのに非常に苦労しています。 –
どのLPソルバーを使用しますか? http://lpsolve.sourceforge.net/5.5/は、オープンソースのLPソルバーで、使いやすいです。編集:あなたはシバン全体を探していることを認識していない。残念ながら私はそのようなパッケージを知らない。 – user1071136
私は実際にブラウザでこれをプログラミングしていますので、現在http://numericjs.com/documentation.htmlを使用しています - 私は不平等に変換するのに問題があります。 http://www.joyofdata.de/blog/testing-linear-separability-linear-programming-r-glpk/ここに例がありますが、私はまだRに慣れていないので、まだ問題があります! –
私は16次元で同じ問題がありました。あまりにも多くの顔を生成しなければならないのでqhullでも正しく動作しなかったので、新しいポイントと参照データの間に分離超平面があるかどうかをテストすることで独自のアプローチを開発しました(私はこれを "HyperHull" 。
分離超平面を見つける問題は、凸2次計画問題(SVM参照)に変換することができます。私はPythonで、コード行数が170以下でcvxoptを使用していました(I/Oを含む)。このアルゴリズムは、問題が存在していても、どの次元でも変更することなく、船体上の点数が多くなるほど次元が大きくなる(On the convex hull of random points in a polytope参照)。船体は明示的に構成されておらず、チェックされているだけなので、点が内部にあるかどうかにかかわらず、アルゴリズムは、例えば、迅速な船体。
このアルゴリズムは「自然に」並列化することができ、スピードアップはプロセッサの数に等しくなければなりません。
あなたの実装やその一部をgithubに置くことができれば、多くの人々が非常に高く評価します私は信じている(http://www.mathworks.com/matlabcentral/answers/77363-very-high-dimensional-convex-hulls)。多分あなたのために、それは非常に単純なようです。 – j13r
元の投稿は3年前ですが、おそらくこの回答はまだ役立つでしょう。 Gilbert-Johnson-Keerthi(GJK)アルゴリズムは、2つの凸多面体の最短距離を求めます。各凸多面体は、複数の生成器の凸包として定義されます。凸包自体は計算する必要はありません。特別なケースでは、質問されている場合は、ポリトープの1つだけのポイントです。なぜ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法は、凸包を計算すること、または線形不等式の観点から船体を表現することを避けており、どちらも時間がかかることがあります。この回答が役立つことを願っています。
これを行う特別な理由はありますか?凸包を計算することはあまりコストがかからず(O(n lg n))、問題を大幅に簡素化します。 – templatetypedef
@templatetypedef:凸包の計算は2次元ではあまりコストがかかりません。しかし、次元数を増やすほど指数関数的に高価になります。あなたは40次元の問題のためにそれをしたくありません。 – btilly
おそらくこの質問は[mathoverflow](http://mathoverflow.com)にもっと適しているでしょうか? – wich