java - 计算角度的标准偏差?

标签 java algorithm math angle

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

最佳答案

通过您链接到的维基百科页面,循环标准偏差是 sqrt(-log R²),其中 R = |样本均值|,如果您将样本视为单位圆上的复数.所以标准差的计算与平均角的计算非常相似:

double calcStddev(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 stddev = Math.sqrt(-Math.log(sin*sin+cos*cos));

      return stddev;
 }

如果你想一想就会明白:当你在单位圆上对一堆彼此靠近的点进行平均时,结果离圆不会太远,所以 R 将接近 1 并且stddev 接近 0。如果点沿圆均匀分布,它们的平均值将接近 0,因此 R 将接近 0,stddev 非常大。

关于java - 计算角度的标准偏差?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13928404/

相关文章:

Java Scanner 无法获取所有行

java - 如何使用 javascript 从我的服务器获取数据到我的 JSP?

algorithm - 构建堆函数

algorithm - 平面数据集的平方 TreeMap 算法?

c++ - 递归 3 X 3 幻方

java - 删除双向链表中的第一个节点

java - Android中获取当前位置方向的位置

algorithm - 计算 3^3^3^3(非常大的指数/Wolfram 是怎么做到的?)

python - Sympy 有理数 - 表达 (x + 3 )**6/6

c++ - 如何从一个 vector 计算坐标系?