У меня есть 3D Point Cloud и я хочу вписать линию в данные, используя PCA. В приведенном ниже примере используется только первый компонент PCA, что уже хорошо для того, что я хочу сделать. Моя проблема, однако, заключается в том, что на первый компонент приходится только около 56% совокупной доли. Если бы я мог включить второй компонент, этот процент увеличился бы до 96%, но я не уверен, как включить более одного компонента в модель, использованную ниже. Я попытался просто добавить xyz_pca$loadings[, 1] + xyz_pca$loadings[, 2]
, но это не работает. Итак, я нарисовал 2 линии (по одной для каждого компонента) в модели и теперь хотел бы «объединить» их.
x <- c(1,4,3,6,2,5)
y <- c(2,2,4,3,5,9)
z <- c(1,3,5,9,2,2)
xyz <- data.frame(x = x, y = y, z = z)
N <- nrow(xyz)
mean_xyz <- apply(xyz, 2, mean)
xyz_pca <- princomp(xyz)
dirVector1 <- xyz_pca$loadings[, 1] # PC1
dirVector2 <- xyz_pca$loadings[, 2]
t_ends <- c(min(xyz_pca$score[,1]), max(xyz_pca$score[,1]))
endpts1 <- rbind(mean_xyz + t_ends[1]*dirVector1, mean_xyz + t_ends[2]*dirVector1)
endpts2 <- rbind(mean_xyz + t_ends[1]*dirVector2, mean_xyz + t_ends[2]*dirVector2)
library(scatterplot3d)
s3d <- scatterplot3d(xyz, type="b")
s3d$points3d(endpts1, type="l", col="red", lwd=2)
s3d$points3d(endpts2, type="l", col="blue", lwd=2)
library(rgl)
plot3d(xyz, type="s", rad=0.1)
abclines3d(mean_xyz, a = dirVector1, col="red", lwd=2) # mean + t * direction_vector
abclines3d(mean_xyz, a = dirVector2, col="blue", lwd=2) # mean + t * direction_vector