Probleme mit Varianzberechnung

Gast #484657
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

#485521
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...
Gast #485992
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)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren