如何为聚类分析创建n维测试数据

How to create n-dimensional test data for cluster analysis?

本文关键字:测试数据 创建 聚类分析      更新时间:2023-10-16

我正在研究k-means的c++实现,因此我需要n维测试数据。对于开始的2D点是足够的,因为它们可以很容易地在2D图像中可视化,但我最终更喜欢支持n维的通用方法。

在stackoverflow上有一个答案,它建议用不同的偏移量和扩展连接随机数字的顺序向量,但我不确定如何创建这些,特别是没有包括第三方库。

下面是我目前为止的方法声明,它包含了应该变化的参数。但可以改变,如果有必要-除了data,它需要是一个指针类型,因为我使用OpenCL。

auto populateTestData(float** data, uint8_t dimension, uint8_t clusters, uint32_t elements) -> void;

我想到的另一个问题是在生成随机数时有效检测/避免碰撞。这难道不是性能瓶颈吗?例如,如果在1M值的域中生成100k个数字,即生成的数字与数字空间之间的关系不够小?


如何有效地为聚类分析创建n维测试数据?我需要遵循哪些概念?

可以使用c++11(或boost)随机的东西来创建集群,但这需要一些工作。

  1. std::normal_distribution可以生成均值为零的单变量正态分布。

  2. 使用1
  3. 。你可以从法向量中采样(只需创建一个n维向量)。

  4. 如果从2中取向量n。和输出A n + b,那么你就把中心b移走了+被A修改了。(特别是,对于2维和3维,很容易构建A作为旋转矩阵。)重复采样2。执行这个变换可以得到一个以b为中心的样本。

  5. 选择A, b中的k对,并生成k簇。


指出

  • 可以使用不同类型的A矩阵生成不同的集群场景。例如,如果A是一个非长度保持矩阵乘以一个旋转矩阵,那么你可以得到"抛物面"簇(沿着连接中心的向量使它们更宽实际上很有趣)。

  • 您可以生成硬编码的"中心"向量b,或者使用上面用于x向量的分布(可能是统一的,但是,使用这个)。