Какой алгоритм я должен использовать, чтобы разбить огромный набор двоичных данных на несколько категорий?

11

У меня есть большая (650K строк * 62 столбцов) матрица двоичных данных (только 0-1 записей). Матрица в основном скудная: около 8% заполнено.

Я хотел бы разбить его на 5 групп, скажем, с именами от 1 до 5. Я пробовал иерархическую кластеризацию, и она не смогла обработать размер. Я также использовал алгоритм кластеризации k-средних на основе расстояния Хэмминга, учитывая 650-битные векторы длиной 62 КБ. Я не получил правильных результатов ни с одним из них.

Пожалуйста помоги.

Unbounded26
источник
Я не могу комментировать ч / б моего 1 представителя, поэтому мне пришлось ввести это как ответ. Вы можете посмотреть в Жаккар Сходство. Я думаю, что Python Scipy имеет реализации этого. Жаккард ...
gobrewers14
Есть ли основания предполагать, что данные естественно делятся на пять групп, по крайней мере, до некоторой степени? Вы действительно заинтересованы в кластеризации строк, или вы также заинтересованы в отношениях между 62 признаками, закодированными в битовых векторах? Если последнее, то другие методы более подходят.
micans

Ответы:

4

Вы задаете неправильный вопрос.

Вместо того, чтобы спрашивать «какой алгоритм», вы должны спрашивать «что такое значимая категория / кластер в вашем приложении».

Я не удивлен, что вышеприведенные алгоритмы не сработали - они рассчитаны на очень разные варианты использования. k-means не работает с произвольными другими расстояниями. Не используйте это с расстоянием Хэмминга. Есть причина, по которой он называется k- means , его имеет смысл использовать только тогда, когда среднее арифметическое имеет смысл (чего нельзя сказать о двоичных данных).

Вы можете вместо этого попробовать k-режимы, IIRC - это вариант, который на самом деле предназначен для использования с категориальными данными, а двоичные данные несколько категоричны (но разреженность может вас убить).

Но прежде всего, вы удалили дубликаты, чтобы упростить ваши данные, и удалили, например, уникальные / пустые столбцы?

Возможно, APRIORI или подобные подходы также более значимы для вашей проблемы.

В любом случае, сначала выясните, что вам нужно, а затем, какой алгоритм может решить эту проблему. Работайте на основе данных , а не пробуя случайные алгоритмы.

ВЫЙТИ - Anony-Mousse
источник
Не могли бы вы объяснить, почему «Не используйте с расстоянием Хэмминга»? Это может иметь смысл, ведь это доступно в Matlab. Я не против открыть новый вопрос, если это имеет смысл.
Дрор Атария
Из-за подлости. Среднее арифметическое не имеет смысла с расстоянием Хэмминга или двоичными данными. Вместо этого используйте режим или медоид .
ВЫЙТИ - Anony-Mousse
Просто чтобы убедиться, что я правильно понял: Matlab использует среднее арифметическое при обновлении центроидов при использовании k-средних вместе с метрикой Хэмминга. Это правильно? Как правильно использовать этот показатель в Matlab?
Дрор Атария
К-значит называется к- означает, потому что он использует среднее. В противном случае это называется k-medoids, k-mode и т. Д. Среднее значение для L2 - сумма квадратов отклонений.
ВЫЙТИ - Anony-Mousse
Таким образом, Matlab использует K- средства вместе с метрикой Хемминга; это не имеет особого смысла.
Дрор Атария
3

Может быть, я немного опоздал с ответом, но, возможно, это будет полезно для некоторых тел в будущем.

Адаптивная теория резонанса является хорошим алгоритмом для задач бинарной классификации. Проверьте об ART 1. Более подробную информацию вы можете увидеть в бесплатной книге « Дизайн нейронной сети» в главе 19.

В этой сети сочетаются отличная биологическая идея и хорошая математическая реализация. Также этот алгоритм прост в реализации, и в этой книге вы также можете найти пошаговые инструкции по созданию этого классификатора.

itdxer
источник
2

Классическим алгоритмом кластеризации двоичных данных является модель Бернулли. Модель может быть подобрана с использованием байесовских методов и может быть подобрана также с использованием EM (ожидание максимизации). Вы можете найти примеры кода Python по всему GitHub, хотя первый более мощный, но и более сложный. У меня есть реализация C # модели на GitHub (использует Infer.NET, который имеет ограничительную лицензию!).

Модель довольно проста. Сначала выберите кластер, которому принадлежит точка данных. Затем независимо отоберите столько Бернулли, сколько у вас есть измерений в наборе данных. Обратите внимание, что это подразумевает условную независимость двоичных значений для данного кластера!

В байесовских условиях приоритетами над кластером является распределение Дирихле. Это то место, куда нужно ставить приоритеты, если вы считаете, что некоторые кластеры больше других. Для каждого кластера вы должны указать предыдущий, бета-дистрибутив, для каждого дистрибутива Бернулли. Как правило, это предварительное бета-версия (1,1) или униформа. Наконец, не забывайте случайным образом инициализировать назначения кластера при получении данных. Это нарушит симметрию, и сэмплер не застрянет.

В байесовской среде есть несколько интересных особенностей модели BMM:

  1. Онлайн кластеризация (данные могут поступать в виде потока)

  2. Модель может быть использована для определения недостающих размеров

Первый очень удобен, когда набор данных очень большой и не помещается в ОЗУ машины. Второй может быть использован во всех видах задач вменения отсутствующих данных, например. вменение отсутствующей половины двоичного изображения MNIST.

Владислав Довгальец
источник