Standartabweichung, was mache ich falsch?



  • Hallo, ich habe für mehrere größere Funktionen zwei Algorhythmen zu Berechung des Mittelwertes/ der Standartabweichung geschrieben.

    #include <iostream> 
    #include <cmath> 
    
    using namespace std;
    
    double stdd(const double* values, const double& size, const double& mean){
    
    	double result=0;
    
    	for(int j=0; j < size; j++){ 
    
    		result+= pow((values[j]-mean),2) ;			
    
    	}
    
    	result=result/size; 
    
    	result=sqrt(result);	                
    
    	return result;
    
    }
    
    double mean(const double* values, const double& size){
    
    	double result=0;
    
    	for(int j=0; j < size; j++){ 
    
    		result+=values[j];
    
    	}
    
    	result=result/size;
    
    	return result;
    
    }
    
    int main(){
    
    double array1[]={1,4,7,2,6,7,5,5,1,2,3,5,7,8,4,6,3,5,8,0,8};	
    double* p1=&array1[0];
    
    double mean1=mean(p1,21);
    
    cout << mean1 << endl;
    
    double std1=stdd(p1,21,mean1);
    
    cout << std1 << endl;
    
    }
    

    Leider stimmt irgendetwas mit der berechneten Standartabweichung nicht. Wenn ich die Werte für das obige Array manuell nachrechne, erhalte ich für
    mean1=4.6190;
    std1=2.41968;

    Begehe ich irgendwo einen Rundungsfehler, dadurch dass ich 'float' als variablentypen gewählt habe?

    Vielen Dank im Voraus!



  • Du scheinst ein wenig verwirrt zu sein. Zum einen programmierst du C++ und gar kein ANSI C. Andererseits nimmst du doch kein float, sondern double. Und dann ist der Code total schrecklich formatiert (warum diese ganzen extra Leerzeilen?) Und dann ist die Länge doch gar keine Fließkommazahl, warum nimmst du also double (und dann noch unnötigerweise als const-reference?) und nicht size_t.

    Bei mir kommen die Werte
    4.61905
    2.41968
    raus



  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum ANSI C in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Ich danke vielmals für Deine Hilfsbereitschaft, Rüdiger! 😉
    In der Tat bin ich verwirrt, den Matlab gibt für selbige Werte nämlich
    mean=4.6190
    std=2.4794 aus.
    Da dieses Programm intern auch mit double-arrays rechnet, frage ich mich, was hier falsch läuft? Ist Matlab hier nicht korrekt oder begehe ich einen Denkfehler?



  • Die Varianz ist definiert als

    1n1i=1n(xix¯)2\frac{1}{n-1}\cdot\sum\limits_{i=1}^n{(x_i - \bar{x})^2}

    Und die Standardabweichung als Wurzel davon. Dieses n-1 ist wesentlich.



  • Es sieht immer besser aus, wenn man die Begriffe des eigenen Tätigkeitsumfeldes richtig schreibt:
    http://de.wiktionary.org/wiki/Algorithmus
    http://de.wiktionary.org/wiki/Standard

    Zum Programm:
    Mit cout.precision(16); kommt bei mir

    4.619047619047619
    2.419684955411905

    raus. Evtl. musst Du bei Matlab mal die Anzahl der Nachkommastellen erhöhen. Mit Matlab kenne ich mich aber nicht aus.

    @nexus: Laut wikipedia werden sowohl n-1 als auch n im Nenner verwendet:
    http://de.wikipedia.org/wiki/Empirische_Varianz


Anmelden zum Antworten