Die Berechnung der Standardabweichung der Winkel?
So, ich bin auf eine Anwendung, die Kompass-Winkel (in Grad). Ich habe es geschafft, um zu bestimmen, die Berechnung des Mittelwerts der Winkel, durch den folgenden (gefunden bei http://en.wikipedia.org/wiki/Directional_statistics#The_fundamental_difference_between_linear_and_circular_statistics) :
double calcMean(ArrayList<Double> angles){
double sin = 0;
double cos = 0;
for(int i = 0; i < angles.size(); i++){
sin += Math.sin(angles.get(i) * (Math.PI/180.0));
cos += Math.cos(angles.get(i) * (Math.PI/180.0));
}
sin /= angles.size();
cos /= angles.size();
double result =Math.atan2(sin,cos)*(180/Math.PI);
if(cos > 0 && sin < 0) result += 360;
else if(cos < 0) result += 180;
return result;
}
Also ich bekomme meine mittlere/Durchschnittliche Werte korrekt, aber ich bekomme keine richtige Varianz/stddev Werte. Ich bin mir ziemlich sicher, ich werde Berechnung meine Varianz falsch, aber kann nicht denken, der eine richtige Weg, es zu tun.
Hier ist, wie ich bin, Berechnung der Varianz:
double calcVariance(ArrayList<Double> angles){
//THIS IS WHERE I DON'T KNOW WHAT TO PUT
ArrayList<Double> normalizedList = new ArrayList<Double>();
for(int i = 0; i < angles.size(); i++){
double sin = Math.sin(angles.get(i) * (Math.PI/180));
double cos = Math.cos(angles.get(i) * (Math.PI/180));
normalizedList.add(Math.atan2(sin,cos)*(180/Math.PI));
}
double mean = calcMean(angles);
ArrayList<Double> squaredDifference = new ArrayList<Double>();
for(int i = 0; i < normalizedList.size(); i++){
squaredDifference.add(Math.pow(normalizedList.get(i) - mean,2));
}
double result = 0;
for(int i = 0; i < squaredDifference.size(); i++){
result+=squaredDifference.get(i);
}
return result/squaredDifference.size();
}
Während es der richtige Weg, um zu berechnen, Varianz, ich bin nicht, was ich verwenden soll. Ich nehme an, die soll ich verwenden, Arkustangens, aber die standard-Abweichung/Varianz-Werte scheinen aus. Hilfe?
EDIT:
Beispiel: Eingabe der Werte 0,350,1,0,0,0,1,358,9,1 Ergebnisse mit dem durchschnittlichen Winkel von 0.0014 (da die Winkel sind also nahe null), aber wenn Sie einfach tun, eine non-Winkel Durchschnitt, erhalten Sie 72...die ist Weg. Da ich nicht weiß, wie Sie zu manipulieren, einzelne Werte zu sein, was Sie sein sollten, die Varianz berechnet wird 25074, was sich in einer Standardabweichung von 158 Grad, das ist verrückt!! (Es sollten nur ein paar Grad), Was ich denke ich tun müssen, ist richtig " normalisieren einzelnen Werte, so kann ich die richtige Varianz/stddev Werte.
- Ich wollte nicht analysieren voll, aber dieser code scheint zu müssen, Math.atan2(y,x)
- Ich hatte dies ursprünglich (und haben es wieder zurück in jüngster Zeit) und die Ergebnisse sind die gleichen. Ich habe versucht die oben genannte Methode zusammen mit atan2 und die Ergebnisse, die ich bekommen sind die gleichen, die innerhalb von 12 oder 13 Größenordnungen.
- EDIT: Sieht aus, wie mit der atan2-Adressen Chechulin post. Werde ich Bearbeiten, meine Frage.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Durch die Wikipedia-Seite Sie einen link auf das zirkuläre Standardabweichung ist
sqrt(-log R²)
, wobei R = |meine samples|, wenn man die Proben als komplexe zahlen auf der Einheit Kreis. So die Berechnung der standard-Abweichung ist sehr ähnlich wie die Berechnung der mittleren Winkel:Und wenn Sie darüber nachdenken für eine minute, es macht Sinn: Wenn Sie den Durchschnitt einer Reihe von Punkten nahe beieinander auf der Einheit Kreis, das Ergebnis ist nicht allzu weit Weg vom Kreis, also R in der Nähe von 1 und die stddev in der Nähe von 0. Wenn die Punkte gleichmäßig verteilt entlang der Kreis deren Mittelwert nahe 0, so ist R nahe bei 0 und die stddev sehr groß.
stddev = sqrt(-log(sin*sin+cos*cos))*180/pi
Wenn Sie Math.atan(sin/cos) bekommen Sie einen Winkel zwischen -90 und 90 Grad. Wenn Sie 120-Grad-Winkel, Sie bekommen cos=-0.5 und Sünde=0.866, dann bekommen Sie atan(-1.7)=-60 Grad. So setzen Sie falsche Winkel in Ihrer normalisierten Liste.
Unter der Annahme, dass Varianz ist eine lineare Abweichung, würde ich empfehlen, Sie drehen Ihre Winkel array durch die -calcMean(Winkel) und addieren/subtrahieren 360 an/aus Winkeln oben/unten 180/-180 (verdammt mein schreiben!)) während der Suche nach den maximalen und minimalen Winkel. Es wird Ihnen gewünschten Abweichungen. Wie diese:
Durchschnittlichen quadrierten Abweichungen sollten Sie Ihre Methode (mit Winkel, nicht "normalisiert" sind), und halten Sie auf der Suche nach (-180, 180) Bereich!
Math-Bibliothek Funktion Rest ist praktisch für den Umgang mit Winkeln.
Eine einfache änderung wäre, Sie zu ersetzen
mit
Jedoch Ihre erste Schleife ist dann redundant, da der Aufruf von Rest kümmert sich um alle der Normalisierung. Darüber hinaus ist es einfacher, nur um die Summe der quadrierten Differenzen, anstatt Sie zu speichern. Persönlich ich mag zu vermeiden, pow (), wenn das arithmetische tun. So eine Funktion könnte sein:
Die akzeptierte Antwort von Joni hat eine ausgezeichnete Arbeit bei der Beantwortung dieser Frage, sondern als Brian Hawkins bemerkt:
Hier ist eine version, die behebt das Problem, indem Sie Grad für beide Ihre Argumente und Ihren Rückgabewert. Es hat auch mehr Flexibilität, weil es erlaubt für eine variable Anzahl von Argumenten.