3

以下にプロットされた 2D 配列では、「塊」領域を見つけることに関心があります。ご覧のとおり、連続グラフではありません。また、「塊」領域のおおよその寸法もわかっています。以下に一連のデータを示します。最初の列には y の値が含まれ、2 番目の列には x の値が含まれます。このような塊領域を検出する方法に関する提案はありますか?

ここに画像の説明を入力

   21048        -980
   21044        -956
   21040        -928
   21036        -904
   21028        -880
   21016        -856
   21016        -832
   21016        -808
   21004        -784
   21004        -760
   20996        -736
   20996        -712
   20992        -684
   20984        -660
   20980        -636
   20968        -612
   20968        -588
   20964        -564
   20956        -540
   20956        -516
   20952        -492
   20948        -468
   20940        -440
   20936        -416
   20932        -392
   20928        -368
   20924        -344
   20920        -320
   20912        -296
   20912        -272
   20908        -248
   20904        -224
   20900        -200
   20900        -176
   20896        -152
   20888        -128
   20888        -104
   20884         -80
   20872         -52
   20864         -28
   20856          -4
   20836          16
   20812          40
   20780          64
   20748          88
   20744         112
   20736         136
   20736         160
   20732         184
   20724         208
   20724         232
   20724         256
   20720         280
   20720         304
   20720         328
   20724         352
   20724         376
   20732         400
   20732         424
   20736         448
   20736         472
   20740         496
   20740         520
   20748         544
   20740         568
   20736         592
   20736         616
   20736         640
   20740         664
   20740         688
   20736         712
   20736         736
   20744         760
   20748         788
   20760         812
   20796         836
   20836         860
   20852         888
   20852         912
   20844         936
   20836         960
   20828         984
   20820        1008
   20816        1032
   20820        1056
   20852        1080
   20900        1108
   20936        1132
   20956        1156
   20968        1184
   20980        1208
   20996        1232
   21004        1256
   21012        1280
   21016        1308
   21024        1332
   21024        1356
   21028        1380
   21024        1404
   21020        1428
   21016        1452
   21008        1476
   21004        1500
   20992        1524
   20980        1548
   20956        1572
   20944        1596
   20920        1616
   20896        1640
   20872        1664
   20848        1684
   20812        1708
   20752        1728
   20664        1744
   20640        1768
   20628        1792
   20628        1816
   20620        1836
   20616        1860
   20612        1884
   20604        1908
   20596        1932
   20588        1956
   20584        1980
   20580        2004
   20572        2024
   20564        2048
   20552        2072
   20548        2096
   20536        2120
   20536        2144
   20524        2164
   20516        2188
   20512        2212
   20508        2236
   20500        2260
   20488        2280
   20476        2304
   20472        2328
   20476        2352
   20460        2376
   20456        2396
   20452        2420
   20452        2444
   20436        2468
   20432        2492
   20432        2516
   20424        2536
   20420        2560
   20408        2584
   20396        2608
   20388        2628
   20380        2652
   20364        2676
   20364        2700
   20360        2724
   20352        2744
   20344        2768
   20336        2792
   20332        2812
   20328        2836
   20332        2860
   20340        2888
   20356        2912
   20380        2940
   20428        2968
   20452        2996
   20496        3024
   20532        3052
   20568        3080
   20628        3112
   20652        3140
   20728        3172
   20772        3200
   20868        3260
   20864        3284
   20864        3308
   20868        3332
   20860        3356
   20884        3384
   20884        3408
   20912        3436
   20944        3464
   20948        3488
   20948        3512
   20932        3536
   20940        3564
4

1 に答える 1

7

偶然かもしれませんが、表示されるしこりはかなり放物線状に見えます。「しこり領域のおおよその寸法を知っている」とはどういう意味かは完全にはわかりませんが、おおよその幅(つまり、X軸が占める量)がわかっている場合は、ウィンドウをスライドさせるだけで済みます。 x軸に沿ってその幅を調整し、各ポイントでウィンドウに収まるすべてのデータに放物線近似(2次のポリフィット)を実行します。次に、各ポイントでr ^ 2適合度の値を計算すると、r^2が1.0に最も近いポイントが最適になります。おそらく、しきい値が必要であり、x ^ 2係数が正である値(ディップではなくランプを見つけるため)を破棄する必要がありますが、これは実行可能なアプローチである可能性があります。

