Я читал в последнее время о различных hierarchical clustering algorithms, таких как single-linkage clustering и group average clustering. В общем, эти алгоритмы не имеют тенденций хорошо масштабироваться. Наивные реализации большинства иерархических алгоритмов кластеризации - O(N^3)
, но односвязная кластеризация может быть реализована в O(N^2)
времени.Алгоритмическая сложность групповой средней кластеризации
Также заявлено, что групповая кластеризация может быть реализована в O(N^2 logN)
времени. Вот о чем мой вопрос.
Я просто не понимаю, как это возможно.
Объяснение после объяснения, такие как:
http://nlp.stanford.edu/IR-book/html/htmledition/time-complexity-of-hac-1.html
http://nlp.stanford.edu/IR-book/completelink.html#averagesection
https://en.wikipedia.org/wiki/UPGMA#Time_complexity
... утверждают, что в среднем по группе иерархическую кластеризацию может быть сделано в O(N^2 logN)
времени с использованием очередей приоритетов , Но когда я читаю фактическое объяснение или псевдокод, мне всегда кажется, что это ничего лучше, чем O(N^3)
.
По сути, алгоритм выглядит следующим образом:
For an input sequence of size N:
Create a distance matrix of NxN #(this is O(N^2) time)
For each row in the distance matrix:
Create a priority queue (binary heap) of all distances in the row
Then:
For i in 0 to N-1:
Find the min element among all N priority queues # O(N)
Let k = the row index of the min element
For each element e in the kth row:
Merge the min element with it's nearest neighbor
Update the corresponding values in the distance matrix
Update the corresponding value in priority_queue[e]
Так что, что последний шаг, который, мне, казалось бы, сделать это O(N^3)
алгоритм. Невозможно «обновить» произвольное значение в очереди приоритетов, не просматривая очередь в O(N)
времени - при условии, что приоритетная очередь представляет собой двоичную кучу. (Двоичная куча дает вам постоянный доступ к элементу min и добавляет/удаляет log N
, но вы не можете просто найти элемент по значению лучше, чем O(N)
). И так как мы сканировали очередь приоритетов для каждого элемента строки, для каждой строки мы получаем (O(N^3))
.
Очередь приоритет отсортированы по значения расстояния - но алгоритм в вопросе предусматривает удаление элемента в очереди приоритета, который соответствует k
, индекс строки в матрице расстояния от элемента мин. Опять же, нет способа найти этот элемент в очереди без сканирования O(N)
.
Итак, я предполагаю, что я, вероятно, ошибаюсь, потому что все остальные говорят иначе. Может кто-нибудь объяснить, как этот алгоритм каким-то образом неO(N^3)
, но на самом деле, O(N^2 logN)
?
Вы понимаете, что 0,5 * n^2 все еще находится в O (n^2)? ** Сохранение половины матрицы не уменьшает асимптотическую сложность **. И вы ошибаетесь «взаимно». Как вы его используете, вы говорите, что d (x, y) = 1/d (y, x), но расстояния симметричны, а не взаимны? –
Это означает, что поиск дополнительной (более корректной) очереди очереди приоритетов - O (1). Глобальный минимум представлен дважды, оба из которых должны иметь первые записи в очередях их приоритетов. –
Вышеуказанный подход использует (по уважительной причине) одну приоритетную очередь для каждой записи, поскольку в противном случае вам нужно каждый раз отбрасывать записи O (n). –