Понимание алгоритма DynamicTreeCut для разрезания дендрограммы

Дендрограмма - это структура данных, используемая с иерархическими алгоритмами кластеризации, которые группируют кластеры на разных высотах дерева, где высоты соответствуют измерениям расстояния между кластерами.

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

Не всегда ясно, на какой высоте вырезать дендрограмму, но существуют некоторые алгоритмы, такие как DynamicTreeCut, которые пытаются программно отображать значимые кластеры из дендрограммы.

См:

https://stats.stackexchange.com/info/3685/where-to-cut-a-dendrogram

Резка дендрограммы на самом высоком уровне чистоты

Итак, я читал алгоритм DynamicTreeCut, а также реализация Java алгоритма. Я понимаю, как работает алгоритм и что он делает, с точки зрения поэтапной разбивки того, что происходит. Однако я не понимаю, как этот алгоритм делает что-то значимое. Я думаю, что здесь отсутствует ключевая концепция.

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

Затем алгоритм требует взять "опорную высоту", l и вычесть его с каждой высоты во входной "последовательности высоты". Это дает вектор разностей (D) между каждой высотой h[i] в последовательности по высоте и опорной высоты l.

Затем алгоритм пытается найти "точки перехода", которые являются точками в векторе различий, где D[i] > 0 и D[i+1] < 0. Другими словами, точки в векторе различий, где значение разности перешло от положительного к отрицательному.

И прямо здесь я полностью потерян. Я не понимаю, как эти точки перехода могут быть значимыми. Во-первых, я понимаю, что последовательность входных высот H - это просто значения на оси Y дендрограммы. Поэтому последовательность высоты H должна быть в порядке возрастания. Поэтому как может быть точка в векторе различий, где мы переходим от положительного к отрицательному?

Например:

Предположим, что наша последовательность ввода высоты Н {1, 1.5, 2, 2.5, 3, 7, 9} и наше опорное значение l является средняя высота (которая будет 3.7). Поэтому, если мы создадим вектор разности D, вычитая l с каждой высоты в H, мы получим {-2.7, -2.2, -1.7, -1.2, -0.7, 3.3, 5.3}. Так ясно, что здесь нет точки перехода и не может быть, потому что в векторе разностей нет точек D[i] > 0 и D[i+1] < 0, так как последовательность высоты H находится в порядке возрастания.

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

Так может ли что-то объяснить, что алгоритм DynamicTreeCut пытается достичь здесь, и где мое понимание идет не так?

Ответ 1

Я полностью согласен с вашим пониманием статьи и алгоритма. Я пришел к такому же выводу, что и вы.

То, что я предлагаю, - это спекуляция. Но я очень уверен в этом.

  • В документе говорится, что точки останова дают вам ограничения между кластерами. Две последовательные точки останова определяют кластер

Непосредственный вывод состоит в том, что вы не можете дать H в качестве упорядоченного списка высот. Вместо этого она должна быть высотой, когда вы переупорядочиваете точки для визуализации, то есть "так, чтобы линии в полученном графике не пересекались"

Пример дендрограммы

В этом примере H станет (0,70, 0,35, 0,90, 0,45, 0,77, 0,40, 0,30, 0,55, 0,05). Чтобы уточнить, первая запись 0.70 - это высота линии слияния между 1-й и 2-й точками (здесь называются 3 и 7). Обратите внимание, что визуализация не уникальна, но результат алгоритма в конце будет.

  • Точки останова и переход определяются непрерывным множеством точек над 0-строкой.

Вывод: из-за того, что внутри кластера высота слияния низкая, а кластер имеет свои положительные значения H-l, вы хотите, чтобы большой пакет с низким уровнем слияния (то есть кластер) стоял над 0-строкой. Поэтому вместо использования уровней слияния используйте отрицательный

В этом примере H станет (-0,70, -0,35, -0,90,...).


Попробуем мое предположение и получим l = -0.75

H-1 становится (0,05, 0,40, -0,15, 0,30, -0,02, 0,35, 0,45, 0,20, 0,70)

И у вас есть два перехода, которые определяют 3 кластера: (3-7-6), (1-4) и (9-5-8-10-2). См. Изображение для справки. Что действительно разумно.

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

Кроме того, как еще одна страховка, я не совсем ошибаюсь, когда у вас есть несколько отрицательных значений один за другим, это означает, что это соответствует одиночным числам, которые являются выбросами, что является именно тем, что Node 54 (на рисунке 5 статьи вы связаны). Несколько смежных отрицательных значений сами по себе не образуют кластер, они являются однополюсниками, очень отличающимися друг от друга. Только смежные группы выше 0 образуют кластер