[R-es] Optimización identificación de casos similares

Javier Marcuzzi j@v|er@ruben@m@rcuzz| @end|ng |rom gm@||@com
Vie Feb 8 03:32:43 CET 2019


Estimados

Si es por la cantidad de memoria, tal como indica Carlos Ortega, yo no
tengo experiencia ni conocimientos para el área referida en el hilo del
correo, pero sí me tocó tener que trabajar tratando de reducir la cantidad
de memoria al utilizar matrices, copio y pego un ejemplo por si es de
utilidad sobre sparse matrix en R, aunque debería leer si es aplicable para
el caso en concreto.

library('Matrix')

m1 <- matrix(0, nrow = 1000, ncol = 1000)
m2 <- Matrix(0, nrow = 1000, ncol = 1000, sparse = TRUE)

object.size(m1)
# 8000200 bytes
object.size(m2)
# 5632 bytes
Javier Rubén Marcuzzi

El jue., 7 feb. 2019 a las 20:49, Carlos Ortega (<cof using qualityexcellence.es>)
escribió:

> Hola,
>
> Puedes hacerlo de otras formas sin que tengas que calcular una matriz de
> distancias.
>
> Calcular la matriz de distancias de todos con todos, te lleva a tener una
> matriz de 1e5 x 1e5 de enteros (en el mejor de los casos) y esos son ya
> varias decenas de gigas.
> Una alternativa es esta:
>
>    - Calcular la distancia de Levenstein entre un DNI y la lista de DNIs.
>    - Del resultado ver si hay alguna distancia de "1" ó de "2"  que
>    indicaría un error a la hora de introducir el valor. Si aparece lo
> guardas.
>    - Y repetir este cálculo con otro DNI y así sucesivamente.
>    - En este escenario, solo haces una comparación en cada ciclo, no
>    consumes RAM. Solo consumes la RAM con los DNIs que vas guardando.
>    - Aquí, lo que ocurre es que el proceso es lento en ejecución.
>       - He probado comparando siempre el mismo DNI con una lista (siempre
>       la misma lista), que ordeno de forma aleatoria en cada ciclo.
>       - Y en mi máquina tarda 20min en hacer 25000 comparaciones.
>       - Y no he parelizado el bucle. Este problema es totalmente
>       paralelizable...
>
> Este es el código que he usado para hacer este ejemplo (sin paralelizar):
>
> #-------------
> library(stringdist)
>
> a <- "123456789"
> b <- "1234056789"
> c <- as.character(sample(1:1e5, 1e5, replace = FALSE))
>
> a <- Sys.time()
> for( i in 1:1000) {
>
>    to_compare <- sample(c(b,c), 1e5+1, replace = FALSE)
>    res_compa <- stringdist(a, to_compare, method="dl")
>    to_compare[ res_compa < 2]
>
> }
> b <- Sys.time() ; b -
> #-------------
>
> Saludos,
> Carlos Ortega
> www.qualityexcellence.es
>
>
> El jue., 7 feb. 2019 a las 17:24, David Contreras (<
> davidcontreras00 using gmail.com>) escribió:
>
> > Buen día a todos,
> >
> > Agradezco su ayuda con lo siguiente:
> >
> > Tengo 100.000 registros con nombres de personas con su respectivo número
> de
> > documento, quiero identificar casos que tengan un porcentaje de igualdad
> > alto, no del 100% porque ya esos los tengo identificados, sino casos como
> > por ejemplo:
> >
> > Nombre: Juan Pérez  Documento: 123456789
> > Nombre: Juan Pérez  Documento: 1234056789
> >
> > Este caso sería una alerta de posible duplicado y tendría que revisarse
> > porque posiblemente en uno de los dos casos se ingreso errado el número
> de
> > documento.
> >
> > Para calcular esta diferencia uso la función adist del paquete (utils),
> el
> > problema es que la forma en que tengo el código para revisar los 100.000
> > casos, la máquina no lo soporta por los recorridos que se hacen:
> >
> > *El dataframe se llama Citacion.*
> >
> > *Citacion[,"NombreDoc"]<- paste0(Citacion[,"NOMBRE"]," ",
> > Citacion[,"DOCUMENTO"]) # Concatena Nombre y documento*
> >
> > *Citacion[,"RNomDoc1"]<-0*
> > *Citacion[,"RNomDoc2"]<-0*
> >
> > *ii<-1*
> > *for(ii in 1:(nrow(Citacion)-1)){*
> > *  jj<-ii+1*
> > *  while(jj<=nrow(Citacion)){*
> >
> > *    if (adist(Citacion[ii,"NombreDoc"],
> > Citacion[jj,"NombreDoc"])/nchar(Citacion[ii,"NombreDoc"])<0.15){  #
> > Criterio para marcar los posibles casos duplicados*
> > *      Citacion[ii,"RNomDoc1"]<-1*
> > *      Citacion[jj,"RNomDoc2"]<-1*
> > *      jj<-jj+1*
> > *      } else {*
> > *        Citacion[jj,"RNomDoc2"]<-0*
> > *        jj<-jj+1*
> > *        } *
> > *  } *
> >
> > *}  *
> >
> > La idea es optimizar el código de alguna forma para agilizar el proceso y
> > lograr que se identifiquen los casos a revisar.
> >
> > Mil gracias de nuevo.
> >
> >         [[alternative HTML version deleted]]
> >
> > _______________________________________________
> > R-help-es mailing list
> > R-help-es using r-project.org
> > https://stat.ethz.ch/mailman/listinfo/r-help-es
> >
>
>
> --
> Saludos,
> Carlos Ortega
> www.qualityexcellence.es
>
>         [[alternative HTML version deleted]]
>
> _______________________________________________
> R-help-es mailing list
> R-help-es using r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-help-es
>

	[[alternative HTML version deleted]]



Más información sobre la lista de distribución R-help-es