You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 06:34:57