k-medoids:控制 class 标签上的相同协议
k-medoids: control same agreement on class label
我在使用 k-medoids 控制两个 class 标签(1 和 2)的模式导致 classification 任务时遇到问题。在我的示例中,我想在两个区域 (ID
) g2
和 g3
中应用 cluster::clara
以及两个区域相同的 classification 标签:
# Packages
library(cluster)
library(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 ..
# Classification based in `R` and `HUE` variables
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)
# Plot the results
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]]
在地块中,区域g2
的class化与g3
相反,只进行一次class化g2
和g3
数据集在一起不是一个选项,因为我是我的原始数据集我有9万个区域而我的RAM内存只有64GB。
请帮我找到在几个地区之间就class化达成相同协议的方法吗?
有窍门!您需要始终从数据集的较高值或较低值开始,只需在分类之后放入和删除然后效果很好,在这种情况下使用变量 R
:[=12= 中的较低值]
library(dplyr)
my_ds_split<-my_ds[my_ds$ID==areas[i],]
min.start.value <- my_ds_split %>%
slice(which.min(R))
my_ds_split <- rbind(min.start.value,my_ds_split)
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<-my_ds_split.F[-c(1),]
我在使用 k-medoids 控制两个 class 标签(1 和 2)的模式导致 classification 任务时遇到问题。在我的示例中,我想在两个区域 (ID
) g2
和 g3
中应用 cluster::clara
以及两个区域相同的 classification 标签:
# Packages
library(cluster)
library(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 ..
# Classification based in `R` and `HUE` variables
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)
# Plot the results
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]]
在地块中,区域g2
的class化与g3
相反,只进行一次class化g2
和g3
数据集在一起不是一个选项,因为我是我的原始数据集我有9万个区域而我的RAM内存只有64GB。
请帮我找到在几个地区之间就class化达成相同协议的方法吗?
有窍门!您需要始终从数据集的较高值或较低值开始,只需在分类之后放入和删除然后效果很好,在这种情况下使用变量 R
:[=12= 中的较低值]
library(dplyr)
my_ds_split<-my_ds[my_ds$ID==areas[i],]
min.start.value <- my_ds_split %>%
slice(which.min(R))
my_ds_split <- rbind(min.start.value,my_ds_split)
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<-my_ds_split.F[-c(1),]