k-medoids: контролируйте одно и то же соглашение на этикетке класса

#r #cluster-analysis #k-means #unsupervised-learning

#r #кластерный анализ #к-означает #без присмотра-обучение

Вопрос:

У меня проблема с контролем шаблона двух меток классов (1 и 2), что приводит к задаче классификации с использованием k-медоидов. Я хотел бы применить cluster::clara в двух областях ( ID ) g2 и g3 одну и ту же классификационную метку для обеих областей, в моем примере:

 # Packages library(cluster) library(ggplot2)  my_ds lt;-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 ..  # Classification based in `R` and `HUE` variables reslt;-NULL areaslt;-unique(my_ds$ID) for(i in 1:length(areas)){  my_ds_splitlt;-my_ds[my_ds$ID==areas[i],]  k.medoids.reslt;-cluster::clara(my_ds_split[,4:ncol(my_ds_split)], 2, metric ="manhattan")  my_ds_split.Flt;-cbind(my_ds_split, class = k.medoids.res$clustering)  my_ds_split.F$classlt;-ifelse(my_ds_split.F$class==1,0,1)  reslt;-rbind(res,cbind(my_ds_split.F)) } reslt;-as.data.frame(res)  # Plot the results plots lt;- list() for (g in 1:length(areas)) {  my_ds_split_classlt;-res[res$ID==areas[g],] plots[[g]] lt;- ggplot()    geom_point(data=my_ds_split_class,   aes(x=x, y=y, color=class))    theme_void() }  plots[[1]]  

р1

 plots[[2]]   

р2

На графиках классификация области g2 противоположна g3 и сделать только одну классификацию с g2 набором данных и g3 набором данных вместе не вариант, потому что я-мой исходный набор данных, у меня 90 тысяч областей, а моя оперативная память составляет всего 64 ГБ.

Пожалуйста, помогите мне найти способ создать одно и то же соглашение о классификации между несколькими областями?

Ответ №1:

В этом есть какой-то подвох! Вам нужно всегда начинать с более высоких или более низких значений набора данных, просто ставьте и удаляйте их только после классификации и работает очень хорошо, в этом случае используя меньшее значение в переменной R :

 library(dplyr)  my_ds_splitlt;-my_ds[my_ds$ID==areas[i],]  min.start.value lt;- my_ds_split %gt;%   slice(which.min(R))  my_ds_split lt;- rbind(min.start.value,my_ds_split)  k.medoids.reslt;-cluster::clara(my_ds_split[,4:ncol(my_ds_split)], 2, metric ="manhattan")  my_ds_split.Flt;-cbind(my_ds_split, class = k.medoids.res$clustering)  my_ds_split.Flt;-my_ds_split.F[-c(1),]