2016-12-06 3 views
0

私は、PCA空間の重心と〜20の処理と3つのグループの「特徴空間」の重心を測定しています。私が数学教師を正しく理解すれば、それらの間の距離は同じでなければならない。しかし、私はそれらを計算する方法ではないと私は私が数学を行う方法は、どちらかが間違っているのだろうかと思っていた。PCA空間と「特徴空間」分岐における重心距離の計算

私は私の方法/ MWEのための実例として悪名高いワインデータセットを使用し

library(ggbiplot) 
data(wine) 
treatments <- 1:2 #treatments to be considerd for this calculation 
wine.pca <- prcomp(wine[treatments], scale. = TRUE) 
#calculate the centroids for the feature/treatment space and the pca space 
df.wine.x <- as.data.frame(wine.pca$x) 
df.wine.x$groups <- wine.class 
wine$groups <- wine.class 
feature.centroids <- aggregate(wine[treatments], list(Type = wine$groups), mean) 
pca.centroids <- aggregate(df.wine.x[treatments], list(Type = df.wine.x$groups), mean) 
pca.centroids 
feature.centroids 
#calculate distance between the centroids of barolo and grignolino 
dist(rbind(feature.centroids[feature.centroids$Type == "barolo",][-1],feature.centroids[feature.centroids$Type == "grignolino",][-1]), method = "euclidean") 
dist(rbind(pca.centroids[pca.centroids$Type == "barolo",][-1],pca.centroids[pca.centroids$Type == "grignolino",][-1]), method = "euclidean") 

最後の2行がありますを示し、機能空間およびPCA-空間内1.80717で距離を1.468087を返します軟膏のフライ...

答えて

1

スケーリングとセンタリングのために、スケーリングとセンタリングを行わないと、オリジナルとPCAフィーチャ空間で正確に同じ距離になります。

wine[treatments] <- scale(wine[treatments], center = TRUE) 
wine.pca <- prcomp(wine[treatments], scale = TRUE) 

dist(rbind(feature.centroids[feature.centroids$Type == "barolo",][-1],feature.centroids[feature.centroids$Type == "grignolino",][-1]), method = "euclidean") 
#  1 
# 2 1.80717 
dist(rbind(pca.centroids[pca.centroids$Type == "barolo",][-1],pca.centroids[pca.centroids$Type == "grignolino",][-1]), method = "euclidean") 
#  1 
# 2 1.80717 

wine.pca <- prcomp(wine[treatments], scale=FALSE, center=FALSE) 

dist(rbind(feature.centroids[feature.centroids$Type == "barolo",][-1],feature.centroids[feature.centroids$Type == "grignolino",][-1]), method = "euclidean") 
#   1 
# 2 1.468087 
dist(rbind(pca.centroids[pca.centroids$Type == "barolo",][-1],pca.centroids[pca.centroids$Type == "grignolino",][-1]), method = "euclidean") 
#   1 
# 2 1.468087 

もう一つの方法は、同じ結果を得ることであることは、次のように中心/中央のオリジナルデータを/縮小し、その後スケーリングでPCAを適用することです

関連する問題