Question

Je suis en train d'effectuer une classification hiérarchique en utilisant une mesure de distance personnalisée. J'exécute tous les calculs en Python, puis passe les structures de données à R pour faire le regroupement

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)

Alors mes mesures de distance ont lieu dans une liste Python, convertis en une matrice R, qui est ensuite transformé en un objet dist requis pour le regroupement. Cela fonctionne dans une certaine mesure. Cependant, lorsque la matrice devient trop grand et je reçois cette erreur:

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

Cela se produit à l'endroit où je convertir à un objet dist (de as.dist). Je ne l'ai pas testé à quelle taille il tombe en morceaux, mais il fonctionne avec 3000x3000 matrice, mais échoue avec une matrice 6500x6500, donc quelque part entre les deux. J'utilise la fonction del en Python pour essayer enlever les objets inutiles de la mémoire, mais de ce que j'ai lu cela ne garantit pas que la mémoire sera immédiatement disponible.

Alors, en fin de compte, est-il un moyen plus efficace de la mémoire pour obtenir un objet dist? Ou est-il peut-être une autre méthode que je pourrais utiliser? Je l'ai trouvé d'autres méthodes dans la bibliothèque de cluster de R, qui n'utilisent pas un objet dist, mais ces méthodes utilisent des mesures de distance intégrée.

Merci à l'avance!

Était-ce utile?

La solution

Appel Python del () ne garantit pas que la mémoire devient immédiatement disponible. Appel du garbage collector permet explicitement. La réponse à une autre question ici ( Effacement de la mémoire utilisée par rpy2 ) des points à la section correspondante dans la documentation rpy2.

En ce qui concerne les algorithmes de clustering regroupement hiérarchique avec hclust () ne nécessite une matrice "distance" (de taille n * (n + 1) / 2; R enregistre un bit de la mémoire depuis la matrice est symétrique). Il existe d'autres algorithmes de regroupement, ou si désireux de tours de regroupement hiérarchique pour réduire la taille de la matrice à partir en créant des blocs de départ, mais qui est en dehors du cadre d'une question liée à la programmation.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top