c++ - 仅通过知道级别数来识别一维数据的级别

标签 c++ cluster-analysis k-means unsupervised-learning statistical-sampling

我有一个输出数据由一个属性(单值)组成的传感器。排序数据打洞示例如下:

样本: 199 200 205 209 217 224 239 498 573 583 583 590 591 594 703 710 711 717 719 721 836 840 845 849 855 855 856 857 858 858 928 935 936 936 942 943 964 977

您可以看到第一个图像输入的数据。

input

数据被分成了等级。级别数是为我提供的(本例中为 5 个级别)。然而,每一层的样本数量是未知的,层与层之间的距离也是未知的。

我需要排除异常值并定义每个级别的中心(查看第二张图像输出

output

红色样本代表离群值,黄色代表水平中心)。有什么算法、数学公式、c++代码可以帮助我实现这个要求吗?

我尝试了 KMeans(在此示例中 K = 5),但由于随机初始 K 质心,我得到了不好的结果。大多数情况下,一些初始质心共享同一级别,使该级别成为两个集群,而其他两个级别属于一个集群。如果我通过从每个级别选择一个质心来手动设置初始质心,我会得到非常好的结果。

最佳答案

如果两个连续数据点之间的差异大于特定值(将其视为 Delta ),则它属于不同的集群。

for this data set : 199 200 205 209 217 224 239 498 573 583 583 590 591 594 703 710 711 717 719 721 836 840 845 849 855 855 856 857 858 858 928 935 936 936 942 943 964 977

假设 delta 为 15(根据传感器对此进行微调)如果连续数据点差异不大于 15,则它们属于同一集群。您可以通过找到集群的中间值来找到中心点。 如果点附近的点与 delta 的差异那么它可以被认为是离群值。另一种选择是我们可以根据数据集的当前值改变 delta。

关于c++ - 仅通过知道级别数来识别一维数据的级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49387903/

相关文章:

c++ - 如何快速获取WinInet的代理设置(无网络依赖)

r - 如何根据定义的组为树状图的标签着色? (在 R 中)

algorithm - 如何使用 k-means 和 ID3 算法对 matlab 中的图像进行分类?

java - weka K中 "seed"的意义表示聚类

c++ - 哪个 vector 引发索引超出范围异常?

c++ - 在 VS2010 中使用 Boost.Pool - 链接器错误

c++ - 获取电池设备名称

android - Android 移动应用程序的基于兴趣和位置的算法

Python Scikit Learn GMM 结果与 R Mclust 不一致

apache-spark - Pyspark:在数据帧的不同组上应用 kmeans