iterator problem

sim26

Mitglied
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:
                                      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
 
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:
Java:
/**
 * 
 */
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:
Values: [8952.0, 8883.3, 7539.1, 7842.6]
Average: 8304.25
Variance: 388363.5524999996
Median: 8211.2

Gruß Tom
 
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
 
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
 
Zurück