পাইথন / সাইপাইয়ের জন্য পিক-ফাইন্ডিং অ্যালগরিদম


136

প্রথম ডেরাইভেটিভ বা কোনও কিছুর শূন্য-ক্রসিং সন্ধান করে আমি নিজেই কিছু লিখতে পারি, তবে এটি সাধারণ লাইব্রেরিতে অন্তর্ভুক্ত করার মতো একটি সাধারণ পর্যাপ্ত ফাংশন বলে মনে হয়। কেউ একজন জানেন?

আমার নির্দিষ্ট অ্যাপ্লিকেশনটি 2 ডি অ্যারে, তবে সাধারণত এটি এফএফটি ইত্যাদির শিখর অনুসন্ধানের জন্য ব্যবহৃত হত etc.

বিশেষত, এই ধরণের সমস্যায় একাধিক শক্তিশালী শৃঙ্গ রয়েছে এবং তারপরে প্রচুর ছোট "পিক" রয়েছে যা কেবলমাত্র শব্দের কারণে ঘটেছিল যা উপেক্ষা করা উচিত। এগুলি কেবল উদাহরণ; আমার আসল তথ্য নয়:

1-মাত্রিক শিখর:

শীর্ষগুলি সহ এফএফটি আউটপুট

দ্বিমাত্রিক শিখর:

বৃত্তাকার শীর্ষে র‌্যাডন রূপান্তরিত আউটপুট

শীর্ষ-সন্ধানকারী অ্যালগরিদম এই শিখরগুলির অবস্থান (কেবল তাদের মানগুলি নয়) সন্ধান করতে পারে এবং আদর্শভাবে সঠিক আন্ত-নমুনা শীর্ষটি পেত, কেবলমাত্র সর্বাধিক মান সহ সূচক নয়, সম্ভবত দ্বিঘাতের দ্বিখণ্ডিত বা কিছু ব্যবহার করে ।

সাধারণত আপনি কেবল কয়েকটি শক্তিশালী শৃঙ্গকেই যত্নশীল করেন, তাই সেগুলি বেছে নেওয়া হবে কারণ তারা একটি নির্দিষ্ট প্রান্তিকের উপরে, বা প্রশস্ততা অনুসারে তারা অর্ডারযুক্ত তালিকার প্রথম এন শিখর।

আমি যেমন বলেছি, আমি নিজেও এই জাতীয় কিছু লিখতে জানি। আমি কেবল জিজ্ঞাসা করছি যে প্রাক-বিদ্যমান ফাংশন বা প্যাকেজটি ভাল কাজ করার জন্য পরিচিত।

হালনাগাদ:

আমি একটি ম্যাটল্যাব স্ক্রিপ্ট অনুবাদ করেছি এবং এটি 1-ডি মামলার জন্য শালীনভাবে কাজ করে তবে আরও ভাল হতে পারে।

আপডেট আপডেট:

সিক্সটেনবি 1-ডি ক্ষেত্রে আরও ভাল সংস্করণ তৈরি করেছে।


@endolith আপনার কাছে মূল ম্যাটল্যাব ফাইল রয়েছে যা আপনি এর জন্য অজগরকে অনুবাদ করেছেন? ধন্যবাদ!
স্পেসি


2
এটি সম্পর্কে কী: ডকস.সসিপি.আর
ডক

1
@ এন্ডোলিথ আমি জানি এই প্রশ্নটি বেশ পুরানো, তবে এটি বেশ কার্যকর;) আমি আজ সকালে কয়েক ঘন্টা ব্যয় করেছি find_peaks, তাই আমি এই উত্তরটি যুক্ত করেছি যা ভবিষ্যতের রেফারেন্সের জন্য দরকারী হতে পারে। (আমি নিশ্চিত যে আপনি ২০০৯ সাল থেকে এটি ইতিমধ্যে খুঁজে পেয়েছেন তবে কয়েক বছরের মধ্যে আমি যখন নিজেকে আবার প্রশ্ন জিজ্ঞাসা করব তখন এটি আমার নিজের জন্যই থাকে!)
বাসজ

উত্তর:


74

ফাংশন scipy.signal.find_peaks, এর নাম হিসাবে এটি এর জন্য দরকারী। কিন্তু এটা ভাল বুঝতে তার পরামিতি গুরুত্বপূর্ণ width, threshold, distance এবং সর্বোপরিprominence একটি ভাল শিখর নিষ্কাশন জন্য।

