tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
4
ZUGRIFFE
599
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    sim26 sim26 ist offline Mitglied Bronze
    Registriert seit
    Mar 2006
    Beiträge
    37
    Hallo alle,

    ich will „variance“ rechnen, aber mein Problem ist, daß nur die letzte wert von dem
    Arrayliste genommen werde


    Für „sum“ und „mean“ kriege ich die richtige werte

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
                                          ArrayList list = new ArrayList();
                          double sum=0.0;
                          double mean=0.0;
                                         double variance=0.0;
                          Iterator iterator=list.iterator();
                          Iterator iteratore=list.iterator();
                            
                           while(iterator.hasNext()){
                            
                              sum += ((Double)iterator.next()).doubleValue();
                              mean = (sum / list.size());
     
                           }
                          
                           while(iteratore.hasNext()) {
               variance=Math.pow(((Double)iterator.next()).doubleValue()-mean,2); 
                              
                              
                              
                           }


    Danke
     

  2. #2
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo!

    Bei der Varianz werden die die quadrierten Abstände der Werte zum Durchschnitt aufaddiert und werden dann noch mit 1/n multipliziert...

    Schau mal hier:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    
    /**
     * 
     */
    package de.tutorials;
     
    import java.util.Arrays;
     
    /**
     * @author Thomas.Darimont
     * 
     */
    public class StatisticsExample {
     
        /**
         * @param args
         */
        public static void main(String[] args) {
            double[] values = { 8952.00, 8883.30, 7539.10, 7842.60 };
            double average = calcAverage(values);
            System.out.println("Values: " + Arrays.toString(values));
            System.out.println("Average: " + average);
            System.out.println("Variance: " + calcVariance(values,average));
            System.out.println("Median: " + calcMedian(values));
        }
     
        private static double calcMedian(double[] values) {
            // Median bei geraden n
            // Mittelwert der beiden "mittleren" Werte
            // (data[n/2] + data[n/2+1]) / 2
            double median = 0.0;
            if (values.length % 2 == 0) {
                median = (values[(values.length-1)/2] + values[(values.length-1)/2 + 1])/2;
            } else {
            // Median bei ungeradem n
            // data[(n+1)/2]
                median = values[values.length/2];
            }
            return median;
        }
     
        private static double calcVariance(double[] values,double average) {
            /*                  _n
             *  v^2 = 1/n * \    (data[i] - average)^2
             *                  /_i=1
             * 
             */
            double variance = 0.0;
            for (int i = 0; i < values.length; i++) {
                variance += Math.pow(values[i] - average, 2);
            }
            variance *= 1.0 / values.length;
            return variance;
        }
     
        private static double calcAverage(double[] values) {
            /*           
             *           _n
             * a = 1/n * \      data[i]
             *           /_i = 0
             * 
             */
            double average = 0.0;
            for (int i = 0; i < values.length; i++) {
                average += values[i];
            }
            average /= values.length;
            return average;
        }
    }

    Ausgabe:
    Code :
    1
    2
    3
    4
    
    Values: [8952.0, 8883.3, 7539.1, 7842.6]
    Average: 8304.25
    Variance: 388363.5524999996
    Median: 8211.2

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  3. #3
    sim26 sim26 ist offline Mitglied Bronze
    Registriert seit
    Mar 2006
    Beiträge
    37
    Danke für die schnelle Antworte.

    Das problem ist, ich habe ein Arraylist (deswegen musste ich iterator benutzen) und in mein programme functioniert schon nur beim Variance rechnen habe ich was falsche mehr oder weniger geschriben.........

    danke
     

  4. #4
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo!

    ich wollte dir nur damit deutlich machen dass du die Varianz "falsch" berechnest...

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  5. #5
    dorfdepp dorfdepp ist offline Grünschnabel
    Registriert seit
    Aug 2006
    Beiträge
    3
    Hi sim!

    Dein Code stimmt hinten und vorne nicht.

    (1) Du teiltst ungehemmt durch die Länge leerer Listen.

    (2) while(iteratore.hasNext()) {
    variance=Math.pow(((Double)iterator.next()).doubleValue()-mean,2);

    iterator <> iteratore

    Eigentlich hätte Dein Code gar nicht laufen können.

    (3) mean = (sum / list.size());

    Komisch ist auch, dass der Mittelwert ständig neu berechnet wird. Da die letzte Berechnung aber stimmt, funktioniert das so. Eigentlich gehört die Mittelwertberechnung aber nicht in den Iterator.


    (4) Die Varianz ist der Durchschnitt der Summe der Abweichungsquadrate. Bei Dir wird gar nicht die Summe berechnet.

    Die beiden wesentlichen Fehler (2) und (4) korrigiert und der ArrayList ein paar Werte spendiert. Dann wird aus Deiner Fassung folgendes:

    ArrayList list = new ArrayList();
    list.add(new Double(2.0));
    list.add(new Double(3.0));
    list.add(new Double(7.0));

    double sum=0.0;
    double mean=0.0;
    double variance=0.0;
    Iterator iterator=list.iterator();
    Iterator iteratore=list.iterator();

    while(iterator.hasNext()){

    sum += ((Double)iterator.next()).doubleValue();
    mean = (sum / list.size());

    }

    while(iteratore.hasNext()) {

    variance= variance + Math.pow(((Double)iteratore.next()).doubleValue()-mean,2);

    }

    variance = variance / list.size();


    System.out.println("Summe="+sum);
    System.out.println("Mean ="+mean);
    System.out.println("Var ="+variance);




    Ausgabe:
    Summe=12.0
    Mean = 4.0
    Var = 4.666666667

    Probe: Var = 1/3*{ (2-4)^2+(3-4)^2+(7-4)^2 }
    = 1/3*{ 4 + 1 + 9 }
    für die Varianz: 14/3 =4.6666667


    Grüsse vom Dorfdepp
     

Ähnliche Themen

  1. Vektor mit Iterator durchlaufen
    Von lgorse im Forum C/C++
    Antworten: 2
    Letzter Beitrag: 03.09.10, 20:43
  2. XPresso Iterator
    Von axn im Forum Cinema 4D
    Antworten: 2
    Letzter Beitrag: 26.03.10, 21:58
  3. Matrix & Iterator
    Von schickano im Forum C/C++
    Antworten: 3
    Letzter Beitrag: 09.01.10, 15:13
  4. Antworten: 15
    Letzter Beitrag: 10.11.08, 14:33
  5. Iterator - Fehler
    Von Der Held im Forum Java
    Antworten: 9
    Letzter Beitrag: 20.10.05, 22:33