Domanda

Sto cercando di eseguire un raggruppamento gerarchico utilizzando una misura di distanza personalizzata. Eseguo tutti i calcoli in Python e poi passo le strutture dati a R per fare il 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)

Quindi le mie misure di distanza sono contenute in una lista Python, convertita in una matrice R, che viene poi convertita in un oggetto dist richiesto per il clustering. Questo funziona in una certa misura. Tuttavia, quando la matrice diventa troppo grande e ottengo questo errore:

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

Ciò si verifica nel punto in cui converto in un oggetto dist (as.dist). Non ho testato a quale dimensione cade a pezzi, ma funziona con una matrice 3000x3000, ma non riesce con una matrice 6500x6500, quindi da qualche parte nel mezzo. Sto usando la funzione del in Python per provare a rimuovere dalla memoria qualsiasi oggetto non necessario, ma da quanto ho letto questo non garantisce che la memoria diventi immediatamente disponibile per l'uso.

Quindi, in definitiva, esiste un modo più efficiente in termini di memoria per ottenere un oggetto dist? O c'è forse un metodo alternativo che potrei usare? Ho trovato altri metodi nella libreria cluster di R, che non utilizzano un oggetto dist, ma questi metodi utilizzano metriche di distanza incorporate.

Grazie in anticipo!

È stato utile?

Soluzione

Chiamare del () di Python non garantisce che la memoria diventi immediatamente disponibile per l'uso.Chiamare il garbage collector aiuta esplicitamente.La risposta a un'altra domanda qui ( Cancellazione della memoria utilizzata da rpy2) punta alla sezione pertinente nella documentazione di rpy2.

Per quanto riguarda gli algoritmi di clustering, il clustering gerarchico con hclust () richiede una matrice di "distanza" (di dimensione n * (n + 1) / 2; R risparmia un po 'di memoria poiché la matrice è simmetrica).Esistono altri algoritmi di clustering, o se appassionato di trucchi di clustering gerarchico per ridurre al minimo la dimensione della matrice iniziale creando blocchi iniziali, ma questo è al di fuori dell'ambito di una domanda relativa alla programmazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top