だから私はコンパス角度 (度) を使用してアプリケーションに取り組んでいます。以下を使用して、角度の平均の計算を決定することができました(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;
}
したがって、平均値/平均値は正しく取得できますが、適切な分散/標準偏差値を取得できません。分散を間違って計算していることは確かですが、それを行う正しい方法が思いつきません。
分散を計算する方法は次のとおりです。
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();
}
これは分散を計算する適切な方法ですが、私が使用することになっている方法ではありません。逆正接を使用することになっていると思いますが、標準偏差/分散の値がずれているようです。ヘルプ?
編集: 例: 値 0,350,1,0,0,0,1,358,9,1 を入力すると、平均角度が 0.0014 になります (角度がゼロに非常に近いため)。 、あなたは72を取得します...これはかなり外れています。個々の値をあるべき値に操作する方法がわからないため、計算された分散は 25074 であり、標準偏差は 158 度になります。これは正気ではありません!! (ほんの数度である必要があります)私がする必要があると思うのは、個々の値を適切に正規化して、正しい分散/標準偏差値を取得できるようにすることです。