سؤال

أستطيع أن أكتب شيئا نفسي عن طريق العثور على المعابر الصفرية من المشتق الأول أو أي شيء، ولكن يبدو أن وظيفة شائعة بما يكفي يتم تضمينها في المكتبات القياسية. أي شخص يعرف واحد؟

تطبيق خاص بي هو صفيف ثنائي الأبعاد، ولكن عادة ما يتم استخدامه لإيجاد قمم في FFTS، إلخ.

على وجه التحديد، في هذه الأنواع من المشكلات، هناك العديد من القمم القوية، ثم الكثير من "القمم" الأصغر الناجمة عن الضوضاء التي يجب تجاهلها. هذه مجرد أمثلة؛ ليس بياناتي الفعلية:

قمم ثلاثية الأبعاد:

FFT output with peaks

قمم ثنائية الأبعاد:

Radon transform output with circled peak

ستجد خوارزمية ذروة العثور على موقع هذه القمم (وليس فقط قيمها)، ومن الممثل من الناحية المثالية العثور على الذروة الحقيقية بين العينة، وليس فقط الفهرس ذو القيمة القصوى، وربما تستخدم الاستيفاء التربيعي أو شيء ما.

عادة ما تهتم فقط ببعض قمم قوية، لذلك سيتم اختيارهم لأنهم فوق عتبة معينة، أو لأنهم الأول ن قمم قائمة الطلبات، المرتبة حسب السعة.

كما قلت، أعرف كيف أكتب شيئا مثل هذا نفسي. أنا فقط أسأل عما إذا كانت هناك وظيفة أو حزمة موجودة مسبقا تعرف أنها تعمل بشكل جيد.

تحديث:

أنا ترجمة نص matlab ويعمل لائق للحالة 1-D، ولكن يمكن أن تكون أفضل.

تحديث تحديث:

Sixtenbe. خلق نسخة أفضل لحالة 1 د.

هل كانت مفيدة؟

المحلول

لا أعتقد أن ما تبحث عنه يتم توفيره بواسطة SCIPY. أود أن أكتب القانون بنفسي، في هذه الحالة.

إن عملية الاستيفاء SPLINE وتنعيمها من SCIPY.Interpolate لطيفة للغاية وقد تكون مفيدة للغاية في تركيب قمم ثم العثور على موقع الحد الأقصى.

نصائح أخرى

أنا أبحث في مشكلة مماثلة، ووجدت بعض من أفضل المراجع تأتي من الكيمياء (من القمم الناجمة عن البيانات الجماهيرية). للحصول على مراجعة شاملة جيدة لقراءة خوارزميات النتائج هذه. وبعد هذه واحدة من أفضل الاستعراضات الأكثر وضوحا لتقنيات العثور على ذروتها التي أدت إليها. (Wavelets هي الأفضل لإيجاد قمم من هذا النوع في البيانات الصاخبة.).

يبدو أن ذرواتك محددة بوضوح وغير مخفية في الضوضاء. أن تكون الحالة التي أوصي بها باستخدام المشتقات Smooth Savtizky-Golay للعثور على القمم (إذا قمت بالتمييز بين البيانات أعلاه، فستحصل على فوضى من الإيجابيات الخاطئة.). هذه تقنية فعالة للغاية ومن السهل تنفيذها (تحتاج إلى عمليات مصفوفة فئة ث / عمليات أساسية). إذا وجدت ببساطة عبور الصفر لأول مشتق SG لأول مرة سأكون سعيدا.

الوظيفة scipy.signal.find_peaks, ، كما يوحي اسمها، مفيدا لهذا. ولكن من المهم أن نفهم جيدا معالمها width, threshold, distance وفوق كل شيء prominence للحصول على استخراج جيد الذروة.

وفقا للاختبارات الخاصة بي والوثائق، مفهوم الشهرة هو "المفهوم المفيد" للحفاظ على قمم جيدة، وتجاهل القمم الصاخبة.

ما هو بروز (الطبوغرافية)ب أنه "الحد الأدنى للارتفاع اللازم لإنزال للحصول على القمة إلى أي تضاريس أعلى", ، كما يمكن رؤيته هنا:

enter image description here

الفكرة هي:

كلما ارتفعت الأهمية، كلما كانت الذروة أكثر أهمية ".

اختبار:

enter image description here

