ValueError: Превышено максимально допустимое измерение, AgglomerativeClustering fit_predict - PullRequest
0 голосов
/ 04 февраля 2019

Я пытаюсь приспособить иерархическую кластеризацию к 23-мерному набору данных из 100 000 объектов.Как решить следующую ошибку?

>>>ac = AgglomerativeClustering(n_clusters=2, affinity='euclidean', linkage='complete')
>>>k=hf.features_itter(hf.file)
>>>k


array([[49,  0,  3, ...,  0,  0,  3],
       [39,  1,  4, ...,  0,  0,  3],
       [25,  0,  3, ...,  0,  0,  1],
       ...,
       [21,  0,  6, ...,  0,  0,  1],
       [47,  0,  8, ...,  0,  0,  2],
       [28,  1,  2, ...,  0,  1,  3]], dtype=uint8)

>>>res = ac.fit_predict(k)

Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    hierarchical()
  File "C:\Users\Tolis\Downloads\WPy-3670\notebooks\ergasia\clustering.py", line 39, in hierarchical
    ac.fit_predict(k)
  File "C:\Users\Tolis\Downloads\WPy-3670\python-3.6.7\lib\site-packages\sklearn\base.py", line 355, in fit_predict
    self.fit(X)
  File "C:\Users\Tolis\Downloads\WPy-3670\python-3.6.7\lib\site-packages\sklearn\cluster\hierarchical.py", line 830, in fit
    **kwargs)
  File "C:\Users\Tolis\Downloads\WPy-3670\python-3.6.7\lib\site-packages\sklearn\externals\joblib\memory.py", line 329, in __call__
    return self.func(*args, **kwargs)
  File "C:\Users\Tolis\Downloads\WPy-3670\python-3.6.7\lib\site-packages\sklearn\cluster\hierarchical.py", line 584, in _complete_linkage
    return linkage_tree(*args, **kwargs)
  File "C:\Users\Tolis\Downloads\WPy-3670\python-3.6.7\lib\site-packages\sklearn\cluster\hierarchical.py", line 470, in linkage_tree
    out = hierarchy.linkage(X, method=linkage, metric=affinity)
  File "C:\Users\Tolis\Downloads\WPy-3670\python-3.6.7\lib\site-packages\scipy\cluster\hierarchy.py", line 708, in linkage
    y = distance.pdist(y, metric)
  File "C:\Users\Tolis\Downloads\WPy-3670\python-3.6.7\lib\site-packages\scipy\spatial\distance.py", line 1877, in pdist
    dm = np.empty((m * (m - 1)) // 2, dtype=np.double)
ValueError: Maximum allowed dimension exceeded

ValueError: Превышен максимально допустимый размер

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Спасибо за ответ!Мне пришлось использовать иерархическую кластеризацию, потому что это был случай, поэтому я следовал решению, описанному в ссылка

0 голосов
/ 05 февраля 2019

Полагаю, из-за некоторых свойств этого алгоритма нет элегантного решения этой проблемы с использованием агломерационной кластеризации.Вы измеряете расстояния между всеми парами объектов, пока функция

y = distance.pdist(y, metric)

вызывается внутри AgglomerativeClustering.

Итак, алгоритм AgglomerativeClustering не подходит для больших или даже средних наборов данных:

Стандартный алгоритм иерархической агломерационной кластеризации (HAC) имеет временную сложность O(n ^ 3) и требует O (n ^ 2) памяти, что делает его слишком медленным даже для средних наборов данных.

- потому что он медленный, а также есть O(n^2) память.Даже если алгоритм оптимально использует оперативную память, матрица попарных расстояний потребляет ~ 1015 * байт (~ 40 Гб) памяти - потому что каждое значение float32 потребляет 4 байта, а таких измерений 10.000 * 10.000.Вероятно, недостаточно памяти.

(я протестировал попарное расстояние для 100 000 случайных точек с ~ 100 ГБ ОЗУ, и он вычисляет soooo long - хотя и не провалился)

Кроме того, он будет работать очень долго - из-за сложности O(n^3) времени.

Я предлагаю вам попробовать sklearn.cluster.DBSCAN - у него аналогичное поведение для некоторых данных ( sklearn examples ), кроме того, он работает намного быстрее и потребляет намного меньше памяти:

DBSCAN - Плотная кластеризация приложений с шумом на основе плотности.Находит образцы керна высокой плотности и расширяет кластеры из них.Подходит для данных, которые содержат кластеры с одинаковой плотностью.

Потребление памяти:

Эта реализация массово вычисляет все запросы соседства, что увеличивает сложность памяти до O (nd)где d - среднее число соседей, в то время как исходный DBSCAN имел сложность памяти O (n).При запросе этих ближайших окрестностей может возникнуть более сложная память, в зависимости от алгоритма

Сложность времени: средняя O(n log n), но зависит от реализации, в худшем случае O(n^2) - лучше, чемO(n^3) для агломерационных.

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

...