Extremstellen aus Wertetabelle

Agassiz

Mitglied
Hi,
ich schreibe derzeit an nem App für mein Handy bei dem ich eine "Time between Peaks" Detection brauche. Nun habe ich eine ganze Menge Werte ( in 10 Sekunden ~ 400Werte ) welche eigentlich ausreichen um die extremstellen zu "berechnen".

Es geht im Grunde um Bewegungssensordaten.

Ich möchte so wenig rechenaufwand wie möglich, da ich bereits dinge wie standardabweichung etc berechne und ich ich nicht will, dass die berechnung sehr stört.

Allerdings finde ich keinen fertigen code im internet der dies ermöglicht und habe auch selbst keine idee dazu.

Habt ihr schon einmal an so etwas gearbeitet oder habt ideen, wie ich an die sache herangehen sollte?

Ich habe die graphen mal in openoffice calc geplotted. Damit ihr euch das auch ein bisschen bildlich vorstellen könnt.
blpqkuaaawz9nc23w.jpg
 
Zuletzt bearbeitet:
G

Gast2

Gast
Wenn du über die 400 Werte nichts weiter weißt wie z.B. irgendwelche Muster bleibt dir wohl nichts anders übrig als in einer Schleife alle Werte zu prüfen.
 

Agassiz

Mitglied
ja auf eine schleife und das durchlaufen aller werte wirds wohl hinauslaufen, aber wie genau sollte ich verfahren?

Denn ich kann nicht einfach schauen ob der nächste wert einfach größer oder kleiner als mein aktueller ist und den nehmen, dann bekomme ich doch auch die "kleinen" extremstellen mit.

oder sollte ich beim ersten durchlauf die gefundenen extremstellen speichern,
dann auf den gespeicherten werten wieder einen oder mehrere durchläufe machen?
 
Zuletzt bearbeitet:
G

Gast2

Gast
Welche Extremstellen willst du? Alle?

Dann musst du das machen wie früher in der Schule gelernt. Du hast dann ein lokales Maximum wenn das Vorzeichen der Steigung von + nach - wechselt ;)
 
G

Gast2

Gast
Ganz naiv, geht bestimmt auch viel eleganter, ausserdem werden gleichwertige Y werte nicht berücksichtigt:
Java:
public class Extremstellen {

	private static int[] werte = new int[] { 1, 2, 3, 5, 2, 3, 7, 20, 16, 9,
			17, 8, 3, 2, 1, 5, 7, 9, 12 };

	public static void main(String[] args) {
		List<Integer> maximums = new ArrayList<Integer>();
		// exception for i = 0
		int firstY = werte[0];
		int secondY = werte[1];
		if (firstY > secondY) {
			maximums.add(firstY);
		} 

		for (int i = 1; i < werte.length-1; i++) {	
			int y = werte[i];
			int preY = werte[i-1];
			int postY = werte[i+1];
			if (y > preY && y > postY) {
				maximums.add(y);
			} 
		}
		
		// exception for i = werte.length
		int lastY = werte[werte.length-1];
		int preLastY = werte[werte.length-2];
		if (lastY > preLastY) {
			maximums.add(lastY);
		} 
		for (Integer y : maximums) {
			System.out.println(y);
		}
	}
}

Ah - ich lese grade du willst nicht alle. Was klassifiziert denn eine Extremstelle die dich interessiert?
 
Zuletzt bearbeitet von einem Moderator:

Agassiz

Mitglied
die zeit zwischen 2 maxima oder minima ist lediglich _eine_ eigenschaft von mehreren, die verwendet wird um später dinge wie sitzen, gehen oder laufen zu klassifizieren. dachte mir ich schmeiße ein paar eigenschaften in eine SOM oder SVM und schaue was passiert :)

aber ist mein weg den ich oben angedeutet habe (mehrere durchläufe) ansatzweise erfolgversprechend oder habe ich bestimmte eventualitäten nicht berücksichtigt?


:::edit:::

ein anderer ansatz wäre vielleicht, dass ich globales maxima MINUS globales minima rechne und den dadurch erhaltenen bereich in sagen wir 5 oder 7 zonen einteilen.

dadurch sind ja die "berggipfel" und "täler" alle abgeschnitten und zwischen ihnen ist sind immer 0-werte so lassen sich die maxima und minima genauer bestimmen und ich habe auch weniger punkte zu analysieren. wenn ich einen zu großen 0-Bereich habe, teile ich den bereich in nur 5 zonen, damit ich auf der y-achse einen größeren bereich habe - dort sollten dann mehr werte hineinfallen.

