Laden...

Ausreißer aus Punktwolke elemenieren

Erstellt von acid0000 vor 16 Jahren Letzter Beitrag vor 16 Jahren 4.231 Views
Thema geschlossen
A
acid0000 Themenstarter:in
3 Beiträge seit 2008
vor 16 Jahren
Ausreißer aus Punktwolke elemenieren

hallo,

ich habe eine datei (txt) mit mehreren tausend punkten die wie folgt aufgebaut

ist:

x y z
22323,83 443453,25 7,93
23356,21 342173,25 8,12

usw..

(die abstände sind tabs in dem file - keine leerzeichen)
so diese datei möchte ich so effizient wie möglich einlesen. da sie sehr gross
ist dauert es leider mit dem streamreader was ich kenn sehr lange 🙁
da kommen wir auch schon zu meiner ersten frage:

  • weiss jemand eine effiziente Lösung um ziemlich große dateien einlesen zu

können ? (100000 zeilen und mehr)
dabei ist mir vorallem die letzte Spalte (z) wichtig, denn eigentlich brauch ich
zum auswerten nur diese. wo wir auch schon bei meiner 2. frage wären:

  • gibt es eine möglichkeit genau nur diese spalte auszuwerten ?

im endeffekt sollen nämlich die werte in ein neues file geschrieben werden,
jedoch befreit von ausreißern aber wieder in der x y z form (die x und y werte
werden und sollen auch nicht berührt werden).

meine dritte und letzte frage lautet ob jemand eine idee hat wie ich am besten

die ausreißer eleminiere und woran ich das festmach. ich dachte da so als erstes
an mitelwert, standartabweichung und median (wobei ich auch noch nicht weiss wie
man diesen programmiertechnisch bestimmt 🙁 )
evtl mit min max arbeiten, aber wie setze ich da am besten die grenzen ?
die ausgabe datei sollte im endeffekt die gleichen konventionen besitzen (also tabulator und kommata, txt usw)

zusammengefasst:

  1. effiziente möglichkeit zum einlesen großer dateien
  2. direkt eine gewisse spalte auswerten
  3. ausreißer eleminieren nach einem bestimmten algorithmus

vielleicht hat jemand von euch einen rat, snippet oder pseudocode parat der eines
oder am besten alle probleme lösen kann.

das wäre super. danke im vorraus! 🙂

S
18 Beiträge seit 2007
vor 16 Jahren

zu 3.:
ausreißer eleminieren nach einem bestimmten algorithmus

den ausreißertest hab ich als projektarbeit in meiner abschlussprüfung abgearbeitet.
leider sind die sourcen in c++ und beziehen sich auf andere bibliotheken (dll's).
es gibt aber zwei algorythmen

zum einen der test nach grubs
http://de.wikipedia.org/wiki/Ausrei%C3%9Fertest_nach_Grubbs
und die stichprobenwölbung
http://www.qmbalance.com/pages/pdf/PROCONT4.PDF
(mal schnell gegoogled)

auf jedenfall benötigst du

  • den minimalwert
  • den maximalwert
  • den arithmetischen mittelwert
  • und die standartabweichung der probe
    (die formeln sollten dir ja bekannt sein)

hab damals (2002) 'ne glatte 1 für die implementierung und doku bekommen.
schau dir mal die links an.
könnte gegebenenfalls die c++-sourcen posten.

184 Beiträge seit 2005
vor 16 Jahren

Spricht etwas dagegen mit Datenbanken zu arbeiten? Die können alles das was du brauchst und ich könnte mir vorstellen, dass dein Vorhaben damit sehr viel leichter und unkomplizierter zu lösen sein müsste!

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo acid0000,

  1. effiziente möglichkeit zum einlesen großer dateien
  2. direkt eine gewisse spalte auswerten
  3. ausreißer eleminieren nach einem bestimmten algorithmus

beachte für zukünftige Fragen bitte [Hinweis] Wie poste ich richtig? Punkt 1.2.

herbivore

A
acid0000 Themenstarter:in
3 Beiträge seit 2008
vor 16 Jahren

@skinny danke für die tipps, wenn du die source als unterstützung posten könntest wäre klassen. (vielleicht auch mit der doku zum nachvollziehen)

ich hatte eine zeitlang mit dem RANSAC Algorithmus geliebäugelt aber ich glaub das haut bei meinem Problem nicht so hin.

@Seyyedi
das mit der Datenbank klingt gut, vorallem würde es mir so das einlesen vereinfachen und ich könnte so direkt über abfragen arbeiten. ansich bietet es sich ja an da ich die datei aus einem shapefile ja exportiere also da ja eh eine tabelle habe. mal sehen wie sich das bewerkstelligen ließe. jedoch soll das programm nicht nur dieses eine "file" verarbeiten und die ausreißer bestimmen sondern auch funktionieren wenn ich eine neue datei mit xyz werten habe.

bzw wenn es nicht über die db geht, wie kann ich dann genau die spalte z ansprechen? ich dachte da vielleicht an auf tabulator testen mit ( \t ) ?? obwohl ich auch noch nicht weiss wie.

J
3.331 Beiträge seit 2006
vor 16 Jahren

Bitte beachte außerdem Wie poste ich richtig? Punkt 2

Zum Einlesen und Verarbeiten der Datei siehe meine Hinweise unter Entwickler-Forum

Jürgen

S
18 Beiträge seit 2007
vor 16 Jahren

hab die c++-source gefunden. musst nur die funktionen für minimal- und maximalwert, arithmetischen Mittelwert und Standardabweichung der Stichprobe hinzufügen.

ich hoffe das hilft dir weiter.
(steckt etwas viel zeigerarithmetik drin aber ich denke das sollte sich trotzdem leicht nach C# bringen lassen - ist ja ansich nichts weiter als mathe)

mfg
skinny

A
acid0000 Themenstarter:in
3 Beiträge seit 2008
vor 16 Jahren

danke @skinny ich werd mir das mal anschauen. aber rein zum verständnis, will es ja allein hinbekommen.

was ich bis jetzt endlich hinbekommen habe, ist die z spalte entsprechend zu selektieren wobei aber leider das einlesen ewig dauert 🙁

eine andere möglichkeit die ich geschafft hab ist über einen von mir selbst geschriebenen editor, jedoch weiss ich da nun nicht wie ich den z wert dort allein ermitteln kann.

bei der 1. variante habe ich einfach in ein array eingelesen wo dann mein array[0] der x wert, array[1] der y wert und array[2] der z wert ist. das ließe sich dann leicht weiter verarbeiten.

bei der 2. variante habe ich halt alles in der textbox ausgeben lassen, wo das einlesen auch recht schnell geht (jedoch nur bis files unter 100mb, danach ist der speicher überlaufen 🙁 )
jetzt weiss ich nur nicht ob ich das auch bei der textbox so gestalten kann das ich entsprechend nur die z spalte weiter verarbeiten kann.

der editor is simpel aufgebaut:

  • ein menü mit laden/save und quit und ein menüelement für die berechnungen (noch ohne funktion)
49.485 Beiträge seit 2005
vor 16 Jahren
Thema geschlossen