Определить различные кластеры 1d данных из базы данных

24

У меня есть таблица базы данных передачи данных между различными узлами. Это огромная база данных (около 40 миллионов переводов). Одним из атрибутов является количество байтов (nbytes), которые варьируются от 0 до 2 терабайт. Я хотел бы кластеризовать n-байты так, чтобы при заданных k кластерах некоторые передачи x1 принадлежали кластеру k1, x2 переводились в k2 и т. Д.

Исходя из терминологии, которую я использовал, вы могли догадаться, что я имел в виду: K-средства. Это 1d данные, так как nbytes - единственная функция, которая меня волнует. Когда я искал другие методы для этого, я увидел, что EM упоминался пару раз вместе с подходом, не связанным с кластеризацией. Я хотел бы узнать о ваших взглядах на то, как подойти к этой проблеме (в частности, кластеризовать или нет).

Благодарность!

Shaun
источник
Что такое «переводы x1», «переводы x2» и т. Д.? Является ли «тип передачи» второй переменной?
Питер Флом - Восстановить Монику
Передачи x1 - это просто способ сказать, что эти 500 переводов имели размер передачи около некоторого значения (это будет среднее значение для этого кластера в k-средних).
Шон
5
Я не эксперт по кластеризации, но с таким большим количеством данных и всего лишь одним измерением, интересно, не могли бы вы просто сделать несколько графиков плотности ядра, используя разные полосы пропускания, и посмотреть, сколько режимов / пиков вы найдете, и выглядит ли результат как это было бы полезно для вас.
gung - Восстановить Монику
1
Вы спросили, кластеризовать или нет. Какова будет ваша цель от кластеризации? Будете ли вы использовать кластеры для каких-то других целей, или это представляет теоретический интерес?
Питер Флом - Восстановить Монику
Некоторые из других атрибутов из таблицы - это имя пользователя, даты начала и окончания. Я надеюсь, что путем кластеризации переводов на основе размера перевода я могу затем обратиться к другим атрибутам конкретного перевода, чтобы узнать, кто сколько переводит в каком месяце года. Что мы будем делать с этим наблюдением, я пока не знаю. Но это как раз то, куда я иду.
Шон

Ответы:

43

В одномерных данных не используйте кластерный анализ.

Кластерный анализ обычно является многомерной техникой. Или позвольте мне лучше сформулировать это по-другому: для одномерных данных, которые полностью упорядочены, существуют гораздо лучшие методы. Использование k-средних и подобных методов в данном случае - пустая трата, если только вы не приложите достаточно усилий, чтобы реально оптимизировать их для 1-го случая.

Просто чтобы дать вам пример: для k-средних обычно используют k случайных объектов в качестве начальных начальных чисел. Для одномерных данных довольно легко добиться большего успеха, просто используя соответствующие квантили (1 / 2k, 3 / 2k, 5 / 2k и т. Д.), После сортировки данных один раз и последующей оптимизации с этой начальной точки. Однако 2D данные не могут быть отсортированы полностью. И в сетке, скорее всего, будут пустые ячейки.

Я бы тоже не назвал это кластером. Я бы назвал это интервалом . Что вы действительно хотите сделать, это оптимизировать границы интервала. Если вы выполните k-means, он проверит для каждого объекта, будет ли он перемещен в другой кластер. Это не имеет смысла в 1D: нужно проверять только объекты на границах интервала. Это, очевидно, намного быстрее, так как там всего ~ 2 тыс. Объектов. Если они уже не предпочитают другие интервалы, больше центральных объектов тоже не будет.

Возможно, вы захотите изучить такие методы, как , например, оптимизация Jenks Natural Breaks .

Или вы можете сделать оценку плотности ядра и искать локальные минимумы плотности, чтобы разделить их там. Приятно то, что вам не нужно указывать k для этого!

PS пожалуйста используйте функцию поиска. Вот некоторые вопросы по 1-й кластеризации данных, которые вы пропустили:

Anony-Мус
источник
Квантили не обязательно согласуются с кластерами. Распределение 1d может иметь 3 естественных кластера, где два содержат по 10% данных каждый, а последний содержит 80% данных. Поэтому я думаю, что здесь можно кластеризоваться, хотя я согласен с тем, что имеет смысл оптимизировать процесс, аккуратно собирая семена и т. Д. Или используя другие идеи.
побитовое
Квантили, вероятно, являются хорошими исходными точками для оптимизации , о чем я говорил. И просто приведу пример того, что вы можете сделать в 1D, что не очень хорошо работает в 2+ измерениях.
Anony-Mousse
Я согласен, что стоило бы попробовать использовать квантили в качестве начальных чисел, но я все же попробовал бы некоторые случайные инициализации (для примеров, таких как тот, который я дал) В любом случае, лучший способ - просто посмотреть на гистограмму / график плотности и вручную выбрать семена, а затем оптимизировать их с помощью кластеризации. Это очень быстро сойдет к хорошему решению.
поразрядно
3
Дженкс - это К-среднее в 1D.
whuber
1
@whuber, даже если это математически, я надеюсь, он был достаточно умен, чтобы эксплуатировать данные . Если вы используете подход Ллойда для выполнения k-средних на одномерных данных, вы глупы, потому что вы делаете много вычислений, которые вы могли бы пропустить. И для большинства людей k-means - это Ллойд. И некоторые люди заботятся о том, чтобы избежать ненужных пересчетов.
Anony-Mousse
1

Ваш вопрос, следует ли вам кластеризовать или какой метод вы должны использовать для кластеризации?

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

Относительно типа кластеризации, k-средних должно быть хорошо, если в данных есть «реальные» кластеры. Если вы не видите кластеров на гистограмме, кластеризовать их все равно не имеет смысла, так как любое разбиение диапазона данных даст действительные кластеры (или в случае случайного запуска kmeans вы получите разные кластеры). каждый пробег).

побитовое
источник
0

Можешь попробовать:

  1. KMeans, GMM или другие методы, указав n_clusters = no. пиков в графике плотности ядра.

  2. KMeans, GMM или другие методы определения оптимального нет. кластеров на основе некоторых метрик. Дополнительная информация: [здесь] https://en.wikipedia.org/wiki/Determining_the_number_of_clusters_in_a_data_set

Амарприт Сингх
источник