DMUG-Archiv 2011

Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

AW: Numerischer Fehler

Hallo Udo,
Zuerst besten Dank für diese sehr ausführliche Hilfe! Ich werde aber noch
ein paar Stunden investieren, um zu verstehen was da genau abgeht, da
einiges komplett neu ist für mich. Ich hoffe dies heute Abend machen zu
können.

Grues stefan

-----Ursprüngliche Nachricht-----
Von: Udo und Susanne Krause [mailto:su.krause@XXXXXXX.ch] 
Gesendet: Sonntag, 20. März 2011 14:19
An: Stefan Fuhrer; Markus van Almsick
Cc: demug@XXXXXXX.ch
Betreff: Re: Numerischer Fehler

Hoi mitenand,

> könnte es sein, dass data= Round[data,10^(-6)] Dein Problem löst?!

das ist so, aber dadurch ist jeder data-Wert gerundet, d.h. verändert.  
Hier ist eine Funktion fuhrerIdentify[]

In[142]:= Clear[fuhrerIdentify, partEuclid]
partEuclid[v1_?VectorQ, v2_?VectorQ] :=
   Norm[Most[v1] - Most[v2]] /; Length[v1] == Length[v2];
fuhrerIdentify::tuples =
   "Parameter t = `1`, but only `2` elements present!";
fuhrerIdentify::mod =
   "You can not identify exactly `1`-tuples from the data!";
fuhrerIdentify::res =
   "There will be `1` `2`-tuple(s) and one `3`-tuple in the result.";
fuhrerIdentify[d_ (* data *),
   t_Integer?Positive (* tuple size *),
   verB_: False (* verbose *)] :=
  Module[{r = Flatten[d, 1], rt = 0, rL = 0, t0 = t, rW = {}, x = {}},
    (* prepare *)
    rL = Length[r];
    r = Flatten /@ Transpose[{r, Range[rL]}];
    rW = r;
    (* check *)
    If[t > rL,
     Message[fuhrerIdentify::tuples, t, rL];
     t0 = rL
     ];
    If[Mod[rL, t0] != 0,
     Message[fuhrerIdentify::mod, t0];
     Message[fuhrerIdentify::res, Floor[rL/t0], t0, Mod[rL, t0]]
     ];
    (* work *)
    While[t0 > 1 && Length[rW] > 0,
     x = Nearest[rW, rW[[1]], t0, DistanceFunction -> partEuclid];
     rW = Complement[rW, x];
     (* First[x] === rW[[1]] *)
     r = r /. Thread[Rule[Rest[x], Table[First[x], {Length[x] - 1}]]];
     rt = Max[rt, partEuclid[Last[x], First[x]]]
     ];
    (* report *)
    If[TrueQ[verB],
     If[t0 > 1,
      Print["Trennschärfe = ", rt],
      Print["Trennschärfe > ", rt]
      ];
     Print["Identifications: ",
      Rule @@@ Transpose[{Range[rL], Last /@ r}]]
     ];
    Partition[Most /@ r, Most[Rest[Dimensions[d]]]]
    ] /; ArrayQ[d, _, NumericQ] && ArrayDepth[d] > 1

die in einer Datenmenge auf dem vorletzten Niveau Tupel identifiziert,  
fakultativ über die grösste verwendete Rundung berichtet und die  
Ersetzungen auflistet. fuhrerIdentify[] gibt kein eindeutiges Resultat.


In[149]:= fuhrerIdentify[data, 3, True];

Trennschärfe = 0.24858

Identifications:  
{1->1,2->33,3->27,4->36,5->11,6->38,7->9,8->33,9->9,10->38,11->11,12->36,13-
>13,14->13,15->15,16->15,17->17,18->17,19->19,20->19,21->21,22->21,23->24,24
->24,25->46,26->45,27->27,28->45,29->29,30->29,31->31,32->31,33->33,34->9,35
->27,36->36,37->11,38->38,39->19,40->17,41->15,42->31,43->13,44->21,45->45,4
6->46,47->72,48->46,49->63,50->29,51->63,52->64,53->1,54->1,55->24,56->56,57
->72,58->69,59->59,60->59,61->56,62->56,63->63,64->64,65->66,66->66,67->66,6
8->59,69->69,70->64,71->69,72->72}

Proben:

In[152]:= With[{t = 12},
  (* nur bei Teilbarkeit kann die leere Liste herauskommen *)
  Cases[Tally[Flatten[fuhrerIdentify[data, t], 1]],
   Except[{{_, _, _}, t}]]
  ]

Out[152]= {}

und der corpus delicti:

In[153]:= fuhrerIdentify[data, 2, True];

Trennschärfe = 2.22045*10^-16

Identifications:  
{1->1,2->2,3->3,4->4,5->5,6->6,7->7,8->2,9->9,10->6,11->11,12->4,13->13,14->
14,15->15,16->16,17->17,18->18,19->16,20->20,21->18,22->22,23->23,24->14,25-
>25,26->26,27->27,28->26,29->29,30->30,31->30,32->32,33->7,34->9,35->27,36->
3,37->11,38->5,39->20,40->17,41->15,42->32,43->13,44->22,45->25,46->46,47->4
7,48->46,49->49,50->29,51->49,52->52,53->1,54->54,55->23,56->56,57->47,58->5
8,59->54,60->60,61->56,62->62,63->52,64->64,65->65,66->62,67->65,68->60,69->
69,70->64,71->69,72->58}

10^(-6) wäre also recht grob gerundet und zum Schluss der Graph:


Clear[dataneu, pointsneu, gneu]
dataneu = fuhrerIdentify[data, 2];
pointsneu = Map[ToExpression, dataneu, {2}];
gneu = Sort[Apply[UndirectedEdge, pointsneu, {1}]];
Graph[gneu]

Gruss
Udo.



Antworten:
Verweise:
Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

DMUG DMUG-Archiv, http://www.mathematica.ch/archiv.html