データのセットの「wiggliness」を決定-Python
-
10-10-2019 - |
質問
私は、データのセットのwigglinessを実装する必要があるソフトウェアに取り組んでいます。これは、各垂直ピクセルストリップの軽さプロットと合併した入力のサンプルです。
左マージンが 本当 Wiggly(つまり、最小/最大値がたくさんあります)、画像の重要なポイントのセットを生成したいと思います。ガウスの平滑化関数をデータに〜10回適用しましたが、そもそもかなりくねくねしているようです。
何か案は?
これが私の元のコードですが、それは非常に素晴らしい結果を生み出しません(Wigglinessのために):
def local_maximum(list, center, delta):
maximum = [0, 0]
for i in range(delta):
if list[center + i] > maximum[1]: maximum = [center + i, list[center + i]]
if list[center - i] > maximum[1]: maximum = [center - i, list[center - i]]
return maximum
def count_maxima(list, start, end, delta, threshold = 10):
count = 0
for i in range(start + delta, end - delta):
if abs(list[i] - local_maximum(list, i, delta)[1]) < threshold: count += 1
return count
def wiggliness(list, start, end, delta, threshold = 10):
return float(abs(start - end) * delta) / float(count_maxima(list, start, end, delta, threshold))
解決
ローパス/ハイパス/ノッチ/バンドパスフィルター、フーリエ変換、またはウェーブレットをご覧ください。基本的なアイデアは、異なる時間期に量子化された信号の周波数含有量を把握するためのさまざまな方法があることです。
Wigglinessとは何かを理解できれば、それは役立ちます。左端のマージンは、より高い周波数のコンテンツを備えている波状のb/cであり、フーリエ変換を使用して視覚化できます。
その赤い信号のハイパスフィルターを採取すると、高周波コンテンツだけが取得され、振幅を測定してしきい値を実行して波状性を判断できます。しかし、Wigglinessはその背後にもっと形式主義を必要とするだけだと思います。
他のヒント
このようなことについては、numpyはベクターデータを操作するための有用な機能を提供するため、物事をはるかに簡単にします。たとえば、各要素にスカラーを追加したり、平均値を計算したりします。
たとえば、元のData-Wiggliness1または最初の差異Wiggliness2のいずれかのゼロ交差速度で試してみることができます(Wigglinessが想定されるはずです。 )。 Xの場合、元のデータから関心のあるスライスまたはウィンドウを取り、局所的なwigの尺度を取得します。元のデータを使用する場合、バイアスを削除した後、低振幅の波線を無視するために、一部のしきい値よりもすべての値を0に設定することもできます。
import numpy as np
def wiggliness1(x):
#remove bias:
x=x-np.average(x)
#calculate zero crossing rate:
np.sum(np.abs(np.sign(np.diff(x))))
def wiggliness(x):
#calculate zero crossing rate of the first difference:
return np.sum(np.abs(np.sign(np.diff(np.sign(np.diff(x))))))