0

圧縮アルゴリズムを実現しました。次のように呼び出して実行するとします。

myCompression(data, th)

thパラメーターは 0 から 1 の間の実数です。212.19e-013 のように非常に小さい数値になる場合もあります。

num = length(myCompression(data, th))

圧縮後に残っているデータの数を教えてくれました。numを大きくしたい場合は、より低いthパラメータを選択する必要があります。逆に、より高いnumが必要な場合は、より低いthを選択する必要があります。

問題は次のとおりです。numが選択したターゲット番号と等しくなるような適切なthを見つけたいのです。ご存知のように、find thは非常に長い作業であり、私のニーズを満たすthを見つけるブルート フォース アルゴリズムを実現します。私はこれを書いた:

target = 304;
th = 2.49e-011;
num = 0;

while(num~=target)    
    num = length(MCSimplify3(time, latitudes, longitudes, th));
    disp(horzcat('tol: ', num2str(th), ' num: ', num2str(num)));

    if (num>target)
        th = th+(rand()*th);
    else
        th = th-(rand()*th);
    end

    th = abs(th);
end

前のスクリプトは開始しますが、ターゲットをキャッチしません。問題は、加算または減算(rand()*th)が大きすぎるという事実によるものだと思います。つまり、1 回は目標を上回り、もう 1 回は目標を下回っています。したがって、スイングを続けて、結果をキャッチしないでください。

tol: 2.67e-012 num: 333
tol: 4.0685e-012 num: 303
tol: 2.9909e-012 num: 320
tol: 3.1953e-012 num: 316
tol: 4.5895e-012 num: 298
tol: 3.7916e-012 num: 308
tol: 3.8906e-012 num: 308
tol: 7.6049e-012 num: 257
tol: 4.3302e-012 num: 299
tol: 1.6646e-013 num: 624
tol: 2.9337e-013 num: 562
tol: 2.9553e-013 num: 561
tol: 4.965e-013 num: 503
tol: 8.47e-013 num: 448
tol: 1.3934e-012 num: 391
tol: 2.163e-012 num: 350
tol: 2.6348e-012 num: 335
tol: 4.6699e-012 num: 296

誰かが私を助けることができますか?

4

3 に答える 3

1

猫の皮を剥ぐ方法は複数ありますが、最初に行う必要がrandあるのは、非常に予測不可能なパラメータであるため、除去することです。そうは言っても、Nelder-Meadを参照してください。

より実用的な観点からは、rand() を定数 (0.1 など)、または num と target の間の距離に可変パラメーターを掛けた値を測定する変数に置き換える必要があります。

または、fminsearch (Nelder-Mead を使用) などの最小化ルーチンを使用して、不連続性を微調整することもできます。

コードを実行できなければ、これ以上の情報を提供することは困難です (つまり、MCSimplify3 が必要です)。

于 2012-04-23T16:49:55.270 に答える
1

まず、あなたが私たちに示したデータのグラフを描きます。thこれにより、求めるターゲット値が得られる値の検索をどこに向ければよいかが明確になります。

th2 番目に、適切な範囲内の の値を検索する何らかの種類の検索を実装します。目的のターゲット値を囲む区間の単純な二分探索でさえ、現在のアプローチよりも優れています。

304データを観察するだけで、 の目標値に対して、 の値がthの範囲内にあることが示唆されます(3.7916e-012,4.0685e-012)

于 2012-04-23T16:18:20.987 に答える
0

ハイパフォーマンスマークの貴重なヒントで、こう解決しました。

target = 304;
len = 0;

a = 0;
b = 1;

while(len~=target)
    c = (a+b)/2;
    len = length(MCSimplify3(time, latitudes, longitudes, c));
    if(len<target)
        b = c;
    end
    if (len>target)
        a = c;
    end
    if (len==target)
        disp(horzcat('tol: ', num2str(th), ' num: ', num2str(len)));
    end
end
于 2012-04-23T17:09:30.080 に答える