主成份分析是对数据降维的方法,通过从数据中抽提少数的主成份来近似代表数据。选择主成份是根据数据的方差来进行的,每次选择的主成份都是数据中方差最大的方向,并且主成份之间不相关。
求主成份的两种方法:
1 从变量构成的矩阵X出发,先求出t(X)X的特征值和特征向量,然后用X乘以特征向量就得到了主成份
2 从矩阵X的相关矩阵出发,求相关矩阵的特征值和特征向量,然后用归一化的X乘以特征向量得到了主成份
主成份的选择:
主成份分析的目的是用尽量少的主成份代表众多的变量,因此它们所包含的信息量不应该损失太多。数据的方差大小代表了所包含的信息量,主成份的方差等于相关矩阵的特征值,而特征值的加和等于变量的个数p,因此选择主成份可以根据它们所代表的信息量,即特征值的进行。一般来说,可以选择信息量大于80%或者更高的前面几个主成份,也可以选择特征值大于1的主成份。如果选择了所有的主成份就相当于没有做主成份分析了。
主成分分析的应用:
1 从数据中抽提到的主成份相当于对于数据的一种浓缩,得到的主成份往往综合了多个变量的信息,因此可以用于进行综合评价。
2 主成份回归
主成份回归:
主成份回归可以解决变量间共线性的问题。它使用从数据抽提出的主成份进行回归,一般来说是选择前面的几个主成份。下面给出一个例子,训练集中的自变量数据X和因变量y,以及测试集中的数据Xnew和因变量Ynew,结果给出训练集中的回归模型得到的预测值和实际值的相关系数,以及测试集中相应的相关系数。代码是采用R语言。
principle <- function(x,y,xnew,ynew){
#给定系数矩阵x,和反应变量y,以及需要预测的系数矩阵xnew和ynew
xmean <- colMeans(x);
xsd <- sd(x);
x <- scale(x); #归一化
p <- ncol(x);
n <- nrow(x);
corr <- cor(x);
e <- eigen(corr);
main <- x %*% e$vec;
select <- 0;
#根据特征值大于等于1选择主成份个数
for(i in 1:p){
if(e$values[i] >= 1) select=select+1
}
data <- matrix(rep(0,times=n*select),n);
for(i in 1:select){
data[,i] = main[,i];
}
model <- lm(y~data);
coef <- model$coef;
constant=coef[1];
coef = coef[2:(select+1)];
preTrain <- data %*% coef+constant;
corTrain <- cor(y,preTrain);
#对新数据进行验证
xnew <- scale(xnew,center=xmean,scale=xsd); #归一化
preTest <- (xnew %*% e$vec[,1:select]) %*% coef + constant;
corTest <- cor(ynew,preTest);
list(corTrain=corTrain,corTest=corTest);
}
参考:余松林《医学统计学》
https://blog.sciencenet.cn/blog-54276-375339.html
上一篇:
Muscle,ClustalW和T-coffee的简单比较下一篇:
ridge regression