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 димам или около того.
Осторожно: это приведет к потере данных, но может просто выполнить работу.