我正在研究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维测试数据?我需要遵循哪些概念?
答案 0 :(得分:1)
可以使用c ++ 11(或boost)随机内容来创建群集,但它有点工作。
std::normal_distribution
可以生成零均值的单变量正态分布。
使用1.您可以从法线向量中采样(只需创建此类样本的 n 维向量)。
如果您从2.获取向量 n 并输出 A n + b ,那么您已经转换了中心 b < / em>离开+由 A 修改。 (特别是,对于2维和3维,它很容易构建 A 作为旋转矩阵。)因此,重复采样2.并执行此转换可以为您提供以 b'/ EM>
选择 k 对 A,b ,然后生成 k 群集。
备注强>
您可以使用不同类型的 A 矩阵生成不同的群集方案。例如,如果 A 是一个非长度保留矩阵乘以一个旋转矩阵,那么你可以得到抛物面&#34;群集(实际上有趣的是沿着连接中心的向量使它们更宽)。
您可以生成&#34;中心&#34;向量 b 硬编码,或者使用上面用于 x 向量的分布(可能是统一的,但使用this)。