Структуры данных для реализации иерархической кластеризации

Если бы я реализовал алгоритм иерархической кластеризации, скажем, на C/C++ или Java, учитывая функции для вычисления расстояния между кластерами и внутри кластеров,

1. каким был бы мой выбор (наряду с другими вариантами) реализовать структуры данных при сохранении результатов вычисленных кластеров в каждом «проходе» из метрики близости, которая определяется как n ^ 2 ниже.

        Corresponding Proximity matrix
   p1 p2 p3 p4 .... and hence n*n 
p1 d11 d12 d13 d14
p2 ...
p3...
p4 ...

2. Будет ли выбор структур данных отличаться, если я буду использовать построение соответствующих дендограмм сверху вниз, а не снизу вверх?

введите здесь описание изображения

Пример дендограммы снизу вверх (источник, Wiki)

3. Поскольку задача вычисления кластеров и их центроидов требует больших вычислительных ресурсов (жадный алгоритм?) — улучшится ли это при выборе структур данных — каковы абстрактные варианты, которые вы можете придумать?

4. Неужели существует такое понятие, как разреженная матрица [пост посчитав близость 2-х точек, которые потом нарастут, чтобы ассимилировать больше соседних точек, точек будет меньше , если бы мы сохранили наши «новые» расстояния в новой матрице] в этом контексте? Будет ли структура данных сокращаться/расти в соответствии с этой потребностью?

5. Может ли эта матрица существовать в памяти или части ее кластера - Если нет, то что мы должны перезагружать в память перед вычислением каждого следующего кластера (агломеративный кластеризация или что-то другое)

+1, если вы придерживаетесь концептуального (и, надеюсь, интуитивно понятного) ответа/или перенаправляете меня в этом направлении

PPS: мне не НУЖНА функция, которая поможет мне реализовать это - просто хочу понять это с точки зрения управления памятью и концептуальной точки зрения в отношении больших наборов данных. У меня очень мало знаний по этому вопросу, так что не обращайте внимания, если это звучит слишком примитивно.


comment
Может быть, вы могли бы 1. быть более конкретным 2. указать, что вы на самом деле пытаетесь сделать   -  person embert    schedule 21.02.2014


Ответы (1)


Я бы посоветовал вам взглянуть на статью об алгоритме Slink от R.Sibson. Она определяет структуру данных, называемую PointerHierarchy, с помощью которой вы можете разрезать дандограмму на заданном расстоянии, чтобы получить кластеры. Этот алгоритм не требует от вас предварительной подготовки матрицы подобия, что уменьшит объем памяти. В документе также приводится пример реализации на FORTRAN, который вы можете легко написать на языке по вашему выбору. Я использовал этот метод в своем производственном коде на Java, и результаты были неплохими.

person Bankelaal    schedule 13.06.2016