コンパスの角度(度)を使用してアプリケーションを作成しています。私は、次の(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;
}
は、だから私は正しく私の平均/平均値を取得しますが、私は、適切な分散を得ることができません/ stddev値。私は間違って分散を計算していると確信していますが、正しい方法を考えることはできません。ここで
私は分散を計算しています方法は次のとおりです。それは分散を計算するための適切な方法ですが
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();
}
、私は私が使用するようになってるものではありませんよ。私はアークタンジェントを使用するはずだと推測しますが、標準偏差/分散値は見えません。助けて?
EDIT: 例:値が0.0014の平均角度と0,350,1,0,0,0,1,358,9,1結果を(角度がゼロに非常に近いため)を入力、ただしもしちょうど非角度の平均をすれば、あなたは72を得るでしょう。私は個々の値をどのように操作するのか分からないので、計算された分散は25074であり、標準偏差は158度になります。これは非常識です! (それはほんの数度に過ぎないはずです)私は正しい分散/標準偏差の値を得るために、個々の値を適切に正規化する必要があると思います。
私は完全に分析しませんでしたが、このコードはMath.atan2(Y、X) – maniek
@maniek必要のようです - 私はもともとこれを行っていた(そして最近で戻ってそれを入れているが)、結果が同じです。私はatan2と一緒に上記の方法を試してみました。結果は同じ12〜13桁です。 – snotyak
編集:atan2のChechulinの投稿を使用しているように見えます。私は私の質問を編集します。 – snotyak