Quindi sto lavorando a un'applicazione utilizzando gli angoli della bussola (in gradi). Sono riuscito a determinare il calcolo della media dei punti di vista, utilizzando il seguente (che si trova a http://en.wikipedia.org/wiki/Directional_statistics#The_fundamental_difference_between_linear_and_circular_statistics):Calcolo della deviazione standard degli angoli?
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;
}
in modo da ottenere in modo corretto i miei valori medi/media, ma non riesco a ottenere una corretta varianza/valori di stddev. Sono abbastanza sicuro di calcolare la mia varianza in modo errato, ma non riesco a pensare a un modo corretto per farlo.
Ecco come sto calcolo della varianza:
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();
}
Mentre è il modo corretto per calcolare la varianza, io non sono quello che dovrei usare. Presumo che dovrei usare arcotangente, ma i valori di deviazione standard/varianza sembrano off. Aiuto?
EDIT: Esempio: Inserimento valori 0,350,1,0,0,0,1,358,9,1 risultati con l'angolo medio di 0,0014 (dato che gli angoli sono così vicino a zero), ma se basta fare una media non angolare, avrai 72 ... che è lontano. Dato che non so come manipolare i valori individuali per essere quello che dovrebbero essere, la varianza calcolata è 25074, risultante in una deviazione standard di 158 gradi, che è folle !! (Dovrebbe essere solo di pochi gradi) Quello che penso che devo fare è normalizzare correttamente i singoli valori in modo da poter ottenere valori di varianza/stddev corretti.
Io non analizzo completamente, ma questo codice sembra aver bisogno Math.atan2 (y, x) – maniek
@maniek - avevo fatto presente in origine (e hanno messo di nuovo nel recente) ed i risultati sono gli stessi . Ho provato il metodo sopra insieme a atan2 e i risultati che ottengo sono gli stessi in 12 o 13 ordini di grandezza. MODIFICA – snotyak
: Sembra che usi atan2 indirizzi il post di Chechulin. Modificherò la mia domanda. – snotyak