Кластеризация текстовых документов — неоднородные кластеры

Я пытался сгруппировать набор текстовых документов. У меня есть разреженная матрица TFIDF с примерно 10 тыс. документов (подмножество большого набора данных), и я пытаюсь запустить алгоритм k-средних scikit-learn с разными размерами кластеров (10,50,100). Остальные все параметры являются значениями по умолчанию.

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

Кто-нибудь знает, с какой проблемой я сталкиваюсь?


person apurva.nandan    schedule 25.02.2015    source источник
comment
k-means не очень устойчив к выбросам. Кластеры из 1 элемента обычно являются выбросами.   -  person Has QUIT--Anony-Mousse    schedule 26.02.2015
comment
Да, именно так я и думал, так как подозреваю много выбросов. Мне интересно, какой алгоритм может подойти в этом случае.   -  person apurva.nandan    schedule 26.02.2015


Ответы (2)


Вот возможные вещи, которые могут пойти «не так»:

  1. Ваши точки инициализации кластера k-средних выбираются как один и тот же набор точек в каждом запуске. Я рекомендую использовать «случайный» для параметра инициализации k-means http://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html. Если это не сработает, предоставьте k-means свой собственный набор случайных начальных кластерных центров. Не забудьте инициализировать ваш генератор случайных чисел, используя его метод seed() в качестве текущей даты и времени. https://docs.python.org/2/library/random.html использует текущую дату и время в качестве значения по умолчанию.

  2. Виновником может быть ваша функция расстояния, то есть евклидово расстояние. Это менее вероятно, но всегда полезно запускать k-средние, используя косинусное сходство, особенно когда вы используете его для сходства документов. scikits в настоящее время не имеет этой функции, но вы должны посмотреть здесь: using-scikit-learn-k-means">Можно ли указать собственную функцию расстояния с помощью кластеризации scikit-learn K-Means?

Эти два сочетания должны дать вам хорошие кластеры.

person Abhimanu Kumar    schedule 25.02.2015

С помощью приведенных выше ответов и комментариев я заметил, что возникла проблема с выбросами и шумом в исходном пространстве. Для этого мы должны использовать метод уменьшения размерности, который устраняет нежелательный шум в данных. Сначала я попробовал случайные проекции, но с текстовыми данными он не работал, просто потому, что проблема все еще не была решена. Затем с помощью Truncated Singular Value Decomposition я смог получить идеально однородные кластеры. Следовательно, на мой взгляд, Truncated SVD — это способ работы с текстовыми данными.

person apurva.nandan    schedule 10.09.2015