es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

k-medoids: controlar el mismo acuerdo en etiqueta de clase.

Tengo un problema con el control del patrón de dos etiquetas de clase (1 y 2) en la tarea de clasificación usando k-medoids. Me gustaría aplicar cluster::clara en dos áreas (ID) g2 yg3 y la misma etiqueta de clasificación para ambas áreas, en mi ejemplo:

Paquetes

biblioteca(cluster)
biblioteca(ggplot2)

my_ds <- read.csv(“https://raw.githubusercontent.com/Leprechault/trash/main/class_areas_ds.csv”)
str(my_ds)

‘data.frame’: 194789 obs. of 5 variables:

$ x : num 426060 426060 426060 426060 426060 …

$ y : num 8217410 8217410 8217410 8217410 8217410 …

$ ID : chr “g2” “g2” “g2” “g2” …

$ R : num 0.455 0.427 0.373 0.463 0.529 …

$ HUE: num -0.00397 -0.00384 -0.0028 -0.00369 -0.00352 ..

Clasificación basada en las variables ‘R’ y ‘HUE’

res<-NULL
areas<-unique(my_ds$ID)
for(i in 1:length(areas)){
my_ds_split<-my_ds[my_ds$ID==areas[i],]
k.medoids.res<-cluster::clara(my_ds_split[,4:ncol(my_ds_split)], 2, metric =”manhattan”)
my_ds_split.F<-cbind(my_ds_split, class = k.medoids.res$clustering)
my_ds_split.F$class<-ifelse(my_ds_split.F$class==1,0,1)
res<-rbind(res,cbind(my_ds_split.F))
}
res<-as.data.frame(res)

Gráficos de los resultados

plots <- list()
for (g in 1:length(areas)) {
my_ds_split_class<-res[res$ID==areas[g],]
plots[[g]] <- ggplot() +
geom_point(data=my_ds_split_class,
aes(x=x, y=y, color=class)) +
theme_void()
}
plots[[1]]
plots[[2]]

En los gráficos, la clasificación del área g2 es opuesta a la de g3 y hacer solo una clasificación con los conjuntos de datos g2 y g3 juntos no es una opción, porque en mi conjunto de datos original tengo 90 mil áreas y mi memoria RAM es solo 64GB.

Por favor, ¿alguna ayuda para encontrar cualquier forma de crear el mismo acuerdo de clasificación entre varias áreas?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una forma de asegurar el mismo acuerdo de clasificación entre varias áreas es primero determinar el número óptimo de clústeres para todo el conjunto de datos utilizando el paquete NbClust, que proporciona diferentes métodos para determinar el número de clústeres. Una vez que se determina el número óptimo de clústeres, puede aplicar el mismo algoritmo de clasificación a cada área por separado, pero utilizando el mismo número de clústeres para todas las áreas.

    Aquí hay un ejemplo de código que demuestra este enfoque:

    “`{r}
    library(cluster)
    library(ggplot2)
    library(NbClust)

    my_ds <- read.csv(“https://raw.githubusercontent.com/Leprechault/trash/main/class_areas_ds.csv”)

    determine el número óptimo de clústeres para todo el conjunto de datos

    set.seed(123)
    nc <- NbClust(my_ds[, 4:5], min.nc=2, max.nc=6, method = “kmeans”)

    asumimos que el número óptimo de clústeres es 2

    k <- 2

    aplicamos k-medoids a cada área con el mismo número de clústeres

    res <- NULL
    areas <- unique(my_ds$ID)
    for(i in 1:length(areas)){
    my_ds_split <- my_ds[my_ds$ID==areas[i],]
    k.medoids.res <- cluster::clara(my_ds_split[,4:5], k, metric =”manhattan”)
    my_ds_split.F <- cbind(my_ds_split, class = k.medoids.res$clustering)
    my_ds_split.F$class <- ifelse(my_ds_split.F$class==1, 0, 1)
    res <- rbind(res,cbind(my_ds_split.F))
    }
    res <- as.data.frame(res)

    Graficamos los resultados

    plots <- list()
    for (g in 1:length(areas)) {
    my_ds_split_class <- res[res$ID==areas[g],]
    plots[[g]] <- ggplot() +
    geom_point(data=my_ds_split_class, aes(x=x, y=y, color=class)) +
    theme_void()
    }
    plots[[1]]
    plots[[2]]
    “`

    Este enfoque asegura que se utilice el mismo número de clústeres para todas las áreas y, por lo tanto, el acuerdo de clasificación entre áreas será el mismo.

Comments are closed.