Sto cercando di eseguire un clustering gerarchico usando una misura della 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 a dist
oggetto richiesto per il clustering. Questo funziona in parte. 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 a dist
oggetto (as.dist
). Non ho provato a quale dimensione cada a pezzi, ma funziona con una matrice 3000x3000, ma fallisce con una matrice 6500x6500, quindi da qualche parte nel mezzo. Sto usando il del
funzione in Python per provare a rimuovere dalla memoria eventuali oggetti non necessari, ma da quello che ho letto non garantisce che la memoria sia immediatamente disponibile per l'uso.
Quindi, alla fine, c'è un modo più efficiente di memoria per ottenere un dist
oggetto? O c'è forse un metodo alternativo che potrei usare? Ho trovato altri metodi in R "s cluster
libreria, che non usa a dist
oggetto, ma questi metodi utilizzano metriche di distanza incorporate.
Grazie in anticipo!
risposte:
2 per risposta № 1Chiamare Python "s del () non garantisce che la memoria sia immediatamente disponibile per l'uso. Chiamare il garbage collector aiuta esplicitamente. La risposta ad 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 gerarchicoil clustering con hclust () richiede una matrice "distanza" (di dimensione n * (n + 1) / 2; R salva un po 'di memoria poiché la matrice è simmetrica). Esistono altri algoritmi di clustering, o se siete appassionati di trucchi di clustering gerarchici per minimizzare la dimensione della matrice di partenza creando blocchi iniziali, ma questo è al di fuori dell'ambito di una domanda relativa alla programmazione.