Laden...

Algorithmus zur Datenaufbereitung für Diagrammdarstellung

Erstellt von telnet vor 14 Jahren Letzter Beitrag vor 14 Jahren 3.611 Views
T
telnet Themenstarter:in
327 Beiträge seit 2006
vor 14 Jahren
Algorithmus zur Datenaufbereitung für Diagrammdarstellung

Hallo zusammen,

ich arbeite im Moment daran möglichst performant Daten grafisch darzustellen.
Ich will auf einer Fläche von 500x500 pixel einen Graphen darstellen, indem ich einfach jedem x-Wert einen y-Wert zuweise.

Problem ist, dass meine Datenbasis aus 50000 Werten besteht.

Kennt jemand einen Algorithmus, mit dem ich aus den 50000 Werten 500 Werte so auswählen kann, dass die resultierende Grafik möglichst nahe am Original ist ?

Ideen:

  • Originaldaten in 500 gleich große Intervalle aufteilen und jeweils den Mittelwert berechnen und verwenden
  • 100 gleich große Intervalle wählen und dabei den minimalen, maximalen Wert, den Start- und Endwert des Intervalls sowie den mit der größten Abweichung verwenden.

Gibts da evtl. Standardalgorithmen dafür, bei denen evtl. auch die Abweichung nachgewiesen ist? Oder andere Ideen ?

Danke, Grüße

Telnet

6.911 Beiträge seit 2009
vor 14 Jahren

Hallo,

möglich ist mit einer Clusteranalyse die Daten zu "komprimieren".
Am einfachsten dabei ist k-Means zu implementieren*.

* Andere Möglichkeiten wie Neuronales Gas konvergieren i.d.R. besser sind aber etwas aufwändiger zu implementieren und ohne Vorwissen etwas abstrakt zu implementieren. Wenn du aber eine Bibliothek findest die das anbietet nimm diese (meine bekommst du nicht 😉).

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

S
223 Beiträge seit 2006
vor 14 Jahren

evtl. könntest du die grafik auch vorberechnen, je nachdem wie oft sich die daten ändern.

2.891 Beiträge seit 2004
vor 14 Jahren

Hallo telnet,

ich denke, k-Means ist nicht das, was du suchst. Der würde dir eine Punktwolke in k Cluster aufteilen, aber das willst ja einfach nur einen skalierten Graphen malen.

Originaldaten in 500 gleich große Intervalle aufteilen und jeweils den Mittelwert berechnen und verwenden

Was stört dich denn genau? Dass es so viele Punkte sind (sind es aber gar nicht)? Hast du mal probiert, einfach die Punkte als PointF einzuzeichnen? Dann bekommst du alle 50k "an der korrekten stelle" rein. Den Rest übernimmt das Framework.

100 gleich große Intervalle wählen und dabei den minimalen, maximalen Wert, den Start- und Endwert des Intervalls sowie den mit der größten Abweichung verwenden.

Und dann willst du daraus einen Punkt bestimmen? Ich habe bei einem ähnlichen Problem den Mittelwert als Graphen gezeichnet und dann separat nochmal jeweils einen Graph für Minimum und Maximum (quasi als eine Art Steuband).

Gruß,
dN!3L

6.911 Beiträge seit 2009
vor 14 Jahren

Hallo dN!3L,

Kennt jemand einen Algorithmus, mit dem ich aus den 50000 Werten 500 Werte so auswählen kann, dass die resultierende Grafik möglichst nahe am Original ist ?

Das wäre doch Clustering/Vektorquantisierung, aber du hast recht dass die Datenmenge nicht so groß ist dass es Probleme mit der Leistung geben sollte.

Aber das muss telnet entscheiden...

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

T
telnet Themenstarter:in
327 Beiträge seit 2006
vor 14 Jahren

Hallo gfoidl und dN!3L,

erst mal vielen Dank für eure Hinweise.

An der Zusammenfassung mehrer Werte zu einem Mittelwert stört mich, dass dadurch Ausreisser weniger gut sichtbar sind. Die Daten die ich Anzeigen will/muss weisen teilweise einen extrem hohen Wert in genau einem Punkt auf. Daher denke ich ist ein Mittelwert wenig sinnvoll.

Im zweiten Verfahren würde ich aus den 5 Punkten nicht einen Punkt bestimmten, sondern pro Intervall 5 Punkte nehmen, um eben die Ausreisser besser sehen zu können. Das führt natürlich dazu, dass ich nur 1/5 der Anzahl an Intervallen habe als bei der ersten Methode.

Das Ganze zeichne ich übrigens nicht selber, sondern eine Charting-Komponente, die mir bei 50000 Werten aussteigt (CPU Auslastung 100%, keine Anzeige). Daher fällt die Möglichkeit mit FloatF weg.

