6 votos

Agrupamiento de datos en contenedores de tamaños variables

Me gustaría construir un modelo (en R o excel), que toma en gran cantidad de datos lineales y segmentos en "papeleras". Los datos lineales es un atributo que refleja lo que la condición de que la sección/registro.

Me gustaría simplificar los datos y generalizar sobre las secciones como se ve en el ejemplo a continuación. Esto podría ser hecho basado en una distribución normal, con un intervalo de confianza o cualquier otro método que se puede recomendar. La idea es que al agregar los datos en más generalizado de las papeleras. Cada contenedor debe tener al menos 4 secciones/registros, pero no más de 10.

Así que, en breve, me gustaría hacer lo siguiente:

  1. Quiero un método de agrupamiento grupo de mis datos
  2. Quiero que cada grupo tiene de 4 a 10 miembros siempre
  3. Quiero que los elementos de cada grupo para sucesivas por ejemplo A001_002 no se agrupan con A001_999

He aquí un ejemplo de lo que quiero hacer seguido por un volcado de datos. Tenga en cuenta que tengo alrededor de 100.000 de estos puntos.

Condition rating example

Section_ID  Condition_Rating
A001_001    3
A001_002    2
A001_003    1
A001_004    3
A001_005    4
A001_006    5
A001_007    0
A001_008    0
A001_009    0
A001_010    1
A001_011    2
A001_012    3
A001_013    2
A001_014    8
A001_015    9
A001_016    10
A001_017    9
A001_018    8
A001_019    2
A001_020    3
A001_021    4
A001_022    9
A001_023    5
A001_024    3

8voto

jldugger Puntos 7490

Un programa dinámico para minimizar la suma de grupo desviaciones sujeto a estas restricciones es simple y razonablemente rápida, especialmente para un estrecho rango de tamaños de grupo. Se reproduce el publicado solución.

Figure

Los datos se representan como punto de símbolos. Los grupos están codificadas por color y separados por líneas verticales. El grupo de medios se trazan como líneas horizontales.

Comentó R código de la siguiente manera. Calcula la solución de forma recursiva, el logro de la eficiencia mediante el almacenamiento en caché de los resultados a medida que avanza. El programa cluster(x,i) encuentra (y posteriormente registra) la mejor solución empieza en el índice i en la matriz de datos x buscando entre todos los posibles ventanas de longitudes n.min través n.max inicio índice i. Vuelve el mejor valor encontrado hasta el momento (y, dentro de la variable global cache$Breaks, deja tras de sí un indicador de los índices que se inicia cada grupo). Puede procesar matrices de miles de elementos en cuestión de segundos, dependiendo de cuán grande sea el rango de n.max-n.min es. Para problemas más grandes que tendría que ser mejorado para incluir algunos branch-and-bound heurística para limitar la cantidad de la búsqueda.

#
# Univariate minimum-variance clustering with constraints.
# Requires a global data structure `cache`.
#
cluster <- function(x, i) { 
  #
  # Cluster x[i:length(x)] recursively.
  # Begin with the terminal cases.
  #
  if (i > cache$Length) return(0)                    # Nothing to process   $
  cache$Breaks[i] <<- FALSE                          # Unmark this break    $
  if (i + cache$n.min - 1 > cache$Length) return(Inf)# Interval is too short
  if (!is.na(v <- cache$Cache[i])) return(v)         # Use the cached value $
  n.min <- cache$n.min + i-1                         # Start of search      $
  n.max <- min(cache$n.max + i-1, cache$Length)      # End of search
  if (n.max < n.min) return(0)                       # Prevents `R` errors
  #
  # The recursion: accumulate the best total within-group variances.
  # To implement other objective functions, replace `var` by any measure of
  # within-group homogeneity.
  #
  values <- sapply(n.min:n.max, function(k) var(x[i:k]) + cluster(x, k+1))
  #
  # Find and store the best result.
  #              
  j <- which.min(values) 
  cache$Breaks[n.min + j] <<- TRUE  # Mark this as a good break $
  cache$Cache[i] <<- values[j]      # Cache the result          $
  return(values[j])                 # Pass it to the caller
}
#
# The data.
#
x <- c(3,2,1,3,4,5,0,0,0,1,2,3,2,8,9,10,9,8,2,3,4,9,5,3)
#
# Initialize `cache` to specify the constraints; and run the clustering.
#
system.time({
  n <- length(x)
  cache <- list(n.min=4, n.max=10,      # The length constraints
                Cache=rep(NA, n),       # Values already found
                Breaks=rep(FALSE, n+1), # Group start indexes
                Length=n)               # Cache size
  cluster(x, 1)           # I.e., process x[1:n]
  cache$Breaks[1] <- TRUE # Indicate the start of the first group $
})
#
# Display the results.
#
breaks <- (1:(n+1))[cache$Breaks]                # Group start indexes $
groups <- cumsum(cache$Breaks[-(n+1)])           # Group identifiers
averages <- tapply(x, groups, mean)              # Group summaries
colors <- terrain.colors(max(groups))            # Group plotting colors

plot(x, pch=21, bg=colors[groups], ylab="Rating")
abline(v = breaks-1/2, col="Gray")
invisible(mapply(function(left, right, height, color) {
  lines(c(left, right)-1/2, c(height, height), col=color, lwd=2)
}, breaks[-length(breaks)], breaks[-1], averages, colors))

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X