scikit-learn uso de memória DBSCAN

ATUALIZADA: No final, a solução que optei por usar para agrupar meu grande conjunto de dados foi um sugerido por Anony-Mousse abaixo. Isto é, usando a implementação DBSCAN da ELKI para fazer o meu clustering ao invés do scikit-learn. Ele pode ser executado a partir da linha de comando e, com a indexação adequada, executa essa tarefa em poucas horas. Use a GUI e conjuntos de dados de amostra pequenos para calcular as opções que você deseja usar e, em seguida, vá para a cidade. Vale a pena investigar. Anywho, continue a ler para uma descrição do meu problema original e algumas discussões interessantes.

Eu tenho um conjunto de dados com ~ 2,5 milhões de amostras, cada uma com 35 recursos (valores de ponto flutuante) que estou tentando agrupar. Eu tenho tentado fazer isso com a implementação do DBSCAN do scikit-learn, usando a métrica de distância de Manhattan e um valor de épsilon estimado a partir de algumas pequenas amostras aleatórias extraídas dos dados. Por enquanto, tudo bem. (aqui está o trecho, para referência)

db = DBSCAN(eps=40, min_samples=10, metric='cityblock').fit(mydata)

Meu problema no momento é que fico sem memória facilmente. (Atualmente estou trabalhando em uma máquina com 16 GB de RAM)

A minha pergunta é: o DBSCAN calcula a matriz de distâncias emparelhadas enquanto é executada, e é isso que está devorando a minha memória? (2,5 milhões ^ 2) * 8 bytes é obviamente estupidamente grande, eu entenderia isso. Eu não deveria estar usando ofit() método? E, mais geralmente, há uma maneira de contornar essa questão, ou eu geralmente estou latindo na árvore errada aqui?

Desculpas se a resposta acabar sendo óbvia. Eu tenho me intrigado sobre isso por alguns dias. Obrigado!

Adendo: Além disso, se alguém puder explicar a diferença entrefit(X) efit_predict(X) para mim mais explicitamente eu também aprecio isso - eu tenho medo que eu não entendi bem.

Adendo # 2: Para ter certeza, eu tentei isso em uma máquina com ~ 550 GB de RAM e ele ainda explodiu, então eu sinto que o DBSCAN está tentando fazer uma matriz de distância de pares ou algo que eu claramente não quero façam. Eu acho que agora a grande questão é como parar esse comportamento, ou encontrar outros métodos que possam atender mais às minhas necessidades. Obrigado por ter comigo aqui.

Adendo # 3 (!): Eu esqueci de anexar o traceback, aqui está ele,

Traceback (most recent call last):
  File "tDBSCAN.py", line 34, in <module>
    db = DBSCAN(eps=float(sys.argv[2]), min_samples=10, metric='cityblock').fit(mydata)
  File "/home/jtownsend/.local/lib/python2.6/site-packages/sklearn/base.py", line 329, in fit_predict
    self.fit(X)
  File "/home/jtownsend/.local/lib/python2.6/site-packages/sklearn/cluster/dbscan_.py", line 186, in fit
    **self.get_params())
  File "/home/jtownsend/.local/lib/python2.6/site-packages/sklearn/cluster/dbscan_.py", line 69, in dbscan
    D = pairwise_distances(X, metric=metric)
  File "/home/jtownsend/.local/lib/python2.6/site-packages/sklearn/metrics/pairwise.py", line 651, in pairwise_distances
    return func(X, Y, **kwds)
  File "/home/jtownsend/.local/lib/python2.6/site-packages/sklearn/metrics/pairwise.py", line 237, in manhattan_distances
    D = np.abs(X[:, np.newaxis, :] - Y[np.newaxis, :, :])
MemoryError

questionAnswers(5)

yourAnswerToTheQuestion