主成分分析法 (Principal Component Analysis, PCA) 是一种数据压缩法,可以从数据中提取重要的部分并排除不重要的部分,是奇异值分解 (Singular Value Decomposition, SVD) 的重要应用。

SVD 是线性代数的一个亮点。

是一个
的列阵,矩阵秩
, SVD 会提供四个子空间的正交基,按重要性排序。我们有两组奇异向量,
里,
里,把
排列在
矩阵
,把
排列在
矩阵

SVD 不但找出正交基,还把

对角化成
的大小一样
,所以不一定是个方阵,可能右边和下边有零。但是我们可以丢掉零空间和左零空间的基向量,在
里,
是个
的方阵,
从大排到小。

SVD 是

是正交矩阵,有旋转作用。
是对角矩阵,有伸展作用。SVD 把
的变换分解成旋转、伸展、旋转。
的特征向量,叫左奇异向量。
的特征向量,叫右奇异向量。
有共同的特征值
,都是
的奇异值平方。用手的话可以用这个方法,但如果是很大的矩阵,要用计算机分解的话,我们不想乘
,太浪费计算力,最好直接用 svd() 。

现在我们要把数据带到实数空间,所以只能有数字,不能有分类数据。(其实我觉得不应该叫“数据”,因为“分类数据”根本就没有数字。)表格中,一行代表一条记录,一列代表一个特征。

表格里行比列多,每一列都减掉平均值,转换成矩阵,

是又高又细的、中心化好的矩阵,样本协方差矩阵是
的理由是求无偏估计。总方差是
的跡(对角线的和),等于
的特征值的和,也等于
的奇异值平方的和,

重要的是右奇异向量,

指向第
重要的方向,解释总方差的
部分。我们选
个最重要的
是主成分,我们只保留
的信息,降低了维数。

用 python 来实践一下吧,用 iris 数据,中心化,做 svd() ,奇异值除以

会把数据旋转到最好的方向,如果我们要用二维图表来看的话,
会变成
轴,
会变成
轴,丢掉
。我们用行向量,所以旋转做
就可以了,如果有一个行向量
,就做
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from itertools import combinations# 准备数据
iris = datasets.load_iris()# 四维数据分六个二维图表显示
fig, axes = plt.subplots(2, 3)
axes = axes.ravel()
for i, (x, y) in enumerate(combinations(range(4), 2)):axes[i].scatter(iris.data[:50, x], iris.data[:50, y],label=iris.target_names[0])axes[i].scatter(iris.data[50:100, x], iris.data[50:100, y],label=iris.target_names[1])axes[i].scatter(iris.data[100:, x], iris.data[100:, y],label=iris.target_names[2])axes[i].legend()axes[i].set_xlabel(iris.feature_names[x])axes[i].set_ylabel(iris.feature_names[y])
plt.show()# 做 SVD
A = iris.data - iris.data.mean(axis=0)
U, S, VT = np.linalg.svd(A, full_matrices=False)
S /= np.sqrt(A.shape[1] - 1)
print('如果从四维降到二维,会保留总方差的 {:.2%}。'.format((S**2)[:2].sum() / (S**2).sum()))# 从四维降到二维后图表显示
A_t = (A @ VT.T)[:, :2]
plt.scatter(A_t[:50, 0], A_t[:50, 1], label=iris.target_names[0])
plt.scatter(A_t[50:100, 0], A_t[50:100, 1], label=iris.target_names[1])
plt.scatter(A_t[100:, 0], A_t[100:, 1], label=iris.target_names[2])
plt.legend()
plt.xlabel(r'$vec v_1$')
plt.ylabel(r'$vec v_2$')
plt.show()

四维数据,需要用六个二维图表来看,但这些都是截面,仍然不能想象四维空间里的样子。

从四维降到二维后,保留 97.77% 的信息。

PCA 的功能就是压缩数据,同时保留最重要的信息。在数据分析的领域里,我们可以用它来降维。高维不仅对我们的想象力造成劳损,对建模也是一种诅咒,在这里主成分分析法是一个很有用的降维技巧。

