R语言使用scatter3D绘制PCA前两个特征向量构成的三维平面
R plot3D绘制PCA前两个主成分张成平面的方法
你可以基于已有的代码,通过平面方程计算网格点坐标,再用surf3D()叠加到现有散点图上,完整实现逻辑如下:
核心原理
前两个特征向量张成的平面过样本均值点,平面的法向量为协方差矩阵的第三个特征向量(与前两个特征向量正交),根据平面方程可计算任意(x,y)对应的z坐标。
完整补充代码
接在你现有代码之后运行即可:
# 计算样本均值(平面过该点) mu <- colMeans(X) # 平面法向量为第三个特征向量 normal_vec <- Gamma[, 3] # 生成覆盖样本点范围的xy网格 x_grid <- seq(min(X[,1]), max(X[,1]), length.out = 20) y_grid <- seq(min(X[,2]), max(X[,2]), length.out = 20) # 计算网格点对应的z值(根据平面方程推导) z_mat <- outer(x_grid, y_grid, function(x,y) { (-normal_vec[1]*(x - mu[1]) - normal_vec[2]*(y - mu[2]))/normal_vec[3] + mu[3] }) # 叠加平面到散点图,设置半透明保证散点可见 surf3D(x = x_grid, y = y_grid, z = z_mat, add = TRUE, col = "lightblue", alpha = 0.3, colkey = FALSE) # 可选补充:绘制样本点在平面上的投影点,验证效果 X_recon <- scale(X, center = TRUE, scale = FALSE) %*% Gamma[,c(1,2)] %*% t(Gamma[,c(1,2)]) + matrix(mu, nrow = nrow(X), ncol = 3, byrow = TRUE) points3D(X_recon[,1], X_recon[,2], X_recon[,3], add = TRUE, col = "red", pch = 16, cex = 0.5)
参数说明
alpha = 0.3控制平面透明度,可根据显示效果调整length.out = 20控制网格密度,数值越大平面越平滑- 投影点为红色小实心点,和原始散点对应可直观验证降维映射关系
内容的提问来源于stack exchange,提问作者Ejrionm
相关产品推荐
相关产品推荐

