Как создать n-мерные тестовые данные для кластерного анализа?

Я работаю над реализацией k-средних в C ++, и поэтому мне нужны n-мерные тестовые данные. Для начала достаточно двухмерных точек, поскольку их можно легко визуализировать на двухмерном изображении, но я бы, наконец, предпочел общий подход, который поддерживает n измерений.

Там было ответ здесь на stackoverflow, который предложил объединение последовательных векторов случайных чисел с различными смещениями и спредами, но я не уверен, как их создать, особенно без включения сторонней библиотеки.

Ниже приведено описание метода, которое у меня есть, оно содержит параметры, которые должны изменяться. Но при необходимости можно изменить — за исключением data, это должен быть указатель типа, так как я использую OpenCL.

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

Еще одна проблема, которая пришла мне в голову — это эффективное обнаружение / предотвращение столкновений при генерации случайных чисел. Не может ли это быть горлышком бутылки производительности, например если вы генерируете числа в 100 тысяч в области значений 1M, то есть, если связь между генерируемыми числами и пространством чисел не достаточно мала?


ВОПРОС
Как эффективно создать n-мерные тестовые данные для кластерного анализа? Каким концепциям я должен следовать?

1

Решение

Можно использовать c ++ 11 (или повысить) случайные вещи для создания кластеров, но это немного работы.

  1. std::normal_distribution может генерировать одномерные нормальные распределения с нулевым средним.

  2. Используя 1. вы можете выбрать из нормального вектора (просто создайте N размерный вектор таких образцов).

  3. Если вы берете вектор N от 2. и выход A n + b, тогда вы преобразовали центр б прочь + изменено . (В частности, для 2 и 3 измерений легко построить как матрица вращения.) Таким образом, многократная выборка 2. и выполнение этого преобразования может дать вам выборку с центром в б.

  4. выберите К пара А, В, и создать свой К кластеры.


Заметки

  • Вы можете создавать различные сценарии кластеризации, используя различные типы матрицы. Например, если это матрица, не сохраняющая длину, умноженная на матрицу вращения, тогда вы можете получить «параболоидные» кластеры (на самом деле интересно сделать их шире по векторам, соединяющим центры).

  • Вы можете генерировать «центральные» векторы б в жестком коде или с использованием дистрибутива, подобного используемому для Икс векторы выше (возможно, равномерный, хотя, используя этот).

1

Другие решения


По вопросам рекламы [email protected]