166

一次導関数のゼロクロッシングなどを見つけることで自分で何かを書くことができますが、標準ライブラリに含まれるのに十分一般的な関数のようです。誰か知っていますか?

私の特定のアプリケーションは 2D 配列ですが、通常は FFT などでピークを見つけるために使用されます。

具体的には、この種の問題では、複数の強いピークがあり、その後、ノイズが原因である無視されるべき小さな「ピーク」がたくさんあります。これらは単なる例です。私の実際のデータではありません:

1 次元ピーク:

ピークのある FFT 出力

2 次元ピーク:

丸で囲んだピークのラドン変換出力

ピーク検出アルゴリズムは、これらのピークの位置 (値だけでなく) を見つけ、理想的には、おそらく二次補間などを使用して、最大値のインデックスだけでなく、真のサンプル間のピークを見つけます。

通常、いくつかの強いピークのみを気にするため、特定のしきい値を超えているか、振幅によってランク付けされた順序付けられたリストの最初のnピークであるために選択されます。

私が言ったように、私はこのようなものを自分で書く方法を知っています。うまく機能することが知られている既存の関数またはパッケージがあるかどうかを尋ねているだけです。

アップデート:

MATLAB スクリプトを変換したところ、1 次元の場合は問題なく動作しましたが、改善される可能性があります。

更新された更新:

sixtenbeは 1 次元の場合のより良いバージョンを作成しました。

4

9 に答える 9

49

私は同様の問題を調べていますが、最良の参考文献のいくつかは化学からのものであることがわかりました(質量分析データで見つかったピークから)。ピーキング検出アルゴリズムの詳細については、こちらをお読みください。これは、私が遭遇したピーク発見手法の最も明確なレビューの1つです。(ウェーブレットは、ノイズの多いデータでこの種のピークを見つけるのに最適です。)

ピークが明確に定義されており、ノイズに隠れていないようです。その場合は、滑らかなsavtizky-golay導関数を使用してピークを見つけることをお勧めします(上記のデータを区別するだけでは、誤検知が発生します)。これは非常に効果的な手法であり、実装は非常に簡単です(基本的な操作を含む行列クラスが必要です)。最初のSG導関数のゼロ交差を単純に見つければ、あなたは幸せになると思います。

于 2009-12-17T17:06:46.203 に答える
21

scipy.signal.find_peaks_cwtあなたのニーズに適しているように聞こえるscipyという名前の関数がありますが、私はそれを経験していないのでお勧めできません..

http://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.find_peaks_cwt.html

于 2013-09-17T12:58:31.663 に答える
18

Python でどのピーク検出アルゴリズムを使用すればよいかわからない場合は、代替案の簡単な概要を以下に示します: https://github.com/MonsieurV/py-findpeaks

findpeaks自分自身を MatLab関数と同等にしたいので、Marcos Duarte のdetect_peaks 関数が良いキャッチであることがわかりました。

かなり使いやすい:

import numpy as np
from vector import vector, plot_peaks
from libs import detect_peaks
print('Detect peaks with minimum height and distance filters.')
indexes = detect_peaks.detect_peaks(vector, mph=7, mpd=2)
print('Peaks are: %s' % (indexes))

これはあなたに与えるでしょう:

detect_peaks の結果

于 2015-07-18T17:53:43.233 に答える
6

信頼性の高い方法でスペクトルのピークを検出することは、かなり研究されてきました。たとえば、80 年代の音楽/オーディオ信号の正弦波モデリングに関するすべての作業です。文献で「正弦波モデリング」を探してください。

信号が例のようにきれいな場合は、単純な「N 個の隣人よりも振幅が大きいものをください」という単純な方法で十分に機能するはずです。ノイズの多い信号がある場合、簡単ですが効果的な方法は、ピークを時間内に見て追跡することです。次に、スペクトル ピークの代わりにスペクトル線を検出します。IOW、信号のスライディング ウィンドウで FFT を計算して、一連の時間スペクトル (スペクトログラムとも呼ばれます) を取得します。次に、スペクトル ピークの経時変化 (つまり、連続するウィンドウ) を調べます。

于 2009-11-27T08:20:25.320 に答える
3

正と負の両方のピークを検出するには、PeakDetectが役立ちます。

from peakdetect import peakdetect

peaks = peakdetect(data, lookahead=20) 
# Lookahead is the distance to look ahead from a peak to determine if it is the actual peak. 
# Change lookahead as necessary 
higherPeaks = np.array(peaks[0])
lowerPeaks = np.array(peaks[1])
plt.plot(data)
plt.plot(higherPeaks[:,0], higherPeaks[:,1], 'ro')
plt.plot(lowerPeaks[:,0], lowerPeaks[:,1], 'ko')

ピーク検出

于 2020-10-29T10:09:33.760 に答える
2

データの外れ値を見つけるための標準的な統計関数とメソッドがあり、これはおそらく最初のケースで必要なものです。導関数を使用すると、秒が解決されます。ただし、連続関数とサンプルデータの両方を解決する方法についてはわかりません。

于 2009-11-12T09:17:01.080 に答える
2

あなたが探しているものが SciPy によって提供されているとは思いません。この状況では、私は自分でコードを書きます。

scipy.interpolate からのスプライン補間とスムージングは​​非常に優れており、ピークをフィッティングして最大値の位置を見つけるのに非常に役立つ場合があります。

于 2009-11-12T08:36:11.300 に答える
1

まず第一に、「ピーク」の定義は、それ以上の仕様がなければあいまいです。たとえば、次のシリーズでは、5-4-5 を 1 つまたは 2 つのピークと呼びますか?

1-2-1-2-1-1-5-4-5-1-1-5-1

この場合、少なくとも 2 つのしきい値が必要になります。2) 低いしきい値で、それより下の小さな値で区切られた極値が 2 つのピークになるようにします。

ピーク検出は、極値理論の文献でよく研究されているトピックであり、「極値のデクラスタリング」としても知られています。その典型的なアプリケーションには、環境変数の継続的な読み取りに基づいてハザード イベントを特定することが含まれます。たとえば、風速を分析して暴風雨イベントを検出します。

于 2016-05-03T16:02:59.657 に答える