1

問題の解決策の実装を開始する前に、「車輪の再発明」をしないかどうか、および誰かが以前に行った作業を再利用できるかどうかを確認したいだけです. だから私の問題は:

OpenCV ライブラリを使用して画像マッチャーを作成しました。このマッチャーは一連の画像ファイルを受け取り、データベースで類似の画像を見つけようとします。最後に、 ROC 曲線の定義 (真陽性、真陰性、偽陽性、偽陰性の一致数)に従って統計結果を返します。これらの結果は、約 10 である OpenCV のライブラリ アルゴリズム パラメーターの値によって異なる場合があります。これは、パラメーターの調整により、真陽性の一致が多くなり、偽陽性の一致が少なくなることを意味します。多かれ少なかれ10個のパラメーターを調整する必要があるため、ブルートフォースアジャスターは非常に遅くなります。ブルートフォースとは、次のことを意味します。

While(param1 < 50){
  While(param2 < 50){
    While(param3 < 50){
      …
      PerformMatching();
      param3 +=2;
    }
    param2++;
  }
  pram1 +=5;
}

私がやりたいことは、パラメーターをランダムに選択し、統計結果が改善されているかどうかを分析することです。次に、この分析は、より良いパラメーターを選択するためにパラメーターをランダムに生成する方法を変更するのに役立ちます。

だから私の質問は、Java にライブラリがあるかどうか、または真陽性と偽陽性の値の評価に基づいてより良いパラメーター セットを返す AI アルゴリズムがあるかどうかです。

助けていただければ幸いです、ありがとう。

4

2 に答える 2

4

山登り

いくつかの確率的最適化アルゴリズムを試すことができます。たとえば、山登り法では、ランダムな解(@Don Rebaが指摘したように)から始めて、コスト関数に対応する方が優れている一連の隣接する解を調べます。アイデアを説明するために、いくつかのサンプルPythonコードを使用します。

ネイバーソリューションを入手する

あなたの場合の隣人のために、あなたは次のような単純な関数を使うことができます:

n_params = 5  # number of parameters
upper_bound = 5  # upper limit of your parameters
lower_bound = 0  # lower limit of your parameters

def get_neighbors(solution):
    neighbors = []
    for i in range(n_params):
        x = copy.deepcopy(solution)
        if x[i] < upper_bound:
            x[i] += 1 # increment one of the components
            neighbors.append(x)
        x = copy.deepcopy(solution)
        if x[i] > lower_bound:
            x[i] -= 1 # decrement one of the components
            neighbors.append(x)
    return neighbors 

[1,3,4,2,2]の現在のソリューションがある場合、コンポーネントのいずれかをインクリメントまたはデクリメントすることにより、次のように10個の異なるネイバーを取得します。

 [2, 3, 4, 2, 2],
 [0, 3, 4, 2, 2],
 [1, 4, 4, 2, 2],
 [1, 2, 4, 2, 2],
 [1, 3, 5, 2, 2],
 [1, 3, 3, 2, 2],
 [1, 3, 4, 3, 2],
 [1, 3, 4, 1, 2],
 [1, 3, 4, 2, 3],
 [1, 3, 4, 2, 1]

ここでは、すべてのパラメーターが整数であると想定しています。ステップサイズを調整することで、より細かくすることができます(たとえば、0.05)。

山登り法の反復

def hill_climb():
    initial_solution = np.random.randint(lower_bound, upper_bound, n_params)
    current_solution = initial_solution
    print 'initial solution', initial_solution
    current_cost = get_cost(initial_solution)
    step = 1
    while True:
        #try to replace each single component w/ its neighbors
        lowest_cost = current_cost
        lowest_solution = current_solution
        print 'hill-climbing cost at step %6d: %d' % (step, lowest_cost)
        neighbors = get_neighbors(current_solution)
        for new_solution in neighbors:
            neighbor_cost = get_cost(new_solution)
            if neighbor_cost < lowest_cost:
                lowest_cost = neighbor_cost
                lowest_solution = new_solution

        if lowest_cost >= current_cost:
            break
        else: 
            current_solution= lowest_solution
            current_cost = lowest_cost
            step += 1
    return current_solution

コスト関数

完全を期すために、(デモの目的で)独自のコスト関数を使用します。

f(x) = x1^1 - x2^2 + x3^3 - x4^4 + x5^5

あれは :

def get_cost(solution):
    cost = 0
    for i,param in enumerate(solution):
        cost += (-1.)**i * param**(i+1)  
    return cost

最適化の結果:

結果は次のとおりです。[4、0、1、3、1]のランダムな初期推定を使用します。14ステップ(14 * 10 = 140ネイバーの評価)の後、コストを最小化する[0、5、0、5、0]の最適な答えを見つけます。ブルートフォースの場合、6 ^ 6=46656ソリューションを評価する必要があります。高次元のソリューションを使用している間は、実行時間を大幅に節約できます。

これは確率論的方法であるため、最終結果として極小値が検出されることに注意してください(ただし、大域的最小値と同じ場合もありますが、保証されていません)。しかし、実際にはそれで十分です。

initial solution:               [4 0 1 3 1]
hill-climbing cost at step      1: -75
hill-climbing cost at step      2: -250
hill-climbing cost at step      3: -619
hill-climbing cost at step      4: -620
hill-climbing cost at step      5: -621
hill-climbing cost at step      6: -622
hill-climbing cost at step      7: -623
hill-climbing cost at step      8: -624
hill-climbing cost at step      9: -627
hill-climbing cost at step     10: -632
hill-climbing cost at step     11: -639
hill-climbing cost at step     12: -648
hill-climbing cost at step     13: -649
hill-climbing cost at step     14: -650
Final solution:                 [0 5 0 5 0]

関連記事

関連するがより複雑な質問はここにあります:コストを最小限に抑えながらセットからn個のベクトルを選択するためのアルゴリズム

上記のすべてのコードはここにあります。

于 2012-12-02T00:00:02.727 に答える
3

例の単純なグリッド検索からさまざまな適応アルゴリズムまで、アルゴリズムの最適化にはさまざまな手法があります。より高度な手法について学びたい場合は、Frank Hutterの研究から始めることをお勧めします。彼の博士論文には、この分野の優れた概要が含まれています。

あまり時間をかけたくない場合は、通常のグリッドを使用する代わりに、パラメータをランダムに生成することをお勧めします。このようにして、一部のパラメーターが重要でないことが判明した場合でも、他のパラメーターを修正しておくために時間を無駄にすることはありません。次のようなものが必要です。

param1 = random.Next(50);
param2 = random.Next(50);
...
PerformMatching();

このアプローチのもう 1 つの利点は、必要なだけサンプル ポイントを収集でき、グリッド全体が探索されるまで待つ必要がないことです。ポイントを均等に分散させる準ランダムパラメータ シーケンスを使用すると、さらに良い結果が得られます。これらを生成するライブラリがあります。

ポイントを生成したら、最適な組み合わせを選択するか、グラフ ツールを使用してそれらを分析するか、MeanShift などのモード検出アルゴリズムを使用することができます。

于 2012-11-30T18:00:10.077 に答える