Python альтернативный способ найти дендрограмму

У меня есть данные размером 8000x100. Мне нужно объединить эти 8000 элементов. Я больше заинтересован в заказе этих предметов. Я мог бы получить желаемый результат из приведенного выше кода для небольших данных, но для более высокого измерения я продолжаю получать ошибку времени выполнения "RuntimeError: максимальная глубина рекурсии превышена при получении str объекта". Есть ли альтернативный способ получить переупорядоченный столбец от "Z".

from hcluster import pdist, linkage, dendrogram
import numpy
from numpy.random import rand

x = rand(8,100) # rand(8000,100) gives runtime error
Y = pdist(x)
Z = linkage(Y)
reorderedCol = dendrogram(Z)['ivl']


Traceback: 

>>> from hcluster import pdist, linkage, dendrogram
>>> import numpy
>>> from numpy.random import rand
>>> 

>>> x = rand(8000,100)
>>> Y = pdist(x)
>>> Z = linkage(Y)
>>> reorderedCol = dendrogram(Z)['ivl']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/hcluster/hierarchy.py", line 2062, in dendrogram
    link_color_func=link_color_func)
  File "/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/hcluster/hierarchy.py", line 2342, in _dendrogram_calculate_info
    link_color_func=link_color_func)
  File "/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/hcluster/hierarchy.py", line 2342, in _dendrogram_calculate_info
    link_color_func=link_color_func)
  File "/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/hcluster/hierarchy.py", line 2342, in _dendrogram_calculate_info

...
...

  File "/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/hcluster/hierarchy.py", line 2311, in _dendrogram_calculate_info
    link_color_func=link_color_func)
  File "/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/hcluster/hierarchy.py", line 2209, in _dendrogram_calculate_info
    _append_singleton_leaf_node(Z, p, n, level, lvs, ivl, leaf_label_func, i, labels)
  File "/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/hcluster/hierarchy.py", line 2091, in _append_singleton_leaf_node
    ivl.append(str(int(i)))
RuntimeError: maximum recursion depth exceeded while getting the str of an object
>>> 

2 ответа

Решение

Проблема в том, что дендрограмма является техникой визуализации. На 8000 объектов это уже становится практически нечитаемым. Вот почему это, вероятно, не было оптимизировано для этого.

Для больших наборов данных я рекомендую отойти от любого вида иерархического кластера (который имеет при реализации с матричными операциями O(n^3) время выполнения, а в некоторых случаях вы можете сделать это в O(n^2)), и вместо этого используйте, например, OPTICS (Википедия)не используйте OPTICS в Weka, или ту версию Python, которая плавает вокруг - ведь они оба неполные!).

Я даже не могу бежать dendrogramЯ получаю ошибку matplotlib not available. Plot request denied, Так что, вероятно, он действительно пытается визуализировать дендрограмму! Которая может не хватить памяти, если приложит много усилий для оптимизации визуализации. Делая это самостоятельно, как я показал вам в вашем другом вопросе Рассчитать порядок листьев дендрограммы, вы сможете избежать этих дополнительных затрат.

Есть ли причина, по которой вы используете hcluster вместо scipy.cluster.hierarchy?

но для более высокого измерения я продолжаю получать ошибку времени выполнения "RuntimeError: максимальная глубина рекурсии превышена при получении str объекта"

Проблема памяти может быть решена с помощью некоторой формы техники уменьшения размерности, такой как PCA или tSNE.

Уменьшить с 100 измерений до 20 или около того

Для запуска tSNE требуется время, поэтому вы можете уменьшить его с 100 димов до 50 димов (скажем) с помощью PCA (быстрее), а затем использовать tSNE для перехода к 10 димам или около того.

Осторожно: это приведет к потере данных, но может просто выполнить работу.

Другие вопросы по тегам