所以我正在使用罗盘角度(以度为单位)开发应用程序。我已经设法确定角度平均值的计算,通过使用以下(在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 度,这太疯狂了!(应该只有几度)我认为我需要做的是正确标准化各个值,以便我可以获得正确的方差/标准差值。