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)