将浮点数组划分为相似的段(集群)
partitioning an float array into similar segments (clustering)
我有一个浮动数组,如下所示:
[1.91, 2.87, 3.61, 10.91, 11.91, 12.82, 100.73, 100.71, 101.89, 200]
现在,我想对数组进行如下分区:
[[1.91, 2.87, 3.61] , [10.91, 11.91, 12.82] , [100.73, 100.71, 101.89] , [200]]
//[200]将被视为异常值,因为较少的集群支持
我必须为几个数组找到这种分段,我不知道分区大小应该是多少。我试图通过使用层次聚类(Aggregation)来做到这一点,它给了我满意的结果。然而,问题是,有人建议我不要对一维问题使用聚类算法,因为它们没有理论上的理由(就像对多维数据一样)这样做。
我花了很多时间寻找解决方案。然而,建议似乎完全不同,比如:这个和这个VS这个和这个。
我发现了另一个建议,而不是集群,即自然中断优化。然而,这也需要像K-means一样声明分区号(对吗?)。
这很令人困惑(特别是因为我必须对几个数组进行这种分割,而且不可能知道最佳分区数)。
有没有任何方法可以找到分区(这样我们就可以减少分区内的方差,最大化分区之间的方差),并有一些理论依据?
任何指向文章/论文的指针(如果有C/C++/Java实现)以及一些理论上的理由都会对我很有帮助。
我想我应该对数据进行排序(如果还没有),然后取相邻的差异。将差异除以两者之间的较小数字,得到百分比变化。设置一个阈值,当更改超过该阈值时,启动一个新的"集群"。
编辑:C++中的快速演示代码:
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <numeric>
#include <functional>
int main() {
std::vector<double> data{
1.91, 2.87, 3.61, 10.91, 11.91, 12.82, 100.73, 100.71, 101.89, 200
};
// sort the input data
std::sort(data.begin(), data.end());
// find the difference between each number and its predecessor
std::vector<double> diffs;
std::adjacent_difference(data.begin(), data.end(), std::back_inserter(diffs));
// convert differences to percentage changes
std::transform(diffs.begin(), diffs.end(), data.begin(), diffs.begin(),
std::divides<double>());
// print out the results
for (int i = 0; i < data.size(); i++) {
// if a difference exceeds 40%, start a new group:
if (diffs[i] > 0.4)
std::cout << "n";
// print out an item:
std::cout << data[i] << "t";
}
return 0;
}
结果:
1.91 2.87 3.61
10.91 11.91 12.82
100.71 100.73 101.89
200
聚类通常假设多维数据。
如果您有一维数据,对其进行排序,然后使用内核密度估计,或者只扫描最大的间隙。
在一维中,问题变得简单得多,因为数据可以排序。如果你使用聚类算法,很遗憾不会利用这一点,所以请使用一维方法!
考虑在一维数据中找出最大的差距。这很简单:排序(n log n,但在实践中尽可能快),然后查看两个相邻的值以获得最大的差异。
现在尝试在二维中定义"最大间隙",并使用一种有效的算法来定位它…
- 编译在我的 Mac 上工作,但在集群 (Linux) 上不起作用
- 删除K的背景掩码-意味着Python或C++中的集群/
- 如何将 Boost 库与 CMake 链接(如果 boost 位于非标准位置,则在集群上)?
- 使用 sge 集群在 Matlab 下运行C++代码
- 如何在集群上链接提升库
- Cassandra cpp 驱动程序抛出错误,但能够与集群连接
- CPUTIME 和 WALLTIME C++基于 Linux 的集群上的代码
- 群集不是类型 + 群集未命名类型错误.添加(群集 *)出错.不能有集群 *
- 我刚开始使用特征矩阵代数库,目的是创建一个数据集的相似矩阵,建议
- c++字袋集群数组大小问题
- 网格引擎集群+OpenCV:奇怪的行为
- 集群键/值数据库:最近的记录
- 将浮点数组划分为相似的段(集群)
- 集群实施的想法
- 使服务器集群能够识别不同集群上的用户
- 为什么OpenCV BOW集群功能运行很慢?如何提高其性能
- 如何从一个节点获取集群
- 使用WriteFile填充集群
- 从集群读取数据
- 如何在公共linux/unix集群上为编译器添加c++库