HTML

Az élet kódjai

Csináld maga. Senki nem csinálja meg helyetted.

Friss topikok

Lokális maximum keresés

2018.12.18. 01:58 Travis.CG

A fenti elnevezés gyakorlatilag a csúcsok azonosítása változó adatokon. Ezek az adatok változhatnak térben vagy időben. Jelen posztban csak a 2D csúcsok azonosítása a cél, de természetesen léteznek módszerek magasabb dimenziókra is.

Aki egy kicsit is kutakodott a témában, bizonyára tapasztalta, hogy nincs egységes konszenzus, mit is nevezzünk csúcsnak. Amíg az első ábrán teljesen egyértelmű, mit tekintünk a legmagasabb pontnak, addig egy zajos, kiugró értékektől sem mentes adatnál már nem ilyen egyszerű a helyzet:

zoom.png

out.png

Talán ez is az oka, hogy a számtalan elérhető módszer mellett az emberek saját maguk is készítenek ad-hoc megoldásokat, amelyek ugyan úgy, vagy még jobban megfelelnek az igényeknek.

A következőkben azt mutatom meg, hogyan lehet minimális programozással, adott függvényekre támaszkodva megoldani a feladatot. Minimális programozás alatt azt értem, hogy csak a rendszer által biztosított függvényeket használjuk, semmilyen saját magunk által implementált adat transzformációt vagy algoritmust nem kell igénybe venni. Mintha előre gyártott LEGO elemeket illesztenénk össze, de saját kockákat nem gyártunk.

R

R-ben két csomag kerül bemutatásra. Az első a PeakPick. Használata rendkívül egyszerű. Bemenő paramétere egy oszlop mátrix. Ezt a matrix() függvénnyel állíthatjuk elő. Második paramétere a csúcspontok minimális távolsága.

peakPick(matrix(data, ncol=1), 100)

Visszatérési értéke egy logikai mátrix, a bemeneti adatokkal megegyező dimenzióval. Igaz érték esetén az adott elemet csúcspontként azonosította az algoritmus.

A második csomag a nem túl intuitív pracma néven fut. Bemenete egy vektor, tehár a PeakPick-el ellentétben csak 2D adatokra használhatjuk.

findpeaks(data)

A program viszonylag egyszerű algoritmust használ. Csúcsnak tekint mindent, ami előtt és mögött alacsonyabb értékek vannak. Az, hogy mennyi lépésen keresztül történjen ez a növekedés, az nups és ndown paraméterekkel szabályozható.

Python

Az adatelemzés másik nagyágyúja, a Python is biztosít lehetőséget lokális maximumok felderítésére. A scipy csomag jelfeldolgozó rutinok egész sorával rendelkezik.

import scipy.signal as sig
import numpy as np
sig.find_peaks_cwt(data, np.arange(5,10))

Ez a megoldás egy wavelet transzformáción alapul, visszatérési értéke a bemeneti adat indexei, ahol a csúcspontot sikerült megtalálni.

Összegzés

Én denzitás függvényeken próbáltam ki a módszereket és számomra úgy tűnt az R megoldásai sokkal jobb eredményt adtak, közelebb álltak ahhoz, amit én csúcspontnak tekintek. A Pythonos megoldása nagyon érzékeny a második paraméterre és ahogy különböző értékekekt adtam meg neki, néha nagyon meglepő eredményeket adott. Talán az is probléma volt, hogy nem vagyok túl járatos a wavelet transzformációban.

De az biztos, hogy lokális maximum keresésnél nem kerülhetjük el a bemenő adatok szűrését. Ez pedig tovább növeli a beállítandó paraméterek számát. Ezek alapján azt mondanám, hogy a csúcspontok megtalálása egyfajta próba-szerencse módszerrel történik, ahol minden esetben figyelembe kell venni a bemeneti adatok jellegét.

Szólj hozzá!

Címkék: statisztika

A bejegyzés trackback címe:

https://cybernetic.blog.hu/api/trackback/id/tr8114486610

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása