PCA(主成分分析法)

1. PCA(最大化方差定义或者最小化投影误差定义)是一种无监督算法,也就是我们不需要标签也能对数据做降维,这就使得其应用范围更加广泛了。那么PCA的核心思想是什么呢?

例如D维变量构成的数据集,PCA的目标是将数据投影到维度为K的子空间中,要求K

PCA其实就是方差与协方差的运用。

降维的优化目标:将一组 N 维向量降为 K 维,其目标是选择 K 个单位正交基,使得原始数据变换到这组基上后,各变量两两间协方差为 0,而变量方差则尽可能大(在正交的约束下,取最大的 K 个方差)。

2. PCA存在的问题:

原来的数据中比如包括了年龄,性别,身高等指标降维后的数据既然维度变小了,那么每一维都是什么含义呢?这个就很难解释了,所以PCA本质来说是无法解释降维后的数据的物理含义,换句话说就是降维完啦计算机能更好的认识这些数据,但是咱们就很难理解了。

PCA对数据有两个假设:数据必须是连续数值型;数据中没有缺失值。

过拟合:PCA 保留了主要信息,但这个主要信息只是针对训练集的,而且这个主要信息未必是重要信息。有可能舍弃了一些看似无用的信息,但是这些看似无用的信息恰好是重要信息,只是在训练集上没有很大的表现,所以 PCA 也可能加剧了过拟合;

3. PCA的作用:

缓解维度灾难:PCA 算法通过舍去一部分信息之后能使得样本的采样密度增大(因为维数降低了),这是缓解维度灾难的重要手段;

降噪:当数据受到噪声影响时,最小特征值对应的特征向量往往与噪声有关,将它们舍弃能在一定程度上起到降噪的效果;

特征独立:PCA 不仅将数据压缩到低维,它也使得降维之后的数据各特征相互独立;

4. 方差的作用:咱们可以想象一下,如果一群人都堆叠在一起,我们想区分他们是不是比较困难,但是如果这群人站在马路两侧,我们就可以很清晰的判断出来应该这是两伙人。所以基于方差我们可以做的就是让方差来去判断咱们数据的拥挤程度,在这里我们认为方差大的应该辨识度更高一些,因为分的比较开(一条马路给隔开啦)。方差可以度量数值型数据的离散程度,数据若是想要区分开来,他那他们的离散程度就需要比较大,也就是方差比较大。

5. 协方差的作用:

6. 计算过程:(下图为采用特征值分解的计算过程,若采用SVM算法,则无需计算协方差矩阵!)

为什么我们需要协方差矩阵

?我们最主要的目的是希望能把方差和协方差统一到一个矩阵里,方便后面的计算。

假设我们只有 a 和 b 两个变量,那么我们将它们按行组成矩阵 X:(与matlab不同的是,在numpy中每一列表示每个样本的数据,每一行表示一个变量。比如矩阵X,该矩阵表示的意义为:有m个样本点,每个样本点由两个变量组成!)

然后:

我们可以看到这个矩阵对角线上的分别是两个变量的方差,而其它元素是 a 和 b 的协方差。两者被统一到了一个矩阵里。

7. 特征值与特征向量的计算方法-----特征值分解与奇异值分解法(SVD)(有关特征值与奇异值可见我的博文!)

(1) 特征值分解的求解过程较为简单,以下图为例子

(2) 特征值分解存在的缺点:

特征值分解中要求协方差矩阵A必须是方阵,即规模必须为n*n。

后期计算最小投影维度K时,计算量过大。

当样本维度很高时,协方差矩阵计算太慢;

(3) SVD算法(奇异值分解)的提出克服这些缺点,目前几乎所有封装好的PCA算法内部采用的都是SVD算法进行特征值、特征向量以及K值的求解。

奇异值(每个矩阵都有):设A是一个mXn矩阵,称正半定矩阵A‘A的特征值的非负平方根为矩阵A的奇异值,其中A‘表示矩阵A的共扼转置矩阵(实数矩阵的共轭转置矩阵就是转置矩阵,复数矩阵的共轭转置矩阵就是上面所说的行列互换后每个元素取共轭)

只有方阵才有特征值。

(4) SVD算法的计算过程:(numpy中已经将SVD进行了封装,所以只需要调用即可)

可以发现,采用SVD算法无需计算协方差矩阵,这样在数据量非常大的时候可以降低消耗。

A为数据矩阵,大小为M*N(2*5)

U是一个由与数据点之间具有最小投影误差的方向向量所构成的矩阵,大小为M*M(2*2),假如想要将数据由M维降至K维,只需要从矩阵U中选择前K个列向量,得到一个M*K的矩阵,记为Ureduce。按照下面的公式即可计算降维后的新数据:降维后的数据矩阵G = A.T * Ureduce.

sigma为一个列向量,其包含的值为矩阵A的奇异值。

VT是一个大小为N*N的矩阵,具体意义我们无需了解。