放物線の外観が偶然の一致であるとしても、これは合理的なアプローチであると思います。下向きの放物線は、私が考えることができるあらゆる定義による一般的な「しこり」のかなり良い説明です。

編集:以下の実装の試み

私は興味を持ち、先に進んで、提案したソリューションを実装しました(わずかな変更を加えました)。まず、コードは次のとおりです(醜いですが機能的です):

function [x, p] = find_lump(data, width)

  n = size(data, 1);

  f = plot(data(:,1),data(:,2), 'bx-');
  hold on;

  bestX = -inf;
  bestP = [];
  bestMSE = inf;
  bestXdat = [];
  bestYfit = [];

  spanStart = 0;
  spanStop = 1;
  spanWidth = 0;

  while (spanStop < n)
    if (spanStart > 0)
      % Drop first segment from window (since we'll advance x):
      spanWidth = spanWidth - (data(spanStart + 1, 1) - x);
    end

    spanStart = spanStart + 1;
    x = data(spanStart, 1);

    % Advance spanStop index to maintain window width:
    while ((spanStop < n) && (spanWidth <= width))
      spanStop = spanStop + 1;
      spanWidth = data(spanStop, 1) - x;
    end

    % Correct for overshoot:
    if (spanWidth > width) 
      spanStop = spanStop - 1;
      spanWidth = data(spanStop, 1) - x;
    end

    % Fit parabola to data in the current window:
    xdat = data(spanStart:spanStop, 1);
    ydat = data(spanStart:spanStop, 2);
    p = polyfit(xdat, ydat, 2);

    % Compute fit quality (mean squared error):
    yfit = polyval(p,xdat);
    r = yfit - ydat;
    mse = (r' * r) / size(xdat,1);

    if ((p(1) < -0.002) && (mse < bestMSE))
      bestMSE = mse;
      bestX = x;
      bestP = p;
      bestXdat = xdat;
      bestYfit = yfit;
    end
  end

  x = bestX;
  p = bestP;

  plot(bestXdat,bestYfit,'r-');

...これは、ウィンドウ幅パラメーターが750の、指定されたデータ(列を入れ替えたため、列1がx値、列2がy値)を使用した結果です。

一括フィットが描画されたデータプロット

コメント:

何よりも怠惰による相関係数(r ^ 2値)ではなく、フィット放物線と各ウィンドウ内の元のデータとの間の平均二乗誤差を品質メトリックとして使用することを選択しました。他の方法で結果が大きく変わることはないと思います。

出力は、2次係数に選択されたしきい値に大きく依存します(ループの最後にあるbestMSE条件を参照してください)。正直なところ、ここでは各ポイントの適合係数を出力して不正行為を行い、既知の塊の形状に基づいてしきい値を選択しました。これは、@ chaohuangによって提案された一括テンプレートを使用することと同等であり、データの予想される分散によってはあまり堅牢ではない場合があります。

このアプローチを使用する場合は、何らかの形状制御パラメータが必要になるように思われることに注意してください。その理由は、ランダムな(スムーズな)データの実行は、放物線にうまく適合できるが、必ずしも最大値付近に収まるとは限らないためです。これは、しきい値をゼロに設定して、下向きの放物線にのみフィットを制限した結果です。

最適ではありません

改善点は、近似放物線が少なくともウィンドウ間隔内で最大値を持つことを確認するチェックを追加することです(つまり、ウィンドウ内で1次導関数がゼロになることを確認して、少なくとも曲線に沿って極大値を見つけます)。与えられたデータセットに見られるように、「明らかな」大きな塊よりも放物線によく合う小さな小さな塊があるかもしれないので、これだけでは十分ではありません。

于 2012-07-11T02:34:45.780 に答える