ist das nachvollziehbar?
 
Zuletzt bearbeitet:
G

Gast2

Gast
aber ist mein weg den ich oben angedeutet habe (mehrere durchläufe) ansatzweise erfolgversprechend oder habe ich bestimmte eventualitäten nicht berücksichtigt?

Hmmm - du musst halt wirklich definieren welche Kriterien ein Extemwert erfüllt den du beobachten willst. Evtl wäre es schon mal eine Möglichkeit den Graphen einfach zu "flatten"
Java:
for(int i =0; i < werte.lenght; i++){
 if(werte[i] > threshold){
   werte[i] = 1; 
 } else {
   werte[i] = 0;
 }
}

EDIT: Ja, dein Ansatz den Graphen zu vereinfachen klingt ganz gut. Geht ja auch in die Richtung wie ich es angerissen hab.

In deinem Beispielgraph z.B. threshold für grün = 7 würde schon einige potentielle Stellen hervorheben.
 

Marco13

Top Contributor
Ähm. Grob geschätzt gibt es bei jeder der obigen Kurven ca. 150 Extrama. Zumindest wenn man jedes noch so kleine "Zittern" berücksichtigen will. Ansonsten müßte man wohl erstmal irgendeine Glättung drüberlaufen lassen oder so...

Deswegen nochmal die Frage: Welche Extremstellen willst du?
 

Agassiz

Mitglied
also ich will nur die "echten" extrema - nicht die von dem "zittern"

wie kann ich die funktion denn glätten? gibts da schon codeschnipsel oder so?
 

Marco13

Top Contributor
Die Nachfrage zielte eigentlich auf eine genauere Definition ab, was denn eine Extremstelle sein soll. Wenn die Werte zwischen -10 und +15 liegen, soll dann eine Wertabfolge wie
10 11 10
als ein Extremum gelten? Und eine Folge von
10 10.1 10 (Zittern)?
Oder erst sowas wie
10 15 10
?

Zum Glätten: Das einfachste ist, jeden Wert x durch
[c] (x[i-1] + x + x[i+1]) / 3.0[/c]
zu ersetzen. Größere Radien oder ausgefeiltere Verfahren sind natürlich immer möglich.

EDIT: Tiefpassfilter wäre doch was :D
 

JanHH

Top Contributor
Wir Menschen sind in der Lage, mit blossem Auge "echte" Extremstellen zu erkennen. Das ist einem Computer so ohne weiteres nicht möglich. Zumal es in diesem Fall auch keine wissenschaftlich exakte Definition ist, was eine echte Extremstelle überhaupt ist. Im Grunde ist es eine hochkomplizierte Aufgabenstellung. Vielleicht hilft was in der Art:

- potenzielle Extremstelle ist eine Stelle, wo die Steigung ihr Vorzeichen ähdert
- aber nur dann, wenn zwischen dem Wert an dieser Stelle und dem der letzten Extremstelle mindestens eine bestimmte Differenz besteht

das trifft es auch noch nicht 100%ig, aber vielleicht kann man sich dem so nähern?
 

JanHH

Top Contributor
Nachtrag: Wissenschaftlich betrachtet handelt es sich um eine numerische Problemstellung. Vielleicht solltest Du mal danach suchen.. numerische Verfahren, um Extremwerte in Kurven zu bestimmen. Dazu muss man evtl. erstmal die Gleichung der Kurve selber bestimmen, hierfür gibts Interpolationsverfahren, entweder mit Polynomen oder mit Splines..

Also, es ist keine einfache Aufgabe, aber es geht, ganz sicher ;-).
 

Agassiz

Mitglied
ja, an interpolation und so hab ich schon gedacht, aber ich denke, das wäre zu viel rechenaufwand relativ zum nutzen der eigenschaft - scheint so, als werd ich das feature wohl rauslassen, da ich mir ein paar paper zu dem thema situationserkennung etc durchgelesen habe und manche das nicht benutzen weil sie keinen sinn darin sehen und wiederum andere berechnen es heuristisch nach eigenen überlegungen und es kann passieren dass da gar nix rauskommt usw - also relativ schwammig alles iwie...

vielen Dank für eure hilfe. :)
 

Ähnliche Java Themen

Neue Themen


Oben