Pregunta

Estoy intentando realizar una agrupación jerárquica utilizando una medida de distancia personalizada.Realizo todos los cálculos en Python y luego paso las estructuras de datos a R para realizar la agrupación.

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)

Entonces mis medidas de distancia se mantienen en una lista de Python, convertida a una matriz R, que luego se convierte en una dist objeto requerido para la agrupación.Esto funciona hasta cierto punto.Sin embargo, cuando la matriz se vuelve demasiado grande, aparece este error:

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

Esto ocurre en el punto donde convierto a un dist objeto (as.dist).No he probado en qué tamaño se desmorona, pero funciona con una matriz de 3000x3000, pero falla con una matriz de 6500x6500, por lo que está en algún punto intermedio.estoy usando el del funciona en Python para intentar eliminar cualquier objeto innecesario de la memoria, pero por lo que he leído, esto no garantiza que la memoria estará inmediatamente disponible para su uso.

Entonces, en última instancia, ¿existe una forma más eficiente en memoria de obtener una dist ¿objeto?¿O quizás exista algún método alternativo que pueda utilizar?He encontrado algunos otros métodos en R. cluster biblioteca, que no utiliza un dist objeto, pero estos métodos utilizan métricas de distancia integradas.

¡Gracias de antemano!

¿Fue útil?

Solución

Llamar a del() de Python no garantiza que la memoria esté inmediatamente disponible para su uso.Llamar explícitamente al recolector de basura ayuda.La respuesta a otra pregunta aquí (Borrar la memoria utilizada por rpy2) apunta a la sección correspondiente en la documentación de rpy2.

Con respecto a los algoritmos de agrupamiento, el agrupamiento jerárquico con hclust() requiere una matriz de "distancia" (de tamaño n * (n + 1) / 2;R ahorra un poco de memoria ya que la matriz es simétrica).Existen otros algoritmos de agrupación, o si le gustan los trucos de agrupación jerárquica para minimizar el tamaño de la matriz inicial mediante la creación de bloques iniciales, pero eso está fuera del alcance de una pregunta relacionada con la programación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top