R语言中PCA预处理后,基于前3个主成分可视化K-means聚类的方法
基于3个主成分的K-means聚类可视化方案
问题说明
我在R中对数据做PCA预处理后执行K-means聚类,发现factoextra包的fviz_cluster函数仅支持基于前两个主成分的二维可视化。现需要能利用保留的3个主成分进行聚类可视化的替代方法,当前代码如下:
# Load necessary libraries library(ggplot2) library(cluster) library(GGally) library(dplyr) library(factoextra) # Load the data data <- read.csv("Hydro_lm.csv") # Replace any missing data with NA data[data == ""] <- NA # Check for missing values if (any(is.na(data))) { cat("Warning: There are missing values in the dataset. They have been replaced with NA.\n") } # Min-max normalization function min_max_normalize <- function(x) { return((x - min(x, na.rm = TRUE)) / (max(x, na.rm = TRUE) - min(x, na.rm = TRUE))) } # Apply min-max normalization to each column data_normalized <- as.data.frame(lapply(data, min_max_normalize)) # Perform PCA on the normalized data pca_result <- prcomp(data_normalized, center = TRUE, scale. = FALSE) summary(pca_result) #keep first 3 PC hydro_transform = as.data.frame(-pca_result$x[,1:3]) hydro_transform # Decide on the number of clusters using Elbow Method on PCA results fviz_nbclust(hydro_transform, kmeans, method = "wss") #vizualize clusters k = 4 kmeans_hydro = kmeans(hydro_transform, centers = k, nstart = 50) kmeans_hydro fviz_cluster(kmeans_hydro, data = hydro_transform) print(kmeans_hydro)
替代可视化方案
1. 交互式3D散点图(plotly包)
plotly可生成可旋转、缩放的交互式3D图,直观展示三个主成分维度下的聚类分布:
# 加载plotly包 library(plotly) # 将聚类标签加入主成分数据框 hydro_transform$cluster <- as.factor(kmeans_hydro$cluster) # 绘制3D散点图 plot_ly(hydro_transform, x = ~PC1, y = ~PC2, z = ~PC3, color = ~cluster, type = "scatter3d", mode = "markers", marker = list(size = 5)) %>% layout(title = "K-means聚类(基于前3个主成分)", scene = list(xaxis = list(title = "主成分1"), yaxis = list(title = "主成分2"), zaxis = list(title = "主成分3")))
2. 主成分两两组合的散点图矩阵(GGally包)
利用GGally::ggpairs生成所有主成分两两组合的散点图,每个子图按聚类标签着色,全面展示聚类在不同主成分维度的分布:
# 将聚类标签加入主成分数据框 hydro_transform$cluster <- as.factor(kmeans_hydro$cluster) # 绘制散点图矩阵 ggpairs(hydro_transform, columns = 1:3, # 指定前3个主成分 aes(color = cluster, alpha = 0.7), upper = list(continuous = "cor"), # 上三角显示相关系数 lower = list(continuous = "point")) + ggtitle("主成分两两组合的聚类散点图矩阵") + theme_bw()
3. 静态交互式3D图(rgl包)
rgl包可生成可手动旋转的3D图,适合本地交互查看场景:
# 加载rgl包 library(rgl) # 为不同聚类分配颜色 cluster_colors <- c("#FF0000", "#00FF00", "#0000FF", "#FFFF00")[kmeans_hydro$cluster] # 绘制3D散点图 plot3d(hydro_transform$PC1, hydro_transform$PC2, hydro_transform$PC3, col = cluster_colors, size = 2, xlab = "主成分1", ylab = "主成分2", zlab = "主成分3", main = "K-means聚类3D可视化") # 添加图例 legend3d("topright", legend = paste("Cluster", 1:k), col = c("#FF0000", "#00FF00", "#0000FF", "#FFFF00"), pch = 16, cex = 0.8)
内容的提问来源于stack exchange,提问作者brgionta
相关产品推荐
相关产品推荐

