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

时间:2015-07-08 10:13:19

标签: c++ algorithm c++11 cluster-analysis k-means

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

stackoverflow上有an answer,它建议连接具有不同偏移量和点差的随机数的顺序向量,但我不知道如何创建它们,特别是不包括第三方库。

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

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

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

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

1 个答案:

答案 0 :(得分:1)

可以使用c ++ 11(或boost)随机内容来创建群集,但它有点工作。

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

  2. 使用1.您可以从法线向量中采样(只需创建此类样本的 n 维向量)。

  3. 如果您从2.获取向量 n 并输出 A n + b ,那么您已经转换了中心 b < / em>离开+由 A 修改。 (特别是,对于2维和3维,它很容易构建 A 作为旋转矩阵。)因此,重复采样2.并执行此转换可以为您提供以 b'/ EM>

  4. 选择 k A,b ,然后生成 k 群集。

  5. 备注

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

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