PCA分析的疑问

R 与python scikit-learn PCA的主成分结果有部分是反的

  • 通过R和python分别计算出来的PCA的结果存在某些主成分的结果是相反的,这些结果是没有问题的,只是表示这个分量被反转了,结果同样是有效的。
  • PCA的本质是寻找一条正交的线,这条线应该是可以有不同方向的

数据格式

148    41    72    78
139    34    71    76
160    49    77    86
149    36    67    79
159    45    80    86
142    31    66    76
153    43    76    83
150    43    77    79
151    42    77    80
139    31    68    74
140    29    64    74
161    47    78    84
158    49    78    83
140    33    67    77
137    31    66    73
152    35    73    79
149    47    82    79
145    35    70    77
160    47    74    87
156    44    78    85
151    42    73    82
147    38    73    78
157    39    68    80
147    30    65    75
157    48    80    88
151    36    74    80
144    36    68    76
141    30    67    76
139    32    68    73
148    38    70    78

python计算PCA代码

from sklearn.decomposition import PCA
pca = PCA()
data = pd.read_csv("test.xls",sep="\t")
mda = data.T.values
pca = PCA()
pc = pca.fit_transform(mda)
pd.DataFrame(pc)

R计算PCA代码

test<-data.frame(
  X1=c(148, 139, 160, 149, 159, 142, 153, 150, 151, 139,
           140, 161, 158, 140, 137, 152, 149, 145, 160, 156,
           151, 147, 157, 147, 157, 151, 144, 141, 139, 148),
  X2=c(41, 34, 49, 36, 45, 31, 43, 43, 42, 31,
           29, 47, 49, 33, 31, 35, 47, 35, 47, 44,
           42, 38, 39, 30, 48, 36, 36, 30, 32, 38),
  X3=c(72, 71, 77, 67, 80, 66, 76, 77, 77, 68,
          64, 78, 78, 67, 66, 73, 82, 70, 74, 78,
          73, 73, 68, 65, 80, 74, 68, 67, 68, 70),
  X4=c(78, 76, 86, 79, 86, 76, 83, 79, 80, 74,
           74, 84, 83, 77, 73, 79, 79, 77, 87, 85,
           82, 78, 80, 75, 88, 80, 76, 76, 73, 78)
  )
data=t(as.matrix(test))
#'princomp'只能在单位比变量多的情况下使用
data.pr<-princomp(data,cor=TRUE)
#cor是逻辑变量 当cor=TRUE表示用样本的相关矩阵R做主成分分析
当cor=FALSE表示用样本的协方差阵S做主
das = summary(data.pr,loadings=TRUE)

#当样品比比变量少时用fast.prcomp
data.pca = fast.prcomp(data,retx=T,scale=F,center=T)
a = summary(data.pca)
pc = as.data.frame(a$x)


posted @ 2019-08-30 08:30  raisok  阅读(646)  评论(0编辑  收藏  举报