لقد استخدمت الجيوب الأنفية (صاخبة) على أساس غرض لأنه يظهر العديد من الصعوبات. يمكننا أن نرى أن width المعلمة ليست مفيدة للغاية هنا لأنه إذا قمت بتعيين الحد الأدنى width مرتفعة للغاية، ثم لن تتمكن من تتبع قمم وثيق جدا في الجزء العالي التردد. إذا قمت بتعيين width منخفض جدا، سيكون لديك العديد من القمم غير المرغوب فيها في الجزء الأيسر من الإشارة. نفس المشكلة مع distance. threshold يقارن فقط مع الجيران المباشر، وهو غير مفيد هنا. prominence هو الذي يعطي أفضل حل. لاحظ أنه يمكنك الجمع بين العديد من هذه المعلمات!

رمز:

import numpy as np
import matplotlib.pyplot as plt 
from scipy.signal import find_peaks

x = np.sin(2*np.pi*(2**np.linspace(2,10,1000))*np.arange(1000)/48000) + np.random.normal(0, 1, 1000) * 0.15
peaks, _ = find_peaks(x, distance=20)
peaks2, _ = find_peaks(x, prominence=1)      # BEST!
peaks3, _ = find_peaks(x, width=20)
peaks4, _ = find_peaks(x, threshold=0.4)     # Required vertical distance to its direct neighbouring samples, pretty useless
plt.subplot(2, 2, 1)
plt.plot(peaks, x[peaks], "xr"); plt.plot(x); plt.legend(['distance'])
plt.subplot(2, 2, 2)
plt.plot(peaks2, x[peaks2], "ob"); plt.plot(x); plt.legend(['prominence'])
plt.subplot(2, 2, 3)
plt.plot(peaks3, x[peaks3], "vg"); plt.plot(x); plt.legend(['width'])
plt.subplot(2, 2, 4)
plt.plot(peaks4, x[peaks4], "xk"); plt.plot(x); plt.legend(['threshold'])
plt.show()

هناك وظيفة في SCIPY اسمه scipy.signal.find_peaks_cwt ما يبدو وكأنه مناسب لاحتياجاتك، ومع ذلك ليس لدي خبرة في ذلك، لذلك لا أستطيع أن أوصي ..

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

بالنسبة لأولئك الذين ليسوا متأكدين من الخوارزميات التي ستستخدمها ذررتها في بيثون، وهنا نظرة عامة سريعة عن البدائل: https://github.com/monsieurv/py-findpeaks.

هل ترغب في نفسي ما يعادل matlab findpeaks وظيفة، لقد وجدت أن 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 results

تمت دراسة الكشف عن قمم في الطيف بطريقة موثوقة قليلا، على سبيل المثال كل العمل على النمذجة الجيبية لإشارات الموسيقى / الصوت في 80ies. ابحث عن "النمذجة الجيبية" في الأدب.

إذا كانت الإشارات الخاصة بك نظيفة مثل المثال، فإن "تعطيني شيئا بسيطا مع السعة أعلى من جيران N" يجب أن تعمل بشكل جيد بشكل معقول. إذا كان لديك إشارات صاخبة، فإن الطريقة البسيطة ولكنها فعالة هي أن ننظر إلى قممك في الوقت المناسب، لتتبعها: ثم اكتشاف خطوط طيفية بدلا من القمم الطيفية. iow، تحسب FFT على نافذة منزلقة من الإشارة الخاصة بك، للحصول على مجموعة من الطيف في الوقت المناسب (وتسمى أيضا الطيف). عندها إلقاء نظرة على تطور الذروة الطيفية في الوقت المناسب (أي في ويندوز متتالية).

هناك وظائف وأساليب إحصائية قياسية لإيجاد القيم المتطرفة إلى البيانات، والتي ربما تكون ما تحتاجه في الحالة الأولى. باستخدام المشتقات من شأنه أن يحل ثاني. لست متأكدا من طريقة تحل الوظائف المستمرة وبيانات العينات.

أول الأشياء أولا، تعريف "الذروة" غامضة إذا لم تكن كذلك مواصفات أخرى. على سبيل المثال، بالنسبة للسلسلة التالية، هل تتصل ب 5-4-5 ذروة واحدة أو اثنين؟

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

في هذه الحالة، ستحتاج إلى عتبتين على الأقل: 1) عتبة عالية فقط أعلى منها يمكن أن تكون قيمة القيمة القصوى كدفحة؛ 2) عتبة منخفضة بحيث تكون القيم القصوى المفصولة بالقيم الصغيرة أسفلها ستصبح ذروتين.

الكشف الذروة هو موضوع مدروس جيدا في أدب نظرية القيمة المتطرفة، المعروف أيضا باسم "رفض القيم القصوى". تتضمن تطبيقاتها النموذجية تحديد أحداث المخاطر القائمة على القراءات المستمرة للمتغيرات البيئية مثل تحليل سرعة الرياح للكشف عن أحداث العاصفة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top