2016-12-06 17 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") 

Последние две строки возврата 1.468087 на расстояние в художественном пространстве и 1.80717 в PCA-пространстве, указывая там муха в масле ...

ответ

1

Это из-за масштабирования и центрирования, если вы не делаете масштабирования и центрирования, расстояние будет точно таким же, как в оригинальном, так и в пространстве возможностей PCA.

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 с масштабированием/центровки, как следующее:

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