2 つ以上のバンドを示す 1D 信号がいくつかあります。以下に例を示します。
単一のバンドに属するデータポイントを抽出する必要があります。
私の最初の簡単なアプローチは、データの移動平均を取り、データが平均よりも大きいインデックスを取得することでした。
def seperate(x):
average = scipy.ndimage.gaussian_filter(x, 10)
# this gives me a boolean array with the indices of the upper band.
idx = x > average
# return the indices of the upper and lower band
return idx, ~idx
これらと平均曲線をプロットすると、次のようになります。ここで、赤は上部バンド、青は下部バンドを示します。
これはこの例では非常にうまく機能しますが、2 つ以上のバンドが存在する場合やバンドが十分に分離されていない場合は失敗します。
より堅牢で一般的なソリューションを探しています。私は scikit-learn を調べていて、これを実現するためにクラスタリング アルゴリズムの 1 つを使用できるかどうか疑問に思っていました。