データセットをフィルタリングして、ニューラルネットワークトレーニングのより均一な分布を取得する


8

スティッフODEの完全なシステムを解くのではなく、人工ニューラルネットワーク(ANN)を使用して流体の反応率を予測することを検討しています。私の研究室の何人かの人はすでにそれにいくつかの仕事をしていたので、私はゼロから始めませんが、私のアプリケーションに問題があります。そのうちの1つは、トレーニング用のデータセットの品質に関連していると思います。通常、1D / 2D / 3DのCFDシミュレーションからトレーニングデータを抽出します。とにかく、ニューラルネットワークに送るデータの多次元配列ができあがります。問題の大きさを理解するために、8つのネットをそれぞれ10の入力と1つの出力でトレーニングすることを検討しています。約100,000ポイントのトレーニングセットは妥当だと思いますが、問題は、これらの100,000ポイントが私の多次元空間の特定の領域をカバーする必要があることです。

  • スナップショットごとに、トレーニングが正確であることを確認するために高いサンプリングが必要な領域には、ポイントのごく一部しかありません
  • スナップショットをまとめてコンパイルすると、多くのほぼ重複するポイントができます。これは、a)これらの領域に重点を置いてトレーニングにバイアスをかけることにより、b)不要なポイントを追加することにより、ANNトレーニングに悪影響を及ぼします。

そのため、トレーニングセットに含める前に、記録したポイントをフィルタリングしようとしています。私が見ると、新しいポイントがデータセットのすべてのポイントの特定のn次元の半径内にあるかどうかを確認する必要があります。このブルートフォースアプローチは、n ^ 2のようないくつかのトリックスケールを除外し、100,000から10,000ポイントを抽出するのにまあまあ機能します(30分かかります)が、スナップショットのサイズと数を増やすとうまくいきません...明らかに、これを行うためのより賢い方法があるはずですが、私はどちらの方向から探し始めるのかわかりません。私は最初にpythonを試してみましたが、FORTRANに移動してスピードを上げることができましたが、まずはより良い戦略を探すべきだと思います。私の唯一の希望はある種のkdツリーですか?私はそれらについてほとんどまたはまったく経験がなく、私が見る問題は、データセットを構築するとツリーが成長することであり、これは複雑さを増すだけです。Python kdツリーライブラリは私のニーズに合っていますか?問題の規模を考えると、FORTRANに移行する必要がありますか?何かアドバイスをいただければ幸いです、ありがとう!

回答:


5

rcrcO(n)rcd3d1rc

rcO(n)O(1)O(1)rc

ここでは、手順全体について説明します。詳細が必要な場合は、「セルのリンクリスト」または「セルリスト」を検索してみてください。

O(log2n)n


よろしくお願いします。私の立体感が邪魔になるのではないかと思います。d = 10を考慮し、「サイド」ごとに約100ポイント(これが数値として小さすぎないかどうかはわかりません)を考えると、10 ^ 20セルのグリッドはありませんか?「サイド」ごとに10ポイントであっても、それはまだ10 ^ 10セルであり、各セルに59000のネイバーがあります:)しかし、私はあなたのリンクを調べます。ありがとうございました !
FrenchKheldar

実際には、セルの数は、カットオフ距離に対するポイント密度に依存します。ポイントよりも多くのセルで終わることはありません!隣人の数は高次元では問題ですが、それから私はkdツリーに移動します。
Pedro

申し訳ありませんが、近隣の59000セルを意味します。文書化されたkdtree最近傍検索アルゴリズムcs.umd.edu/~mount/ANNを見つけました。試してみます。
FrenchKheldar

3

あなたが述べた問題は、計算幾何学の古典的な問題です:範囲クエリ。あれは:

入力:n次元ユークリッド空間のサブセットS、およびその空間P内の点のセット。
出力:Sと交差するPのサブセット。

O(n11/d+r)O(n)O(n11d+r)O(n)

アルゴリズムには、分割統治戦略(再帰)と特別なデータ構造(kdツリー)が含まれます。アルゴリズムの概要は次のとおりです。

Begin MainProgram

    results = a new SET   (a kd-tree)
    search(space,root,results)
    return results
endMainProgram

Subroutine search(space,node,results)
    if (space contains node.region) then
        add node.point to the results
        for each descendant of node
            add d.point to results
        return
    if (space contains node.point) then 
        add node.point to results
    if (space extends below node.coordinate) then
        search(space,node.below,results)
    if (space extends above node.coordinate) then
        search(space,node.above,results)
endsubroutine

-source:Nutshellのアルゴリズム、298ページ

長方形の場合の鍵は、サブセット全体を一度に含めることができるように、データ構造を簡単に定義できることです。したがって、KDツリーです。KDツリーは、3次元空間を平面で分割できるのとほぼ同じように、超平面で連続的に切り取ることによってn次元空間を単純に分割します。

半径方向の範囲クエリ(長方形のボックスではない)に関する特定の問題については、同様のn球ベースの再帰的空間分割を見つけることができる場合があります... 設計されているvpツリーと呼ばれる同様のデータ構造があります。超球座標での空間分割の実装。あなたは見たいかもしれません

"> vpツリーの理論の詳細については、この出版物。

もちろん、実際にアルゴリズムを科学を行うためのツールとして使用することが目標である場合、コーディングは面倒な場合があります。その場合、使用できるこれらのデータ構造をすでに実装しているライブラリを調べることをお勧めします。このような状況では、計算ジオメトリライブラリが非常に役立ちます。CGALのライブラリはあなたに興味があるかもしれd次元範囲検索のためのサブルーチンを持っています。 以下は、範囲クエリサブルーチンを含むライブラリの別のリストです。

または、検索する球面範囲内のほとんどすべてのポイントを取得することに問題がない場合(すべてではない)、このペーパーのような近似アルゴリズムの使用を検討することをお勧めします。


pnylab.com/pny/papers/vptree/vptreeリンクが壊れています。
gansub

@gansub:修正されました!
ポール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.