从零开始学习主成分分析
前言
前段时间一个偶然的机会,在一个虫友的问题下留了自己的微信号,从那开始私信我的人络绎不绝,我翻看了网上许多大咖的博文,大家都各有侧重,有的偏向基础概念和实例应用,如:【机器学习】主成分分析详解(https://blog.****.net/lyl771857509/article/details/79435402);有的偏向于软件的操作(http://www.360doc.com/content/17/1210/16/37437963_711826540.shtml);还有的内容是错误的。同几位提问者的交流中,我发现往往来问问题的大都是没有什么计算机编程和数理统计基础的人。我想不妨自己做一个从软件安装到数据分析,再到最终结果展示的傻瓜式帖子,希望能对大家有所帮助。
准备工作
软件准备
1、matlab 2013a
下载地址:magnet:?xt=urn:btih:8264042A3852F48EFCF836B364A576062ADA5552;
安装方式:https://jingyan.baidu.com/article/dca1fa6fa26202f1a44052e8.html
按照上文安装步骤操作完毕后,还需要根据技术贴(https://blog.****.net/wangpengfei666/article/details/78584083?locationNum=1&fps=1)完成对licence文件的修改。
**完成后,到C:\Program Files\MATLAB\R2013\bin(默认)或者你的自定义目录下找到matlab.exe,右键发送快捷方式到桌面,双击打开,倘若你能看见下图的界面,那么祝贺你,你已经成功安装了matalb。
数据准备
matlab 2013a 自带一个名为hald数据集,软件对于这个数据集的描述如下:
== Portland Cement Data ==
Multiple regression data
ingredients (%):
column1: 3CaO.Al2O3 (tricalcium aluminate)
column2: 3CaO.SiO2 (tricalcium silicate)
column3: 4CaO.Al2O3.Fe2O3 (tetracalcium aluminoferrite)
column4: 2CaO.SiO2 (beta-dicalcium silicate)
heat (cal/gm):
heat of hardening after 180 days
Source:
Woods,H., H. Steinour, H. Starke,
"Effect of Composition of Portland Cement on Heat Evolved
during Hardening," Industrial and Engineering Chemistry,
v.24 no.11 (1932), pp.1207-1214.
Reference:
Hald,A., Statistical Theory with Engineering Applications,
Wiley, 1960.
上文大概意思是包括五列数据,它们分别是3CaO.Al2O3,3CaO.SiO2,4CaO.Al2O3.Fe2O3,2CaO.SiO2 在材料中占有的成分(前四列)和180天后的淬火热量(第五列)。
数据内容也非常简单,只有13行5列:
7.00 | 26.00 | 6.00 | 60.00 | 78.50 |
1.00 | 29.00 | 15.00 | 52.00 | 74.30 |
11.00 | 56.00 | 8.00 | 20.00 | 104.30 |
11.00 | 31.00 | 8.00 | 47.00 | 87.60 |
7.00 | 52.00 | 6.00 | 33.00 | 95.90 |
11.00 | 55.00 | 9.00 | 22.00 | 109.20 |
3.00 | 71.00 | 17.00 | 6.00 | 102.70 |
1.00 | 31.00 | 22.00 | 44.00 | 72.50 |
2.00 | 54.00 | 18.00 | 22.00 | 93.10 |
21.00 | 47.00 | 4.00 | 26.00 | 115.90 |
1.00 | 40.00 | 23.00 | 34.00 | 83.80 |
11.00 | 66.00 | 9.00 | 12.00 | 113.30 |
10.00 | 68.00 | 8.00 | 12.00 | 109.40 |
主成分分析
使用matlab自带的数据集进行主成分分析是非常容易的,在命令窗口中输入以下三行代码就可以解决战斗(如果你不知道什么是命令窗口,参考一下Jurbo的帖子: https://blog.****.net/Jurbo/article/details/78166990):
load hald
covx = cov(ingredients);
[COEFF,latent,explained] = pcacov(covx)
只是,我们在实际操作中,可能要自己导入数据,在这里我举一个简单的例子,比如我需要做主成分分析的数据储存在一个excel文件中,叫做new.xls,该文件存放在 D:\pca_analysis 目录下:
首先,我们要导入数据到matlab, 将其命名为DATA。在matlab中,DATA此时可以被看做是一个m行n列的自变量矩阵,m代表样本数量,n代表数据的维数:
DATA=xlsread('D:\pca_analysis\new.xls')
然后,求协方差矩阵
covx = cov(DATA)
最后,调用pcacov命令作出主成分分析:
[COEFF,latent,explained] = pcacov(covx)
运行完这一步之后,我们可以在命令窗口看到以下几个结果:
COEFF =
-0.0678 -0.6460 0.5673 0.5062
-0.6785 -0.0200 -0.5440 0.4933
0.0290 0.7553 0.4036 0.5156
0.7309 -0.1085 -0.4684 0.4844
latent =
517.7969
67.4964
12.4054
0.2372
explained =
86.5974
11.2882
2.0747
0.0397
第一项COEFF是主成分系数矩阵(principal component coefficients),是主成分分析最重要的结果,起到将自变量矩阵转换成主成分矩阵的作用;第二项是主成分方差(principal component variances),方差越大,代表这一个主成分的信息约多,越重要;第三项是解释量,其实就是第二项结果中每一个数字除以总和得到的省略百分号的百分比而已。本质上和第二项没有什么区别。
进一步分析
系统自带的命令运行完了,但仅仅把以文得到的结果提交给老板恐怕免不了一顿责骂。
1、主成分矩阵
我们还要根据 主成分矩阵=自变量矩阵×主成分系数矩阵 求出主成分矩阵,matlab命令如下:
new_Pca_Matrix=DATA*COEFF
new_Pca_Matrix 是 由原始自变量矩阵×一个方阵得到的,所以说new_Pca_matrix的行和列与DATA的行和列是一致的。我们主成分分析的目的是降维,所以我们还要对new_Pca_Matrix 进行一次筛选,留下解释量高的向量,去掉解释量低的向量。
2、过滤掉主成分矩阵中解释量低的向量
如何判断哪些应该留下呢?看特征值的大小,如果特征值大于1,保留,如果小于1,说明这一向量的信息还不如原来自变量数据中的一列,应该去掉。
(1)计算特征值:
a=eig(covx)
(2)看看有多少个特征值大于1
num=sum(a>1);
(3)保留解释量高的向量,并重新赋值给new_Pca_Matrix_final
new_Pca_Matrix_final=new_Pca_Matrix(:,1:num);
new_Pca_Matrix_final 是你想要的主成分分析输出结果。
主成分分析还包括其他很多方面,比如:碎石图的绘制和解析,将主成分分析结果用于后续的机器学习分类器构建等等。有问题请在下方留言。本人并非数学科班出身,本帖子可能存在一些技术层面的纰漏,如有发现,还请各位指正。
by Doc Z
2018.6.7