如何对PredictionClust/Prediction/R6对象取子集解决聚类大数据绘图问题
大数据量聚类结果绘图替代方案
可落地的替代绘图方案
- 降维采样散点绘制:先将高维特征通过PCA、UMAP等方法降到2维,对50万样本随机抽取1%5%的子样本(500025000个点),子样本保留原聚类标签,此时直接调用
autoplot()即可正常渲染,不会出现性能不足的问题,采样比例控制在5%以内即可完整保留聚类分布特征,不会出现明显偏差。 - 等高线密度绘制:不需要渲染单个散点,直接基于2维降维结果和聚类标签,使用密度等高线展示不同聚类的分布范围、重叠情况,资源占用仅为散点图的1%不到,适合全量数据可视化。
- 分箱聚合热力图绘制:如果需要保留全量数据的分布信息,先对2维坐标做等距分箱,统计每个分箱内的样本量、占比最高的聚类标签,用色块热力图展示聚类分布,性能远高于散点渲染。
PredictionClust/R6类预测对象的子集操作方法
mlr3体系下的PredictionClust、Prediction等R6类预测对象完全支持子集切片操作,操作逻辑如下:
- 预测对象的
$data属性、$response方法返回的结果和原数据集样本索引一一对应,先按需求生成采样的样本索引 - 直接对预测对象做索引切片即可生成子预测对象,示例:
pred_sub <- pred_clust[sample(nrow(pred_clust$data), 10000)] - 切片后的子预测对象可以直接调用
autoplot()方法,无性能压力 - 若要绘制等高线,不需要对预测对象取子集,直接提取全量的2维坐标+聚类标签传入密度绘图函数即可,运算量极低。
示例代码
# 子样本绘图 library(mlr3cluster) library(ggplot2) # 抽取1万条样本生成子预测对象 sample_idx <- sample(nrow(pred_clust$data), 10000) pred_sub <- pred_clust[sample_idx] # 直接绘制子样本聚类结果 autoplot(pred_sub, task = cluster_task) # 全量数据等高线绘图 # 提前获取全量样本的2维降维结果,此处以PCA为例 pca_emb <- prcomp(task$data(), scale. = TRUE)$x[, 1:2] plot_df <- data.frame( dim1 = pca_emb[,1], dim2 = pca_emb[,2], cluster = as.factor(pred_clust$response) ) ggplot(plot_df, aes(x = dim1, y = dim2, color = cluster, fill = cluster)) + geom_density_2d(bins = 8, linewidth = 0.8) + stat_density_2d(geom = "polygon", alpha = 0.2, bins = 8) + theme_bw()
内容的提问来源于stack exchange,提问作者Alberson Miranda
相关产品推荐
相关产品推荐

