c++ - 寻找一组圆形数据的中位数

标签 c++ algorithm median

我想编写一个 C++ 函数来查找循环数据数组的中位数。
例如,考虑来自指南针的读数,其中假定读数位于 [0,360)。尽管 1 和 359 看起来很远,但由于读数的循环性质,它们非常接近。

在普通数据中求N个元素的中位数如下。
1.对N个元素的数据进行排序(升序或降序)
2. 如果 N 是奇数,则中位数是排序数组中的第 (N+1)/2 个元素。
3. 如果 N 是偶数,则中位数是排序数组中第 N/2 个和第 N/2+1 个元素的平均值。

然而,循环数据中的环绕问题将问题带到了不同的维度并且解决方案非常重要。

这里解释了一个类似的从循环数据中找到均值的问题 How do you calculate the average of a set of circular data?
上面链接中的建议是找到每个角度对应的单位 vector 并求平均值。但是,中值需要对数据进行排序,而 vector 的排序在这种情况下没有任何意义。因此我不认为我们可以使用提议的方案来找到中位数!

最佳答案

有关圆形中线的定义和讨论,请参见

你。 Fisher 的“循环数据的统计分析”,剑桥大学。出版社 1993

以及围绕方程 2.32 和 2.33 的讨论。对于多模态或各向同性数据,可能不存在唯一的中位数。

找到将数据分成 2 个相等组的轴,并选择轴的末端角度值较小。如果样本大小为奇数,则中位数将是一个数据点,否则它将是 2 个数据点的中点。

有其他语言(例如 R、MatLab)的包可以帮助为您编写的任何函数提供测试值。

例如
https://www.rdocumentation.org/packages/circular/versions/0.4-93

特别参见median.circularmedianHL.circular
或者

贝伦斯,菲利普。 “CircStat:用于循环统计的 MATLAB 工具箱”。统计软件杂志 31,没有。 1(2009 年 9 月 23 日):1-21。 https://doi.org/10.18637/jss.v031.i10 .

并查看 circ_median

关于c++ - 寻找一组圆形数据的中位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46451427/

相关文章:

c++ - Open GL 在 Codelite Windows 7 上编译,但没有显示输出

c++ - 如何使用 OpenGL C++ 绘制双曲面?

C++ string.length() 超出 string.at() 参数范围

regex - 如何在 perl 中打印特定格式的数组?

c# - 有没有一种好的方法来优化迭代次数相乘的嵌套 for 循环?

python-2.7 - 如何使用 python 或 OpenCV 根据局部特征或全局自动将我的数据集图像聚类到不同的组中?

c++ - 如何最好地在C++中实现 “newtype”习惯用法?

algorithm - 在二叉搜索树中删除?

python - 四分位数间距应该如何在 Python 中计算?

algorithm - 使用 2 个堆找到中位数的复杂性