Kommentare oder weitere Ideen dazu ?

Vielen Dank ....

6.911 Beiträge seit 2009
vor 14 Jahren

Hallo telnet,

einen Graphen darstellen, indem ich einfach jedem x-Wert einen y-Wert zuweise.

D.h. somit dass du eine Punktwolke hast und diese willst du auf weniger Punkte reduzieren. Die Bedingung ist dass die reduzierte Punktmenge gleich repräsentativ ist. Und dies ist meiner Ansicht nach genau der Anwendungsfall von Clustering. k-Means ist dabei das einfachste Verfahren wie dies durchgeführt werden kann. Mit Mittelwertbildung hat das nicht direkt zu tun. Daher verstehe ich

An der Zusammenfassung mehrer Werte zu einem Mittelwert stört mich nicht. Die Ausreißer - also ein Punkt (x|y) wird demnach einem anderen Cluster zugeordnet. Es hängt halt von der Wahl der Parameter des Verfahrens ab.

Es kann aber sein dass der Graph den du darstellen willst ein Linienplot ist und somit wäre das von mir vorgeschlagene nicht unbedingt der richtige Weg.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

2.891 Beiträge seit 2004
vor 14 Jahren

Hallo gfoidl,

D.h. somit dass du eine Punktwolke hast und diese willst du auf weniger Punkte reduzieren.

Nein, eben nicht (oder ich habe es falsch verstanden). Es geht darum, einen Graphen, der 50.000 "x-Werte breit ist", auf 500px Breite mit möglichst wenig Informationsverlust darzustellen. Angenommen, du misst jede Sekunde deine CPU-Auslastung und willst nun die Verlaufskurve für einen Tag (86.400 Werte) in einem Bild darstellen, dass 100px breit ist. Also musst du 864 Messwerte irgendwie auf einem Pixel Breite darstellen. Mittelwert bilden ist da ziemlich blöd, weil der ziemlich viel drüberbügelt (du siehst z.B. kurzzeitige 100%-Peaks nicht mehr).){gray}

Hallo telnet,

Die Daten die ich Anzeigen will/muss weisen teilweise einen extrem hohen Wert in genau einem Punkt auf. Daher denke ich ist ein Mittelwert wenig sinnvoll. Der Median ist weniger anfällig gegen extreme Ausreißer. (Aber ich meine herauszulesen, dass du generell gegen eine Aggregation bist(?)

Im zweiten Verfahren würde ich aus den 5 Punkten nicht einen Punkt bestimmten, sondern pro Intervall 5 Punkte nehmen, um eben die Ausreisser besser sehen zu können. Das führt natürlich dazu, dass ich nur 1/5 der Anzahl an Intervallen habe als bei der ersten Methode.

Hm, das leuchtet mir nicht ganz ein... Willst 50.000 Werte auf 500 Pixel runterskalieren. Dann kannst/musst du doch genauso 500 Intervalle von je 100 Werten bilden, die du dann auf die Breite von einem Pixel unterbringen musst - aber du hast ja noch 500px in der Höhe.
Genau sowas macht auch die Grafik, die ich oben angehängt habe - dort werden jeweils 12 Messwerte auf einen Pixel "verdichtet". Die rote Linie ist der Durchschnitt, drüber und drunter ist jeweils noch eine Linie, die Minimum/Maximum repräsentiert.

Wenn du sogar 100 Werte auf einen Pixel breite komprimieren "kannst", könntest du auch verschiedene Quantile (Q50/Median, Q25 & Q75, Q0/Minumum, Q100/Maximum, etc...) zeichnen (siehe z.B. Anhang), um noch zusätzliche Informationen über die generelle Streuung innerhalb des Intervalls darzustellen.

Willst du Ausreißer unbedingt irgendwie sichtbar machen (dann wären mehrere Kurven ratsam - Min,Max,Avererage/Median oder verschiedene Quantile; bzw. eine art Box-Whisker-Plot) oder willst du nur eine einzige Linie, die von einzelnen Ausreißern wenig/nicht beeinflusst wird (dann wäre der Median als Aggregat eine Lösung)?

Beste Grüße,
dN!3L

6.911 Beiträge seit 2009
vor 14 Jahren

Es geht darum, einen Graphen, der 50.000 "x-Werte breit ist", auf 500px Breite mit möglichst wenig Informationsverlust darzustellen.

Dass das die Aufgabe ist habe ich erst bemerkt als meine vorige Antwort schon fast fertig war. Das

indem ich einfach jedem x-Wert einen y-Wert zuweise.

stellt für mich eine Scatter-Plot dar und keine kontinuierliche Funktion.

Aber die Antwort von telnet lässt schließen dann deine Auffassung des Probles korrekt war. Insofern ist alles was ich vorgeschlagen habe für dieses Problem unpassend.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"