আমার পরীক্ষাগুলি এবং ডকুমেন্টেশন অনুসারে, উচ্চতর শিখরকে ধরে রাখতে এবং গোলমাল শৃঙ্গগুলি ত্যাগ করার জন্য বিশিষ্টতার ধারণাটি "দরকারী ধারণা"।

কি (স্থান বিবরণ সম্বন্ধীয়) প্রাধান্য ? এটি এখানে দেখা যেতে পারে যে "শীর্ষে চূড়া থেকে কোনও উচ্চতর ভূখণ্ডে উঠতে ন্যূনতম উচ্চতা প্রয়োজন" :

এখানে চিত্র বর্ণনা লিখুন

ধারণাটি হ'ল:

শীর্ষস্থানটি যত বেশি, তত বেশি "গুরুত্বপূর্ণ" শীর্ষটি।

টেস্ট:

এখানে চিত্র বর্ণনা লিখুন

আমি উদ্দেশ্য হিসাবে একটি (গোলমাল) ফ্রিকোয়েন্সি-পরিবর্তিত সাইনোসয়েড ব্যবহার করেছি কারণ এটি অনেকগুলি অসুবিধা দেখায়। আমরা দেখতে পাচ্ছি যে widthপ্যারামিটারটি এখানে খুব কার্যকর নয় কারণ আপনি যদি ন্যূনতম widthখুব বেশি সেট করেন তবে এটি উচ্চ ফ্রিকোয়েন্সি অংশের খুব কাছের শিখরগুলি ট্র্যাক করতে সক্ষম হবে না। যদি আপনি widthখুব কম সেট করেন তবে আপনার সিগন্যালের বাম অংশে অনেকগুলি অযাচিত পর্বত রয়েছে। একই সমস্যা distancethresholdকেবল সরাসরি প্রতিবেশীদের সাথে তুলনা করে, যা এখানে কার্যকর নয়। 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()

এই আমি পরে কি। তবে আপনি কি এমন কোনও বাস্তবায়ন জানেন যা 2D অ্যারেতে সুনাম খুঁজে পায়?
জেসন

43

আমি একটি অনুরূপ সমস্যাটি দেখছি, এবং আমি কয়েকটি সেরা রেফারেন্স পেয়েছি রসায়ন থেকে এসেছি (ভর-উপাত্তের ডেটা অনুসন্ধান করা শিখর থেকে)। খোঁজার আলগোরিদিম চূড়ান্তে ওঠে একটি ভাল পুঙ্খানুপুঙ্খ পর্যালোচনার জন্য পড়া এই । এটি শীর্ষে অনুসন্ধানের কৌশলগুলির মধ্যে একটি সেরা পরিষ্কার পর্যালোচনা যা আমি জুড়ে চলেছি। (কোলাহলপূর্ণ ডেটাতে এই ধরণের শিখর সন্ধানের জন্য ওয়েভলেটগুলি সর্বোত্তম))

দেখে মনে হচ্ছে আপনার শিখর পরিষ্কারভাবে সংজ্ঞায়িত হয়েছে এবং গোলমালে লুকানো নেই। এই ক্ষেত্রে আমি শিখরগুলি সন্ধান করার জন্য মসৃণ স্যাটিজস্কি-গোলে ডেরিভেটিভগুলি ব্যবহার করার পরামর্শ দিই (যদি আপনি কেবলমাত্র উপরে বর্ণিত ডেটা পৃথক করেন তবে আপনার কাছে মিথ্যা ইতিবাচক একটি গোলমাল হবে)) এটি একটি খুব কার্যকর কৌশল এবং বাস্তবায়িত করা বেশ সহজ (আপনার একটি ম্যাট্রিক্স বর্গ / বেসিক ক্রিয়াকলাপ প্রয়োজন)। আপনি যদি প্রথম এসজি ডেরিভেটিভের শূন্য ক্রসিংটি খুঁজে পান তবে আমি মনে করি আপনি খুশি হবেন।


2
আমি একটি সাধারণ উদ্দেশ্যে সমাধান খুঁজছিলাম, এমন একটি নয় যা কেবলমাত্র সেই নির্দিষ্ট চিত্রগুলিতে কাজ করে। আমি পাইথনের সাথে একটি ম্যাটল্যাব স্ক্রিপ্টটি রূপান্তর করেছি এবং এটি শালীনভাবে কাজ করে।
এন্ডোলিথ

1
ঠিক. মতলব অ্যালগরিদমের জন্য ভাল উত্স। স্ক্রিপ্ট কোন কৌশল ব্যবহার করে? (বিটিডাব্লু, এসজি একটি খুব সাধারণ উদ্দেশ্য কৌশল)।
পল 21

