主成分分析和主成分回归

主成份分析是对数据降维的方法,通过从数据中抽提少数的主成份来近似代表数据。选择主成份是根据数据的方差来进行的,每次选择的主成份都是数据中方差最大的方向,并且主成份之间不相关。

求主成份的两种方法:
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 %*% evec; 
   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
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);
}


参考:余松林《医学统计学》




转载自:http://blog.sciencenet.cn/home.php?mod=space&uid=54276&do=blog&id=375339

展开阅读全文

没有更多推荐了,返回首页