主成分分析法_探索主成分分析法相关推荐

  1. ahp层次分析法_层次分析法在历史街区研究中的应用简析

    摘要 AHP (Analytic Hierarchy Process)层次分析法通常被运用于解决多目标.多标准.多要素.多层次的非结构化的复杂决策性问题,特别是战略决策性问题,在建筑.规划.风景园林等 ...

  2. crc16modbus查表法_查表法计算CRC16校验值

    /******************************************************************************* * Copyright (c) 201 ...

  3. 拉格朗日乘数法_拉格朗日乘数法介绍(不含证明)

    这是一篇写给chenxia25小可爱(qwq)的拉格朗日乘数法介绍. chenxia25​www.zhihu.com 本文只给出拉乘的使用方法,不给出证明.想知道证明自己查资料(废话 所谓拉乘就是深受 ...

  4. 常用crc查表法_查表法计算CRC

    (查表法)CRC检验码的计算过程 (1)将上次计算出的CRC校验码右移一个字节: (2)将移出的这个字节与新的要校验的字节进行XOR 运算: (3)用运算出的值在预先生成码表中进行索引,获取对应的值( ...

  5. Hash表_拉链法_开放寻址法_模拟散列表

    文章目录 Hash表 作用 ① 拉链法 ② 开放寻址法 例 - 模拟散列表 > 拉链法 > 开放寻址法 Hash表 一般只有添加.查找 (注意:离散化为特殊的哈希方式,因为离散化需要提前保 ...

  6. arctan查表法_查表法

    查表法是将一些事先计算好的结果,存储在常量数组中,运行时节省计算开销. 例如, 计算字节中位1的个数, int countBits( unsigned char dat ) { static char ...

  7. 运筹学_单纯形表法_大M法/两阶段法_步骤

    文章目录 步骤 latex代码 步骤 latex代码 \begin{align} 目标函数&:\min z=\sum_{i=1}^{n}c_{i}*x_{i}\\约束条件& \left ...

  8. java21点牌玩法_扑克牌玩法 21点规则和技巧原来那么多

    经常玩纸牌的小伙伴们应该听过一种扑克牌玩法:21点,没有听过的小伙伴们也没有关系,今天小编就给大家介绍一下21点的规则,21点是有概率可遵循的,小编今天教给大家21点的玩法还有技巧,一起学习一下吧. ...

  9. python指数描述法_季节指数法的计算步骤

    展开全部 1.收集历年(通常至少有三年)各月或各季的统计资料(观察值).62616964757a686964616fe59b9ee7ad9431333365643662 2.求出各年同月或同季观察值的 ...

最新文章

  1. golang中的读写锁
  2. element显示true或者false_element-ui轮播的简单实现
  3. arduino自带程序_arduino代码运行时间测试函数,代码性能运行时间测试方法
  4. 源码分析Thread
  5. VS2017 修改文件编码为UTF-8的插件
  6. 阿里天池_优秀策略答辩PPT和相关博客
  7. 【iOS-cocos2d-X 游戏开发之八】使用Lua脚本进行游戏开发(基础篇)
  8. put与putIfAbsent区别
  9. Jquery的普通事件和on的委托事件
  10. 模式识别与机器学习 第一章 绪论
  11. 企业微信小程序 windows 使用 vconsole 调试
  12. word打开老是配置进度_打开word文档显示配置进度怎么办 Word文档提示配置进度解决办法...
  13. 关于硬件批量贴片焊接流程
  14. tempfile.mkstemp 详解
  15. Kerberos安装及使用2(Kerberos服务器KDC安装及配置)
  16. PubWin不知道密码情况下卸载
  17. 网络安全学习第4篇-使用特征码和MD5对勒索病毒进行专杀,并对加密文件进行解密
  18. Unity3d 音效 音乐 大小控制
  19. python路径、工作路径、文件路径问题、改变当前路径
  20. linux登录远程mysql_实现MySQL远程登陆在linux下

热门文章

  1. duilib中的添加自定义控件
  2. Python 中 PyQt5 + pycharm 调用 Qt Designer,将.ui文件转换成 .py 文件
  3. 句子录音打分代码参考
  4. sys_connect_by_path 用法
  5. iBatis 事务控制 与 两表操作将SQL语句写入单表
  6. linux qt程序编译出错,QTcreator编译出错
  7. linux配置mysql数据库_Linux下配置mysql数据库
  8. shell linux教程,Shell入门基础知识
  9. asp.net 文本框显示xml格式数据_Excel 办公小技巧,查找和替换数据,您值得拥有...
  10. mysql原生库_Mysql数据库的一些简单原生sql语句