Как кластеризировать объекты (без координат)

у меня есть список непрозрачных объектов. Я могу только рассчитать расстояние между ними (неверно, просто устанавливая условия для задачи):

class Thing {
    public double DistanceTo(Thing other);
}

Я хотел бы сгруппировать эти объекты. Я хотел бы контролировать количество кластеров, и я хотел бы, чтобы" близкие " объекты были в одном кластере:

List<Cluster> cluster(int numClusters, List<Thing> things);

может ли кто-нибудь предложить (и ссылку на; -)) некоторые алгоритмы кластеризации (чем проще, тем лучше!) или библиотек, которые могут помочь я?

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

представьте, что вы основываете кластеризацию на "запах" объекта. Вы не знаете, как выложить "запахи" на 2D-плоскости, но вы знаете, похожи ли два запаха или нет.

5 ответов


Я думаю, что вы ищете К-Medoids. Это как K-означает, что вы указываете количество кластеров,K, заранее, но это не требует, чтобы у вас было понятие "усреднения" объектов, которые вы кластеризуете, как это делает K-means.

вместо этого каждый кластер имеет представителя medoid, который является членом кластера ближе к середине. Вы можете думать об этом как о версии K-означает, что находит "медианы" вместо "средства." Все, что вам нужно, это метрика расстояния, чтобы сгруппировать вещи, и я использовал это в некоторых своих работах по тем же причинам, что и вы.

наивный и k-medoids это не самый быстрый алгоритм, но есть несколько быстрых вариантов, что, вероятно, достаточно хорошо для ваших целей. Ниже приведены описания алгоритмов и ссылки на документацию для их реализации в R:

  1. Пэм является основной реализацией O (n^2) В k-medoids.
  2. Клара гораздо быстрее, отобранных версия Пэм. Он работает путем кластеризации случайно отобранного подмножества объектов с PAM и группировки всего набора объектов на основе подмножества. Вы все равно сможете быстро получить очень хорошие кластеризации.

Если вам нужна дополнительная информация, вот газета это дает обзор этих и других методов K-medoids.


вот схема алгоритма кластеризации, который не имеет требования k-средних для поиска центроида.

  1. определить расстояние между всеми объектами. Запишите n большинство отдельных объектов.
    [находит корни наших кластеров, время O (n^2)]
  2. назначить каждый из них n случайные точки в n новые отдельные кластеры.
  3. для каждого объекта:
    [назначение объектов кластеры, время O (n^2)]
    1. для каждого кластера:
      1. вычислить среднее расстояние от кластера до этого объекта путем усреднения расстояния каждого объекта в кластере до объекта.
    2. назначьте объект ближайшему кластеру.

этот алгоритм, безусловно, объединять объекты. Но его время выполнения O (n^2). Плюс он руководствуется теми первыми n очки выбраны.

может ли кто-нибудь улучшить это (лучшее время выполнения perf, менее зависящее от первоначального выбора)? Я хотел бы увидеть ваши идеи.


вот быстрый алгоритм.

While (points_left > 0) {
 Select a random point that is not already clustered
 Add point and all points within x distance 
   that aren't already clustered to a new cluster.
}

кроме того, читайте:!--5-->страница Википедии. Кластеризация k-means-хороший выбор:

алгоритм K-средних присваивает каждую точку кластеру, центр которого (также называемый центроидом) является ближайшим. Центр-это среднее значение всех точек кластера , то есть его координаты-среднее арифметическое для каждого измерения отдельно по всем точкам кластера.

алгоритм шаги:

* Choose the number of clusters, k.
* Randomly generate k clusters and determine the cluster centers, or
  directly generate k random points as cluster centers.
* Assign each point to the nearest cluster center.
* Recompute the new cluster centers.
* Repeat the two previous steps until some convergence criterion is
  met (usually that the assignment hasn't changed).

основные преимущества этого алгоритма его простота и скорость, которые позволяет работать с большими наборами данных. Его недостатком является то, что он не результат одинаков при каждом запуске, поскольку результирующие кластеры зависят от начальные случайные задания. Он минимизирует внутрикластерную дисперсию, но не гарантирует, что результат имеет глобальный минимум отклонений. Другой недостатком является требование понятие средства быть определимый что не всегда так. Для таких наборы данных вариант k-medoids соответствующий.


Как насчет такого подхода:

  1. включить все объекты в один кластер.
  2. найти два объекта, a и b, которые находятся в одном кластере, k, и это максимальное расстояние друг от друга. Чтобы уточнить, должен быть один a и b для всего набора, не один a и b для каждого кластера.
  3. разделить кластера k в двух кластерах, k1 и k2, один с объектом a и один с объекта b.
  4. для всех других объектов в кластере k добавьте их в k1 или k2 путем определения минимального среднего расстояния до всех других объектов в этом кластере.
  5. повторите шаги 2-5 до образования N кластеров.

Я думаю, что этот алгоритм должен дать вам довольно хорошую кластеризацию, хотя эффективность может быть довольно плохой. Для повышения эффективности можно изменить Шаг 3, чтобы найти минимальное расстояние только до исходного объекта, который запустил кластер, а не среднее расстояние до всех объектов, уже находящихся в кластере.


филогенетический анализ последовательности ДНК регулярно использует иерархическую кластеризацию на текстовых строках с матрицами расстояний [выравнивания]. Вот хороший учебник R для кластеризации:

(ярлык: перейдите прямо в раздел "иерархическая агломерация"...)

вот некоторые другие библиотеки [language] :

этот подход может помочь определить, сколько [k]" естественных " кластеров существует и какие объекты использовать в качестве корней для подходов k-means выше.