如何用R的factoextra包筛选聚类中心附近的近邻数据点?
解决方法:提取聚类中心最近的80%数据点
kmeans()函数和factoextra包本身没有内置参数直接实现这个需求,但你可以通过计算样本到簇中心的距离,再按簇筛选最近的80%数据点,具体步骤如下:
步骤1:计算每个样本到所属簇中心的距离
利用kmeans结果中的cluster(簇分配)和centers(簇中心),为每个样本计算到对应簇中心的欧氏距离:
library(factoextra) library(dplyr) # 你的原始聚类代码 km.res <- kmeans(data, 4, nstart=10) # 多维数据通用的距离计算方法 data_with_dist <- data %>% mutate(cluster = km.res$cluster) %>% rowwise() %>% mutate( dist_to_center = sqrt(sum((c_across(everything()) - km.res$centers[cluster, ])^2)) ) %>% ungroup()
步骤2:按簇筛选最近的80%数据点
对每个簇的数据按距离从小到大排序,保留前80%的样本:
# 筛选每个簇中距离最近的80%数据点 filtered_data <- data_with_dist %>% group_by(cluster) %>% arrange(dist_to_center) %>% slice_head(prop = 0.8) %>% # 保留每个簇的前80%样本 ungroup() # 可选:去掉辅助列,只保留原始数据和簇分配 filtered_data_clean <- filtered_data %>% select(-dist_to_center)
步骤3:可视化筛选后的聚类结果
构造适配fviz_cluster的结果对象,验证筛选效果:
# 生成用于可视化的聚类结果对象 km_filtered <- km.res km_filtered$cluster <- filtered_data_clean$cluster fviz_cluster(km_filtered, data = filtered_data_clean, ellipse.type="norm", geom="point")
补充说明
- 这里的80%是每个簇内部的比例,符合聚类场景下的筛选逻辑;如果需要全局范围的80%,去掉
group_by(cluster)直接筛选即可。 - 用欧氏距离计算和
kmeans默认的距离度量一致,确保筛选逻辑和聚类逻辑匹配。
内容的提问来源于stack exchange,提问作者bgenomics
相关产品推荐
相关产品推荐

