Pergunta

Estou tentando realizar um agrupamento hierárquico usando uma medida de distância personalizada. Eu executo todos os cálculos em Python e, em seguida, passo as estruturas de dados para R para fazer o clustering

import rpy2.robjects as robjects
r=robjects.r
from rpy2.robjects.packages import importr
stats = importr('stats')

m = r.matrix(robjects.FloatVector(list_of_data), ncol=size, byrow=True)
dist_mat=stats.as_dist(m) 
hc=stats.hclust(new_dist_mat)

Portanto, minhas medidas de distância são mantidas em uma lista Python, convertida em uma matriz R, que é então convertida em um objeto dist necessário para o agrupamento. Isso funciona até certo ponto. No entanto, quando a matriz fica muito grande e eu recebo este erro:

python(18944,0xb0081000) malloc: *** mmap(size=168898560) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
Error: cannot allocate vector of size 161.1 Mb

Isso ocorre no ponto em que eu converto em um objeto dist (as.dist). Não testei em que tamanho ele se desfaz, mas funciona com uma matriz de 3000x3000, mas falha com uma matriz de 6500x6500, portanto, em algum lugar no meio. Estou usando a função del em Python para tentar remover quaisquer objetos desnecessários da memória, mas pelo que li isso não garante que a memória ficará imediatamente disponível para uso.

Então, em última análise, existe uma maneira mais eficiente de memória para obter um objeto dist? Ou talvez haja um método alternativo que eu possa usar? Encontrei alguns outros métodos na biblioteca cluster de R, que não usam um objeto dist, mas esses métodos usam métricas de distância integradas.

Desde já, obrigado!

Foi útil?

Solução

Chamar del () do Python não garante que a memória esteja imediatamente disponível para uso.Chamar o coletor de lixo ajuda explicitamente.A resposta para outra pergunta aqui ( Limpando a memória usada por rpy2) aponta para a seção relevante na documentação do rpy2.

Em relação aos algoritmos de agrupamento, agrupamento hierárquico com hclust () requer uma matriz de "distância" (de tamanho n * (n + 1) / 2; R economiza um pouco de memória já que a matriz é simétrica).Existem outros algoritmos de agrupamento, ou se interessado em truques de agrupamento hierárquico para minimizar o tamanho da matriz inicial criando blocos iniciais, mas isso está fora do escopo de uma questão relacionada à programação.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top