Ich könnte dringend Hilfe gebrauchen. Ich möchte eine unbekannte Anzahl Peaks (0-4) in einem eindim. Datenfeld finden. Die Daten sind nicht allzusehr verrauscht, die Peaks mind. 3x höher als das Rauschen.
Ich weiß, daß es Algorithmen dazu gibt wie Sand am Meer… aber ich finde keinen einzigen!!! Kann mir jemand sagen, WO ich so einen (möglichst einfachen) Algorithmus mal sehen kann ? Ich möchte ihn in ein eigenes Programm einbauen; also er sollte entweder so simpel beschrieben sein, daß ein Nicht-Mathematiker das programmieren kann oder halt ein Quellcode-Beispiel (Sprache ist egal).
Wenn Du keine weiteren Informationen ueber deine Daten hast -
Korrelationen o.ae. dann bleibt dir nichts anderes uebrig, als
alles durchzugucken und die 4 maximalen Werte und z.B. den
Durchschnitt zu ermitteln.
D.h du hast eine Liste/Array der lange 4 und eine weitere Variable v.
Fuer jeden Wert w:
wenn groesser als kleinster Wert der Liste-> rein in Liste, bisher kleinster Wert raus. v=v+w.
Am Ende v durch Zahl der Werte teilen und z.B. jeden Wert der Liste der zweimal groesser ist als der Durchschnitt zum peak erklaeren.
Das die Liste endlich und sehr kurz ist (4) lauft das ganze dann
linear in der Zahl der Werte, was wegen der o.g. Eigenschaft
optimal ist.
Interessanter wird es, wenn du eine bleiebig grosse Zahl von Peaks suchst.
MFG
Martin
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Wenn Du keine weiteren Informationen ueber deine Daten hast -
Korrelationen o.ae.
hab ich nicht
dann bleibt dir nichts anderes uebrig, als
alles durchzugucken und die 4 maximalen Werte und z.B. den
Durchschnitt zu ermitteln.
Genau das ist mein Problem.
Ein Gedankenexperiment: Ein großer, breiter Peak, leicht verrauscht. Etwas abseits davon ein deutlich kleinerer Peak, ebenso verrauscht. Das Rauschen ist deutlich kleiner als der kleine Peak.
So, ok: die 4 größten Werte liegen alle im (seichten) Rauschen auf dem „Gipfel“ des großen Peaks. Hier würde doch dieser Algorithmus 4 vermeintliche Peaks finden und den kleinen, zweiten Peak total ignorieren ?
Weißt du, was ich meine ? Liege ich falsch ?
Interessanter wird es, wenn du eine bleiebig grosse Zahl von
Peaks suchst.
Ich weiß ja nicht, wie viele Peaks vorhanden sind. Einer, zwei, vielleicht drei… daß es aber mehr sind als 4 ist unwahrscheinlich.
Wenn Du keine weiteren Informationen ueber deine Daten hast -
Korrelationen o.ae.
hab ich nicht
dann bleibt dir nichts anderes uebrig, als
alles durchzugucken und die 4 maximalen Werte und z.B. den
Durchschnitt zu ermitteln.
Genau das ist mein Problem.
Ein Gedankenexperiment: Ein großer, breiter Peak, leicht
verrauscht. Etwas abseits davon ein deutlich kleinerer Peak,
ebenso verrauscht. Das Rauschen ist deutlich kleiner als der
kleine Peak.
So, ok: die 4 größten Werte liegen alle im (seichten) Rauschen
auf dem „Gipfel“ des großen Peaks. Hier würde doch dieser
Algorithmus 4 vermeintliche Peaks finden und den kleinen,
zweiten Peak total ignorieren ?
Weißt du, was ich meine ? Liege ich falsch ?
Interessanter wird es, wenn du eine bleiebig grosse Zahl von
Peaks suchst.
Ich weiß ja nicht, wie viele Peaks vorhanden sind. Einer,
zwei, vielleicht drei… daß es aber mehr sind als 4 ist
unwahrscheinlich.
Siehst Du mal, du hast eien Relation auf deinen Daten:
Nachbarschaft.
In diesem Fall kannst Du deine daten in -vermutlich linearer-
Reihenfolge durchgehen und z.B. folgendes machen. Du merkst dir das zuletzt gesehene Maximum. Wenn du als naechstes einen hoeheren Wert findest mache den zum neuen Maximum, wenn der Wert
ca. 50% kleiner ist als das bisherige Maximum nenne das bisherige
Maximum einen Peak und starte die Suche von neuem - ansonsten
bertachte den naechsten Wert. Evtl kannst du unter den gefundenen
„Peaks“ am Ende die vier groessten raussuchen.
MFG
Martin
natuerlich keine Garantie, dass du nur 4 Peaks findest.
Gut, ein Maximalwert in einer Menge (oder Teilmenge) Punkte kann ich finden. Kein Problem. Nur mit den 50% habe ich noch ein Problem (auch, wenn wir auf a% verallgemeinern). Je kleiner ich a wähle, desto enger überlappende peaks kann ich unterscheiden, aber desto wahrscheinlicher ist ein neuer Peak nur ein Rauschwert. Ich könnte mir denken, daß, wenn man eine Information über das mittlere Rauschen hat, a eben gerade größer macht als das Rauschen - dann hat man’s. Liege ich da richtig ? Und wenn ja… wie bestimme ich das Rauschen ?
bertachte den naechsten Wert. Evtl kannst du unter den
gefundenen „Peaks“ am Ende die vier groessten raussuchen.
Gut, ein Maximalwert in einer Menge (oder Teilmenge) Punkte
kann ich finden. Kein Problem. Nur mit den 50% habe ich noch
ein Problem (auch, wenn wir auf a% verallgemeinern). Je
kleiner ich a wähle, desto enger überlappende peaks kann ich
unterscheiden, aber desto wahrscheinlicher ist ein neuer Peak
nur ein Rauschwert. Ich könnte mir denken, daß, wenn man eine
Information über das mittlere Rauschen hat, a eben gerade
größer macht als das Rauschen - dann hat man’s. Liege ich da
richtig ? Und wenn ja… wie bestimme ich das Rauschen ?
bertachte den naechsten Wert. Evtl kannst du unter den
gefundenen „Peaks“ am Ende die vier groessten raussuchen.
Klar, das ist kein Thema.
Du musst natuerlich zunaechst mal genau wissen, was du finden willst. (Man kann in verrauschten Daten alles finden, was man will).
Was das Rauschen ist, das musst du normalerweise a priori wissen.
Du kannst datuerlich eine dynamische Adaptierung machen. Wenn du
z.B. weisst, dass hoechsten 4 peaks/sekunde reinkommen sollten,
dann kannst du das a solange erhoehen, bis diese Rate erreicht ist.
Wenn man z.B. davon ausgehen kann, dass das Rauschen eine hoehere „Freqenz“ hat, als deine Daten kannst du z.B. hingehen und
jeden Wert durch den Mittelwert von ±k umliegenden Werten ersetzen - dann verschwindet das „statistische“ Rauschen und du duertftest wieder saubere Maxima bekommen. Im Prinzip ist das dann
schon eine „diskrete Faltung“ womit wir uns einen boesartigen
Schritt auf mathematische Problemstellungen zubegwegt haetten
was du ja glaube ich vermeiden wolltest.
Einen aehnlichen Effekt kannst du mit einem Tiefpassfilter erzielen. Sollte dich das ganze so tief interessieren, gibt es
jede Menge wissenschaftliche Literatur zu stochastischen Signalen und Mustererkennung.
Also das werde ich versuchen! Ich glätte die Daten einfach so stark, daß kleine Peaks noch erkennbar sind und dann arbeite ich mit den geglätteten Daten weiter; mein Rauschen hat nämlich eine deutlich höhere Frequenz als die Peaks. Hier bin ich nur noch im Zweifel, wie ich bestimmen kann, wie weit zwei Peaks bei gegebener Glättung auseinanderliegen müssen, um sie noch trennen zu können.
Einen aehnlichen Effekt kannst du mit einem Tiefpassfilter
erzielen. Sollte dich das ganze so tief interessieren, gibt es
jede Menge wissenschaftliche Literatur zu stochastischen
Signalen und Mustererkennung.
Das interessiert mich schon tiefer, allerdings fehlt mir in vielen Gebieten die tiefere Vorkenntnis und ich habe leider nicht die Zeit und Muße für ein Zweitstudium Mathematik
Wenn du aber Literatur kennst, die auch ein Interessierter Laie (ich hatte Mathe LK und habe eine Naturwissenschaft studiert) verstehen kann, kannst du mir ja mal die Quellen sagen. Ich wills wenigstens versuchen!
Danke nochmal, du hast mir jetzt schon ganz schön weitergeholfen.
Wo kommen die Daten denn her? Je nach dem, welche genaue Form die Peaks haben, gibt es sehr effiziente Verfahren das Rauschen herauszufiltern. Wenn du die Daten was genauer beschreiben könntest, kann ich dir vermutlich helfen …
da deine Peaks sich deutlich vom Rauschen unterscheiden mache folgendes:
Bestimme den Mittelwert und die Standardabw. aller Daten.
Ziehe von allen Daten den Mittelwert und die 3fache Stdabw. ab
Setze Werte, die kleiner als Null sind gleich Null (nicht unbedingt noetig)
Glaette die Datenmenge indem du den jedem Feld den Durchschnitt aus sich selbst und den naechsten n Feldern zuordnest (n ist abhaengig von der zu erwartenden Peakbreite)
Zaehle nun die Wechsel im Datenfeld von Null (bzw negativen Werten wenn 3. nicht durchgefuehrt wurde) auf positive Werte. Dabei kannst du evtl. nach jedem Wechsel noch eine „Totzeit“ einbauen, dh ein Intervall in dem keine solche Wechsel gezaehlt werden. Damit unterbindest du restliche Rauscheffekte, erniedrigst aber auch die Grenzfrequenz
Anzahl der Wechsel Null nach pos = Anzahl Peaks
Das ganze verfahren kann auch Dynamisch durchgefuehrt werden, wenn du zB einen Datenstrom analysierst und dabei die letzten m Werte zur ermittlung des Rauschens (Mittelwert und Stdabw) heranziehst)
Danke für die Antwort. Ich habe das probiert…
…aber das konnte nicht klappen, weil die Peaks relativ breit sind und damit einen großen Anteil am Mittelwert und an der SD haben. Kleinere Peaks kann ich so nicht finden, sie verschwinden komplett unter der Null-Linie. Wenn du die Daten dazu mal haben möchtest, kann ich sie dir senden.
vergleiche den gleitenden Mittelwert der letzten 50 Messwerte mit dem gleitenden Mittelwert der letzten 5 Messwerte:
Q = MWn / MWm (zB n=5; m=50)
Wenn der Unterschied ein bestimmtes Mass (zB 1.1) uebersteigt bist du an der ansteigenden Flanke (bei 0.9 an der absteigenden)
Auch hier kannst du eine Totzeit einsetzen, zumal der Peak ja breit ist.
Der Vorteil mit gleitenden MWs zu arbeiten liegt darin, dass du auch bei veraenderlichem Rauschen noch brauchbare Ergebnisse erzielst.
n und m muessen natuerlich deiner Aufgabe angepasst werden. BTW: kannst du mir mal sagen, was das fuer eine Aufgabe ist (Neugier…)!