Forum: PC-Programmierung Probleme mit Varianzberechnung


von Dieter B. (Gast)


Lesenswert?

Hallo, ich bin am Verzweifeln:

Könnt ihr mal schnell nachschauen, ob ich die Varianz mit dieser 
Funktion
richtig berechne?

Die Formel für die Varianz ist laut Wikipedia:

E(x^2) - (E(x))^2
http://de.wikipedia.org/wiki/Varianz


Dummerweise liefert meine Funktion bei einer Messwertvektorgröße von n 
lediglich 1/n von dem, was die OpenCV - cvCalculateCovarianceMatrix - 
Funktion für das entsprechende Diagonalelement zurückgibt...

Ich bin echt am verzweifeln, denn ich finde meinen Fehler nicht.

Könnt ihr vielleicht mal kurz darüberschauen?




Hier meine Funktion:

// Funktion Variance berechnet die Varianz der Messwerte im Vektor
pSample
// FloatMatrix: int rows       -Anzahl der Zeihlen
                 int columns   -Anzahl der Spalten
                  float* data  -Array der Größe rows*columns
 double Variance ( FloatMatrix* pSample){

        if ( pSample->columns !=1){
      printf( "Error, pSample should have only 1 column - because I need 
a VECTOR of samples");
    return -1;
  }

  double mean_x = 0;  //E(x)

  double xSquared = 0; //E(x^2)
  for ( int i = 0; i < pSample->rows; i ++){
    xSquared += (pSample->data[i] * pSample->data[i]);
    mean_x += pSample->data[i];
  }
  double mean_xs = xSquared / pSample->rows;
  mean_x = mean_x/ pSample->rows;

  double var  =  mean_xs - (mean_x * mean_x);

        return var;
}

 Zahlenbeispiel:

Meine Messreihe (n = 10):

5.00 33.00
15.00 35.00
21.00 24.00
29.00 21.00
31.00 27.00
43.00 16.00
49.00 18.00
51.00 10.00
61.00 4.00
65.00 12.00

Kovarianzmatrix mit OpenCV:

3600.00 -1656.00
-1656.00 900.00


Test mit meiner Varianzfunktion

Vektor pSample wird mit der linken Spalte der Messreihmatrix gefüllt


Varianz:

360.00

Warum???

Danke für eure Hilfe


von Statistiker (Gast)


Lesenswert?

Warum?? Weil 3600/10=360. Glückwunsch!

von Dieter B. (Gast)


Lesenswert?

Kannst du mir das bitte genau erklären? Formelmäßig?

Ich dachte, dass die Diagonalelemente die Varianz darstellen!

von Thomas W. (xote)


Lesenswert?

>Könnt ihr mal schnell nachschauen, ob ich
>die Varianz mit dieser Funktion richtig berechne?

Erinne mich dunkel daran, dass die Varianz die Standardabweichung zum 
Quadrat ist. Aber: Suchst du jetzt die richtige Formel für die Varianz 
oder die Kovarianz? Das sehe ich da jetzt nicht so ganz raus...

von detlef _a (Gast)


Lesenswert?

Ich weiß nicht, was OpenCV ist und was es ausgibt. Ich weiß aber, daß 
die Varianz der linken Spalte der Meßwerte 360 ist, das hast Du ganz 
richtig berechnet.

Cheers
detlef

von Dieter B. (Gast)


Lesenswert?

Die OpenCV ist eine Bibliothek zur Bildbearbeitung optimiert für Intel - 
Prozessoren.

Es gibt Datenstrukturen für Bilder, Matrizen und Vektoren in 
verschiedenen Formaten und die entsprechenden Operationen darauf.

In ihr ist auch die Berechnung der Kovarianzmatrix implementiert.

Ich möchte nun die Varianzen  aller Elemente eines Messvektors berechnen

Die Kovarianzmatrix ( E ( sum (( X - E(X) )*  (X -E(X)) ^t)   (X ist in 
diesem Fall der Messvektor) ist folgendermaßen definiert:

auf der Diagonale befinden sich die Varianzen der einzelnen 
Vektorelemente

auf den Nichtdiagonalstellen i,j befinden sich die Kovarianzen Cov( X_i, 
X_j)

Deswegen bin ich verunsichert. Ich traue mich auch nicht, die 
Kovarianzmatrix einfach noch durch n zu teilen, da ich nicht genau weiß, 
was ich dadurch falsch mache.


@Thomas: Ja, Varianz ist die Standardabweichung ins Quadrat.


Noch etwas worauf ich gestoßen bin:

Wenn man die Varianz einer Messreihe berechnen will, so lautet die 
Formel_

1/(n-1)  sum ( x- E(x)) ^2, will man die Varianz einer Verteilung mit 
bekanntem Mittelwert berechnen, so lautet die Formel 1/n  sum (x 
-E(x))^2...


(die spinnen die Statistiker)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.