2
আমি উপরে এটি লিঙ্ক। এটি মূলত কেবল স্থানীয় ম্যাক্সিমা অনুসন্ধান করে যা তাদের প্রতিবেশীদের উপরে একটি নির্দিষ্ট প্রান্তিকের চেয়ে বড়। অবশ্যই আরও ভাল পদ্ধতি আছে।
এন্ডোলিথ

1
@ পল আমি সেই পৃষ্ঠাটি বুকমার্ক করেছি। আইওয়াইও এবং সংক্ষেপে, আপনি কোন নির্দিষ্ট কৌশলটি এই শীর্ষ পিকিং ব্যবসায়ের জন্য সবচেয়ে ভাল কাজ করেছেন বলে মনে করেন?
স্পেসি

কেন তিনটি পয়েন্টের মধ্যে একটি মাঝেরটি অন্য দুটির চেয়ে বড় বা ছোট যদি হয় তবে কেবল টেস্টিংয়ের চেয়ে কেন ডেরিভেটিভের জিরো ভাল। আমি ইতিমধ্যে এসএজি ট্রান্সফোর প্রয়োগ করেছি, অতিরিক্ত ব্যয়ের মতো মনে হচ্ছে।
কিরিল_গুম 3'15

20

স্কিপি নামের একটি ফাংশন রয়েছে scipy.signal.find_peaks_cwtযা আপনার প্রয়োজনের জন্য উপযুক্ত বলে মনে হচ্ছে, তবে আমার এটির অভিজ্ঞতা নেই তাই আমি সুপারিশ করতে পারি না ..

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


12
হ্যাঁ, আমি যখন এটি জিজ্ঞাসা করেছি তখন এটি উপস্থিত ছিল না এবং আমি কীভাবে এটি ব্যবহার করব তা এখনও নিশ্চিত নই
এন্ডোলিথ

1
আপনি কিছুক্ষণ আগে এটি যুক্ত করেছেন, তবে এটি দুর্দান্ত কাজ করেছে। এটি পাই হিসাবে সহজ। অ্যারেতে কেবল পাস করুন এবং অন্য একটি অ্যারে (অর্থাত্ এনপি.আরঞ্জ (1,10)) যা আপনি চান সমস্ত শিখরের প্রস্থকে তালিকাবদ্ধ করে; আপনার যদি প্রয়োজন হয় তবে চর্মসার বা প্রশস্ত শৃঙ্গার জন্য ফিল্টার করার জন্য দুর্দান্ত সুবিধা। আবার ধন্যবাদ!
মাইলস

15

পাইথনে কোন শিখর-সন্ধানকারী অ্যালগরিদমগুলি ব্যবহার করা উচিত তা সম্পর্কে নিশ্চিত নন, এখানে বিকল্পগুলির একটি দ্রুত সংক্ষিপ্তসার: https://github.com/MonsieurV/py-findpeaks

নিজেকে ম্যাটল্যাব findpeaksফাংশনের সমতুল্য হিসাবে চাইলে আমি খুঁজে পেয়েছি যে মার্কোস ডুয়ার্টে থেকে ডিটেক্ট_পিক্স ফাংশনটি একটি ভাল ক্যাচ।

ব্যবহার করা খুব সহজ:

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))

যা আপনাকে দেবে:

সনাক্ত_পিক্স ফলাফল


1
যেহেতু এই পোস্টটি লেখা হয়েছিল, find_peaksফাংশনটি যুক্ত করা হয়েছিল scipy
ওয়ানওয়ালিড

6

নির্ভরযোগ্য উপায়ে বর্ণালীতে শিখর সনাক্ত করা বেশ খানিকটা অধ্যয়ন করা হয়েছে, উদাহরণস্বরূপ, 80 এর দশকে সংগীত / অডিও সংকেতের জন্য সাইনোসয়েডাল মডেলিংয়ের সমস্ত কাজ। সাহিত্যে "সাইনোসয়েডাল মডেলিং" সন্ধান করুন।

যদি আপনার সংকেত উদাহরণের মতো পরিষ্কার হয় তবে একটি সরল "N প্রতিবেশীর তুলনায় প্রশস্ততা সহ আমাকে কিছু দিন" যুক্তিযুক্তভাবে কাজ করা উচিত। আপনার যদি কোলাহলপূর্ণ সংকেত থাকে তবে একটি সহজ তবে কার্যকর উপায় হ'ল সময়মতো আপনার শিখরগুলি দেখে নেওয়া এবং সেগুলি ট্র্যাক করা: আপনি বর্ণালি শিখর পরিবর্তে বর্ণালী রেখাগুলি সনাক্ত করতে পারেন। IOW, আপনি সময় সময় বর্ণালী সেট (যা স্পেকট্রোগ্রামও বলা হয়) পেতে আপনার সিগন্যালের স্লাইডিং উইন্ডোতে এফএফটি গণনা করুন। তারপরে আপনি বর্ণাল শিখরটির বিবর্তনটি সময়ের সাথে লক্ষ্য করুন (অর্থাত্ ক্রমাগত উইন্ডোতে)।