利用python实现PCA降维(采用SVD的方法):

from numpy importlinalg as la importnumpy as np #1.矩阵A每个变量的均值都为0,所以不用进行“去平均值”处理。倘若矩阵A的每个变量的均值不为0,则首先需要对数据进行预处理

#才可以进行协方差矩阵的求解。

#2.与matlab不同的是,在numpy中每一列表示每个样本的数据,每一行表示一个变量。

#比如矩阵A,该矩阵表示的意义为:有5个样本点,每个样本点由两个变量组成!

#3.np.mat()函数中矩阵的乘积可以使用 * 或 .dot()函数

#array()函数中矩阵的乘积只能使用 .dot()函数。而星号乘(*)则表示矩阵对应位置元素相乘,与numpy.multiply()函数结果相同。

A = np.mat([[-1, -1, 0, 2, 0], [-2, 0, 0, 1, 1]]) #A = np.mat([[-1, -2], [-1, 0], [0, 0], [2, 1], [0, 1]]).T

U, sigma, VT =la.svd(A) print("U:") print(U) print("sigma:") print(sigma) print("VT:") print(VT) print("-"*30) print("降维前的数据:") print(A.T) print("降维后的数据:") print(A.T * U[:,0])

运行结果图:与上文采用特征值分解所得到的降维结果一致!

8.PCA的重建

众所周知,PCA可以将高维数据压缩为较少维度的数据,由于维度有所减少,所以PCA属于有损压缩,也就是,压缩后的数据没有保持原来数据的全部信息,根据压缩数据无法重建原本的高维数据,但是可以看作原本高维数据的一种近似。

还原的近似数据矩阵Q = 降维后的矩阵G * Ureduce.T

9.采用sklearn封装好的PCA实现数据降维(采用的是SVD算法):

importnumpy as np from sklearn.decomposition importPCA #利用sklearn进行PCA降维处理的时候,数据矩阵A的行数表示数据的个数,数据矩阵A的列数表示每条数据的维度。这与numpy中是相反的!

#A = np.mat([[-1, -1, 0, 2, 0], [-2, 0, 0, 1, 1]]).T

A = np.mat([[-1, -2], [-1, 0], [0, 0], [2, 1], [0, 1]]) pca = PCA(n_components = 1) pca.fit(A) #投影后的特征维度的方差比例

print(pca.explained_variance_ratio_) #投影后的特征维度的方差

print(pca.explained_variance_) print(pca.transform(A))

可以发现,采用sklearn封装的方法实现PCA与上文的方法达到的结果一致!

10.如何确定主成分数量(针对于Sklearn封装的PCA方法而言)

PCA算法将D维数据降至K维,显然K是需要选择的参数,表示要保持信息的主成分数量。我们希望能够找到一个K值,既能大幅降低维度,又能最大限度地保持原有数据内部的结构信息。实现的过程是通过SVD方法得到的S矩阵进行操作求解,

11.sklearn中封装的PCA方法的使用介绍。

PCA的函数原型

(1)主要参数介绍

n_components

这个参数类型有int型,float型,string型,默认为None。 它的作用是指定PCA降维后的特征数(也就是降维后的维度)。

若取默认(None),则n_components==min(n_samples, n_features),即降维后特征数取样本数和原有特征数之间较小的那个;

若n_components}设置为‘mle’并且svd_solver设置为‘full’则使用MLE算法根据特征的方差分布自动去选择一定数量的主成分特征来降维;

若0

若n_components≥1,则降维后的特征数为n_components;

copy

bool (default True)

在运行算法时,将原始训练数据复制一份。参数为bool型,默认是True,传给fit的原始训练数据X不会被覆盖;若为False,则传给fit后,原始训练数据X会被覆盖。

whiten

bool, optional (default False)

是否对降维后的数据的每个特征进行归一化。参数为bool型,默认是False。

(2)主要方法介绍:

fit(X,y=None) :用训练数据X训练模型,由于PCA是无监督降维,因此y=None。

transform(X,y=None) :对X进行降维。

fit_transform(X) :用训练数据X训练模型,并对X进行降维。相当于先用fit(X),再用transform(X)。

inverse_transform(X) :将降维后的数据转换成原始数据。(PCA的重建)

(3)主要属性介绍:

components:array, shape (n_components, n_features) ,降维后各主成分方向,并按照各主成分的方差值大小排序。

explained_variance:array, shape (n_components,) ,降维后各主成分的方差值,方差值越大,越主要。

explained_variance_ratio:array, shape (n_components,) ,降维后的各主成分的方差值占总方差值的比例,比例越大,则越主要。

singular_values:array, shape (n_components,) ,奇异值分解得到的前n_components个最大的奇异值。

参考资料:https://zhuanlan.zhihu.com/p/77151308?utm_source=qq&utm_medium=social&utm_oi=1095998405318430720

