前言

前段时间一个偶然的机会,在一个虫友的问题下留了自己的微信号,从那开始私信我的人络绎不绝,我翻看了网上许多大咖的博文,大家都各有侧重,有的偏向基础概念和实例应用,如:【机器学习】主成分分析详解(https://blog.csdn.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.csdn.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列:

hald数据集
 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.csdn.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

从零开始学习主成分分析相关推荐

  1. 从零开始学习 webservice第一集,java webservice简单实例入门教程

    现在从零开始学习webservice 概念自己百度搜,总之,webservice就相当于一个接口,就像你走进了一家售货店,你不需要知道这家店怎么卖给你东西,你拿着钱去,说我要一包玉溪,人家就会给你返回 ...

  2. python新手教程 从零开始-Python零基础从零开始学习Python十分钟快速入门

    原标题:Python零基础从零开始学习Python十分钟快速入门 学习Python的,都知道Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言.Python是一种动态解释型的 ...

  3. python零基础难学吗-如何从零开始学习Python,零基础学python难吗

    Python并不难学,它诞生至今已经过25个年头,但相对于其他语言,它更加易学.易读,非常适合快速开发,Python编程简单直接,更适合初学编程者. 那么,如何从零开始学习python呢? 可以分为这 ...

  4. python自学多久可以找到工作-25岁从零开始学习python还能找到工作吗?

    相信近期大家经常可以看到培训机构推出python相关的课程,随着人工智能技术逐渐进入大众的生活,这种编程语言以简单.应用广泛的优势,成为了进入人工智能领域的条件之一.对于精通python开发的人,在职 ...

  5. python语言怎么学-如何从零开始学习Python,python语言编程入门

    Python并不难学,它诞生至今已经过25个年头,但相对于其他语言,它更加易学.易读,非常适合快速开发,Python编程简单直接,更适合初学编程者. 那么,如何从零开始学习python呢? 可以分为这 ...

  6. 从零开始学习hadoop之发行版选择

    从零开始学习hadoop之发行版选择 经常会看到这样的问题:零基础学习hadoop难不难?有的人回答说:零基础学习hadoop,没有想象的那么难,也没有想象的那么容易.看到这样的答案不免觉得有些尴尬, ...

  7. 从零开始学习OpenGL ES之五 – 材质

    从零开始学习OpenGL ES之五 – 材质 作者: iPhoneGeek 爱疯极客 09-Jan-10 iPhone Development 浏览次数: 411 |  评论 ↓ Tweet Shar ...

  8. 从零开始学习jQuery (十一) 实战表单验证与自动完成提示插件

    本系列文章导航 从零开始学习jQuery (一) 开天辟地入门篇 从零开始学习jQuery (二) 万能的选择器 从零开始学习jQuery (三) 管理jQuery包装集 从零开始学习jQuery ( ...

  9. 从零开始学习jQuery (十) jQueryUI常用功能实战

    本系列文章导航 从零开始学习jQuery (一) 开天辟地入门篇 从零开始学习jQuery (二) 万能的选择器 从零开始学习jQuery (三) 管理jQuery包装集 从零开始学习jQuery ( ...

最新文章

  1. 二维码QR Code简介及其解码实现(zxing-cpp)
  2. java编写词法分析器
  3. 突破安全狗防注入及上传的一些思路
  4. 爆破专栏丨Spring Security系列教程之Spring Security的四种权限控制方式
  5. 一种编写测试的好方法
  6. 定位系统服务器,android系统定位服务器地址
  7. C++中头文件和实现文件分离进行编译
  8. Win32 控件篇(6)
  9. linux一句话问答(网络无关篇+网络相关篇+程序开发篇+经典图书)
  10. Linux下DNS服务器的基本搭建
  11. 35c语言编程,35编号c语言编程题08850.pdf
  12. LINUX下载编译ccrtp(未成功)
  13. win10多合一原版系统_微软Win10专业版制作多合一系统安装盘教程
  14. [AndroidO] [RK3399] -- CH341驱动移植
  15. Android小插件 —— 天气插件
  16. 华为 U2000 技术研究开始
  17. kali Linux外网渗透控制Android安卓手机系统。
  18. 打开计算机无法显示工具栏,任务栏不显示打开的窗口怎么办教程
  19. Accidental override: The following declarations have the same JVM signature (getWindow()Landroid/vie
  20. 关于人工智能写作的发展以及看法

热门文章

  1. es6转es5的在线工具
  2. Switch可以用string做参数吗
  3. iOS NSDate与NSTimeInterval之间的互转
  4. lol丢失base.dll文件怎么办?base.dll文件下载
  5. python pdf分割_Python分割PDF
  6. 编写Makefile
  7. RAD Studio 11.X Alexandria release有何新的改变及改变实务
  8. 当我们在谈论色温调节的时候,我们在谈论什么
  9. Java官方教程(三-2)赋值 运算和一元运算符(2020.12.19)
  10. 一、pyside6 安装