সময়মতো শিখর তাকান? বর্ণালী রেখাগুলি সনাক্ত করুন? আমি এর অর্থ কি তা নিশ্চিত নই। এটি কি বর্গাকার তরঙ্গগুলির জন্য কাজ করবে?
এন্ডোলিথ

ওহ, আপনি এফএফটির পরিবর্তে এসটিএফটি ব্যবহারের কথা বলছেন। এই প্রশ্নটি বিশেষত এফএফটি সম্পর্কে নয়; এটি কেবল একটি উদাহরণ এটি কোনও সাধারণ 1 ডি বা 2 ডি অ্যারেতে শিখরগুলি সন্ধান করার বিষয়ে।
এন্ডোলিথ

4

আমি মনে করি না যে আপনি যা সন্ধান করছেন তা সায়পিওয়াই সরবরাহ করেছেন। আমি কোডটি নিজে লিখব, এই পরিস্থিতিতে।

স্কাইপি ইন্টিটারপোলেট থেকে স্প্লাইন ইন্টারপোলেশন এবং স্মুথিং বেশ সুন্দর এবং এটি পিকগুলি ফিট করে এবং তারপরে তাদের সর্বাধিকের অবস্থান সন্ধানে বেশ সহায়ক হতে পারে।


16
আমার ক্ষমা চাই, তবে আমি মনে করি এটি একটি মন্তব্য হওয়া উচিত, উত্তর নয়। এটি কেবল নিজের দ্বারা এটি লেখার পরামর্শ দেয়, কার্যকর হতে পারে এমন ফাংশনগুলির জন্য একটি অস্পষ্ট পরামর্শ দিয়ে (পলের উত্তরের উত্তরগুলি প্রাসঙ্গিকভাবে অনেক বেশি প্রাসঙ্গিক)।
অমি টাভরি

1

ডেটাতে বহিরাগতদের সন্ধানের জন্য স্ট্যান্ডার্ড স্ট্যাটিস্টিকাল ফাংশন এবং পদ্ধতি রয়েছে যা সম্ভবত প্রথম ক্ষেত্রে আপনার প্রয়োজন। ডেরিভেটিভস ব্যবহার করা আপনার দ্বিতীয়টি সমাধান করবে। তবে আমি এমন কোনও পদ্ধতির বিষয়ে নিশ্চিত নই যা ধারাবাহিক ক্রিয়া এবং নমুনাযুক্ত ডেটা উভয়ই সমাধান করে।


0

প্রথম জিনিসগুলি, "শিখর" এর সংজ্ঞাটি আরও বিশদ ছাড়াই অস্পষ্ট। উদাহরণস্বরূপ, নিম্নলিখিত সিরিজের জন্য, আপনি 5-5-5 এক বা দুটি শিখর কল করবেন?

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

এই ক্ষেত্রে, আপনার কমপক্ষে দুটি প্রান্তিকের প্রয়োজন হবে: 1) একটি উচ্চতর প্রান্তিক মাত্র যা উপরে চূড়ান্ত মান একটি শীর্ষ হিসাবে নিবন্ধিত করতে পারে; এবং 2) একটি নিচু চৌম্বক যাতে এর নীচে ছোট মানগুলি দ্বারা পৃথক করা চরম মান দুটি শিখরে পরিণত হয়।

চূড়ান্ত শনাক্তকরণ চরম মূল্য তত্ত্ব সাহিত্যের একটি সু-অধ্যয়নিত বিষয়, এটি "চরম মূল্যবোধের ডিক্লাস্টারিং" নামেও পরিচিত। এর সাধারণ অ্যাপ্লিকেশনগুলির মধ্যে পরিবেশগত পরিবর্তনশীলগুলির অবিচ্ছিন্ন পঠনের উপর ভিত্তি করে বিপজ্জনক ইভেন্টগুলি সনাক্তকরণ অন্তর্ভুক্ত রয়েছে যেমন ঝড়ের ঘটনাগুলি সনাক্ত করতে বাতাসের গতি বিশ্লেষণ করা।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.