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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.