Python реализация алгоритма оптики (кластеризации)

Я ищу достойную реализацию оптика алгоритм в Python. Я буду использовать его для формирования кластеров точек на основе плотности ((x,y) пар).

Я ищу что-то,что принимает пары (x, y) и выводит список кластеров, где каждый кластер в списке содержит список пар (x, y), принадлежащих этому кластеру.

6 ответов


EDIT: известно следующее не полная реализация оптики.

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

вот краткий пример того, как строить кластеры на выходе алгоритма оптики:

def cluster(order, distance, points, threshold):
    ''' Given the output of the options algorithm,
    compute the clusters:

    @param order The order of the points
    @param distance The relative distances of the points
    @param points The actual points
    @param threshold The threshold value to cluster on
    @returns A list of cluster groups
    '''
    clusters = [[]]
    points   = sorted(zip(order, distance, points))
    splits   = ((v > threshold, p) for i,v,p in points)
    for iscluster, point in splits: 
        if iscluster: clusters[-1].append(point)
        elif len(clusters[-1]) > 0: clusters.append([])
    return clusters

    rd, cd, order = optics(points, 4)
    print cluster(order, rd, points, 38.0)

Я не знаю полное и точная реализация оптики python. Ссылки, размещенные здесь, кажутся просто грубыми приближениями идеи оптики. Они также не используют индекс для ускорения, поэтому они будут работать в O(n^2) или скорее даже O(n^3).

оптика имеет ряд сложных вещей, помимо очевидной идеи. В частности, порог предлагается делать с помощью относительные пороги ("xi") вместо абсолютных порогов как опубликовано здесь (в этот момент результат будет примерно таким же, как DBSCAN!).

в оригинальной статье оптики содержится предлагаемый подход к преобразованию вывода алгоритма в фактические кластеры:

http://www.dbs.informatik.uni-muenchen.de/Publikationen/Papers/OPTICS.pdf

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

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


хотя технически оптика не существует, есть реализация HDBSCAN* для python, доступная в https://github.com/lmcinnes/hdbscan . Это эквивалентно оптике с бесконечным максимальным Эпсилоном и другим методом извлечения кластера. Поскольку реализация обеспечивает доступ к созданной иерархии кластеров, вы можете извлечь кластеры из нее с помощью более традиционных методов оптики, если хотите.

обратите внимание, что, несмотря на не ограничивая epsilon параметр эта реализация по-прежнему обеспечивает производительность O(N log(n)) с использованием алгоритмов минимального остовного дерева на основе KD-дерева и шарового дерева, и может обрабатывать достаточно большие объемы данных.


теперь существует библиотека pyclustering который содержит, среди прочего, Python и реализацию оптики на C++.


см. "подходы к кластеризации на основе плотности" на http://www.chemometria.us.edu.pl/index.php?goto=downloads


вы хотите посмотреть на кривую заполнения пространства или пространственный индекс. Sfc уменьшает 2D-сложность до 1D-сложности. Вы хотите посмотреть на блог пространственного индекса квадрата кривой Гильберта Ника. Вы хотите загрузить мою реализацию sfc на phpclasses.org (Гильберт-кривая).