svd降维 python案例_PCA降维的原理、方法、以及python实现。相关推荐

  1. python扫雷的代码及原理_基于Python实现的扫雷游戏实例代码

    摘要:这篇Python开发技术栏目下的"基于Python实现的扫雷游戏实例代码",介绍的技术点是"Python实现.Python.实例代码.扫雷游戏.扫雷.游戏" ...

  2. python 输出一个 5*5的 三角形_GitHub标星3W+,80个Python案例,带你轻松玩转Python学习!...

    在Python学习过程中,案例是我们绝对绕不开的一部分.它不光能够帮助我们加深对基础知识的理解,也能进一步提升我们的编程能力. 今天给大家整理的这份80份Python精选案例,来自GitHub热门项目 ...

  3. 电子商务数据挖掘python案例_精心整理!9个 Python 实用案例分享!

    1. 整理字符串输入 整理用户输入的问题在编程过程中极为常见.通常情况下,将字符转换为小写或大写就够了,有时你可以使用正则表达式模块「Regex」完成这项工作.但是如果问题很复杂,可能有更好的方法来解 ...

  4. python logistic实例_logistic回归原理解析及Python应用实例

    logistic回归,又叫对数几率回归(从后文中便可此名由来).首先给大家强调一点,这是一个分类模型而不是一个回归模型!下文开始将从不同方面讲解logistic回归的原理,随后分别使用梯度上升算法和随 ...

  5. 决策树原理实例(python代码实现)_决策树原理实例(python代码实现)

    决策数(Decision Tree)在机器学习中也是比较常见的一种算法,属于监督学习中的一种.看字面意思应该也比较容易理解,相比其他算法比如支持向量机(SVM)或神经网络,似乎决策树感觉"亲 ...

  6. python随机森林特征重要性原理_使用Python的随机森林特征重要性图表

    我正在使用Python中的RandomForestRegressor,我想创建一个图表来说明功能重要性的排名.这是我使用的代码: from sklearn.ensemble import Random ...

  7. 用python语言实现喇叭发声原理_用Python实现喇叭天线设计小工具(三)

    摘要:本节主要介绍波导查值模块,以及HFSS调用模块的编写. 波导查值模块 该部分要实现的功能主要是根据输入的工作频率,自动选择合适的标准波导尺寸,免去翻资料的麻烦,实现起来逻辑很简单,也就是单纯地根 ...

  8. 用python语言实现喇叭发声原理_用Python实现喇叭天线设计小工具(一)

    前言 作为系列文章的第一篇,本文主要介绍采用Python编写一个图形化界面的小程序,方便快速根据波束宽度设计出最优化喇叭天线,一键调用HFSS进行仿真,并可打包为exe文件方便其他人使用,其效果如下: ...

  9. python爬取数据的原理_成为Python高手必须懂的爬虫原理

    互联网是由一个个站点和网络设备组成的大网,我们通过浏览器访问站点,站点把HTML.JS.CSS代码返回给浏览器,这些代码经过浏览器解析.渲染,将丰富多彩的网页呈现我们眼前. 一.爬虫是什么? 如果我们 ...

最新文章

  1. JAVA常用基础知识点[继承,抽象,接口,静态,枚举,反射,泛型,多线程...]
  2. Intellij IDEA 远程debug、远程tomcat部署项目
  3. Spring中日期格式转换
  4. 雅客EXCEL (3)-合并取消单元格、平均值、添加序号
  5. Java 8系列之Lambda表达式
  6. Promise用法总结
  7. Java源码解析:ArrayList 和 Iterator 使用上的不同
  8. 心电图心电轴怎么计算_心电图导联及心电轴
  9. matlab中存档算法代码,MATLAB 智能算法超级学习手册中程序代码
  10. [MySQL] INFORMATION_SCHEMA 数据库包含所有表的字段
  11. python文件夹目录_Python 操作文件、文件夹、目录大全
  12. 无字库12864液晶屏滚动显示程序[转]
  13. Premiere无法导入webm格式视频的解决方法
  14. 敌兵布阵——线段树单点修改区间查询
  15. Python tkinter(GUI编程)模块最完整讲解(下)
  16. oracle gbk 转码,oracle编码格式从utf-8转换为GBK
  17. 2023中国矿业大学计算机考研信息汇总
  18. [日志]电脑开不了机修理
  19. 1443:【例题4】Addition Chains
  20. 远程桌面控制软件 Splashtop 新增本地部署版产品 On-Prem

热门文章

  1. python数据分析与应用
  2. 高精度模板(含加减乘除四则运算)
  3. javascript里的post和get有什么区别
  4. pytorch中数组维度的理解
  5. 算法与数据结构(一)
  6. 查看win10剩余激活时间
  7. pyspark subtract代码示例
  8. 启动namenode报错:Journal Storage Directory /var/bigdata/hadoop/full/dfs/jn/dmgeo not formatted
  9. golang函数多值返回示例
  10. docker安装nginx并进行-v挂载