Можно ли подогнать линию к трехмерным данным, используя 2 (или более) компонента PCA в R? - PullRequest
0 голосов
/ 03 марта 2020

У меня есть 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...