[机器学习](八)cs229之主成分分析

来源:互联网 发布:多益网络二笔试题 编辑:程序博客网 时间:2024/05/29 07:43

主成分分析的代码和原理都比较简单,之前也用过很多次,转载的这篇博客的目的是通过实例来学习这个算法,方便之后可以快速上手,有关python的代码,可以见《机器学习实战》这本书。

对于PCA原理的理解,可以参考下面的博客:

1.最大方差理论:


2.最小平方差理论

参考:http://www.cnblogs.com/jerrylead/archive/2011/04/18/2020216.html

下面的内容转自:http://blog.csdn.net/u010480899/article/details/52263227

主成分分析(Principal Component Analysis,PCA),是一种统计方法。在处理实际问题中,多个变量之间可能存在一定的相关性,当变量的个数较多且变量之间存在复杂的关系时,增加了问题分析的难度。主成分分析是一种数学降维的方法,该方法主要将原来众多具有一定相关性的变量,重新组合成为一种新的相互无关的综合变量。例如,当选择第一个线性组合即第一个综合变量为F1,希望F1能够反映更多的信息,因此F1在所有线性组合中的方差是最大的,此时F1为第一主成分。如果F1作为第一主成分,不足以代表原来P个变量的信息,则继续选择F2作为第二个线性组合,为了更加有效的反映最初的信息,F1已经具有的信息不需要再次反映在F2中,那么要求此时Cov(F1,F2)=0,则F2可以称之为第二主成分。以此类推,可以构造出多个主成分。 
主成分分析的主要步骤如下: 
(1)对原始数据进行标准化处理,若样本数据矩阵如下: 
这里写图片描述

对原始数据进行标准化处理: 
这里写图片描述

(2)计算样本相关系数矩阵(注意这里假设原始数据标准化后仍用X表示,后面给出的计算该系数矩阵元素值的方法中设计到的Xi和Xj并不是原始数据矩阵X,而是标准化后的矩阵元素,这是这里依旧用了X表示而已!) 
这里写图片描述

(3)计算相关系数矩阵R的特征值和相应的特征向量: 
这里写图片描述

(4)选择重要的主成分: 
由主成分分析可以得到P个主成分,根据前面的介绍,主成分F1包含的信息大于F2,且可以以此类推,因此各个主成分的方差也是递减的,包含的信息量也是递减的,所以实际使用该方法的时候不在选取所有的P个主成分,而是根据各个主成分累计贡献的大小选取前面K个主成分。这里的贡献率是指某个主成分的方差占据全部主成分方差的比重,也就是某个特征值占据全部特征值和的比重,即: 
这里写图片描述

某个主成分的贡献率越大说明该主成分包含的原始信息量越大,主成分K值的选取,主要依据主成分 累计贡献率来决定,一般来说当累计贡献率达到85%以上时,可以认为这K个主成分包含了原始信息绝大多数的信息。

(5)计算主成分得分,其形式如下: 
这里写图片描述

(6)根据主成分得分的数据对问题进行后续的分析和建模。 
案例数据:对15家企业通过8个不同指标数据进行评估。 
这里写图片描述

Matlab代码:

clcclear allA=xlsread('D:\资料库区\大三上\HUAWEI\MATLAB\主成分分析.xls','B3:I17');%得到的数据矩阵的行数和列数a=size(A,1);b=size(A,2);%数据的标准化处理:得到标准化后的矩阵SAfor i=1:b    SA(:,i)=(A(:,i)-mean(A(:,i)))/std(A(:,i));end%计算系数矩阵:CMCM=corrcoef(SA);%计算CM的特征值和特征向量[V,D]=eig(CM);%将特征值按降序排列到DS中for j=1:b    DS(j,1)=D(b+1-j,b+1-j);end%计算贡献率for i=1:b    DS(i,2)=DS(i,1)/sum(DS(:,1));%单个贡献率    DS(i,3)=sum(DS(1:i,1))/sum(DS(:,1));%累计贡献率end%假定主成分的信息保留率T=0.9;for k=1:b    if DS(k,3) >= T        com_num=k;        break;    endend%提取主成分的特征向量for j=1:com_num    PV(:,j)=V(:,b+1-j);end%计算主成分得分new_score=SA*PV;for i=1:a    total_score(i,1)=sum(new_score(i,:));    total_score(i,2)=i;end%强主成分得分与总分放到同一个矩阵中result_report=[new_score,total_score];%按总分降序排列result_report=sortrows(result_report,-4);%输出结果disp('特征值、贡献率、累计贡献率:')DSdisp('信息保留率T对应的主成分数与特征向量:')com_numPVdisp('主成分得分及排序(按第4列的总分进行降序排列,前3列为个各成分得分,第5列为企业编号)')result_report
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53

Matlab运行结果: 
这里写图片描述

这里写图片描述


思考:

在cs229中还讲到了SVD算法,现在说明PCA和SVD的关系:

对中心化处理之后的X的协方差矩阵,即XXT进行SVD处理,也就是PCA的处理过程。这点可能会感觉比较奇怪,因为前面我们就是利用SVD的方法来进行PCA处理的,但实际上,正是由于这句话的原因,才可对PCA进行这样的处理。

XT

XXT
XXT
1 0
原创粉丝点击