降维【PCA & SVD】
PCA(principle component analysis)主成分分析
理论依据
- 最大方差理论
- 最小平方误差理论
一、最大方差理论(白面机器学习)
对一个矩阵进行降维,我们希望降维之后的每一维数据能够有大的方差。
为什么呢?
因为每一维的方差越大,说明数据之间区分度高,想象一个极端的情况,降维之后的数据集所有维度 都是一样的值,方差为0,那么数据就没什么意义了,因为退化成了一条数据。
二维图生动形象
- 推导过程
对于n个样本,m维特征 (v1, v2, v3 ... vn), vi是m维列向量,进行中心化处理后的样本(x1, x2, x3 ... xn) = (v1 - u, v2 - u, v3 - u, vn - u),其中u = 1/n ∑1,nvi
向量内积表示向量在另一个向量上的投影长度,向量 xi 在 w (单位向量)方向上的投影长度(也是投影坐标,因为方向确定)为 (xi, w) = XiTw,目的就是找到一个投影方向w使得x1, x2, x3 ... xn在w上方差最小, 其中 x1, x2, x3 ... xn 的均值为0,0 = 1/n ∑1,nxi,
投影之后样本均值 u' = 1/n ∑1,nxiTw = 1/n (∑1,nxiT)w = 0
投影之后样本方差: D(X) = 1/n * ∑1,n(xiTw)2 = 1/n * ∑1,n(xiTw)T(xiTw) = 1 / n * ∑1,n wTxi xiTw = wT (1 / n * ∑1,n xi xiT)w, 其中1 / n * ∑1,n xi xiT是中心化处理后的协方差矩阵(协方差矩阵知识)记作∑,所以现在目标就是求D(X) = wT∑w 在 wTw = 1下的极大值, 构造拉格朗日函数令其导数为 0 (关于向量求导)
得:∑w = λw, 带入D(X) = λwTw = λ, 所以投影方向w为协方差矩阵特征向量时,D(x) 有极大值 λ
2.PCA降维过程
【中心化处理】
- 对样本进行中心化处理
- 求样本协方差矩阵
- 对协方差矩阵进行特征值分解,将特征值从大到小排列。
- 选取前d大的特征值所对应的特征向量, w1,w2...wd, 将样本n维映射到d维
- xi' = [w1Txi, w2Txi ... wdTxi]T
【不需要中心化处理】
- 对每一维特征求其 均值 Uj,
- cov(Xj1, Xj2) = (Xj1 - Uj1)T (Xj2 - Uj2), 其中Xj1 表示第一列,是第一维特征的所有样本,(n X 1), n个样本,m维特征。
- 组成一个 m * m 的协方差矩阵,进行求特征值与特征向量,根据特征值排序
- 选取前d大的特征值所对应的特征向量, w1,w2...wd, 将样本m维映射到d维
- X [w1, w2 ... wn] 即为降维到m后结果, X = (n, m) , w1 = (m, 1)
PCA的另一种解法:http://www.fuzihao.org/blog/2015/12/04/%E7%90%86%E8%A7%A3PCA%E5%92%8CSVD/
目的:
PCA的目的就是将一个高维矩阵A,通过一种转化,将其变成低维矩阵B,即 AM = B,核心就是求这个M,其中B应该是一个正交阵,每一列都是正交向量
求解推理:
因为B是正交矩阵,所以BTB = D, D是对角阵,又 B = AM, 所以 (AM)T(AM) = D => ATA = MDM-1, 又ATA是一个对称矩阵,所以可以向量分解,ATA = VΣVT,其中V是AAT的特征向量矩阵,Σ是特征值组成的对角阵,而V是正交阵,故VT = V-1, 所以 M = V, D = Σ
求解流程:
1、对A矩阵每一列进行标准化,(标准化的原因:每一维表示的单位不同,需要去量纲)
2、ATA矩阵求特征值和特征向量
3、根据需要降到的维度k,选择前k大的特征值与其特征向量
4、最后结果A' = V'Σ'VT'
SVD:
目标:
SVD是想通过 A = UΣVT,其中U V是正交阵,Σ是对角阵,进行降维。
推理:
ATA = (UΣVT)T(UΣVT) = VΣUTUΣVT = VΣ2VT, 所以 右奇异向量(V)是ATA的特征向量
AAT = UΣVTVTΣUT = UΣ2UT ,所以左奇异向量(U)是AAT的特征向量
而Σ2是AAT或ATA的特征值组成的对角阵
PCA和SVD区别:https://www.cnblogs.com/bjwu/p/9280492.html
方法上:
PCA需要计算协方差矩阵 ATA,当样本数和特征数很多的时候,这个计算量是相当大的。
SVD也可以得到协方差矩阵 ATA,ATA 最大的k个特征向量张成的矩阵,但是SVD有个好处,有一些SVD的实现算法(什么算法?)可以不求协方差矩阵XTX,也能求出我们的右奇异矩阵V。也就是说,我们的PCA算法可以不用做特征分解,而是做SVD来完成。
奇异值分解迭代计算比协方差矩阵的特征值分解更快更准确。
PCA仅用到了SVD的右奇异矩阵V,没有用左奇异矩阵,左奇异矩阵有什么用呢?
假设我们的样本是m✖️n的矩阵X,如果我们通过SVD找到了矩阵 XTXXTX 的最大的k个特征向量组成的m✖️d维矩阵U,则我们进行如下处理:
X′d×n=UTd×mXm×n
可以得到一个d✖️n的矩阵X',且这个矩阵和我们原来的m✖️n维的样本矩阵X相比,行数从m剪到了k,可见对行数进行了压缩。
也就是说,左奇异矩阵可以用于行数的压缩。相对的,右奇异矩阵可以用于列数即特征维度的压缩,也就是我们的PCA降维。
换句话说,SVD可以获取另一个方向上的主成分,而PCA只能获得单个方向上的主成分。这一点在NLP的文本处理上得到了很大体现。
应用上:
两者在输出上都是一样的,唯一的区别在输入,SVD可以输入稀疏矩阵(sparse matrix)。在原理上,也可以说SVD更适于输入稀疏矩阵。
因为PCA需要进行去均值化处理,所以不可避免的破坏了矩阵的稀疏性。所以,对于稀疏矩阵来说,SVD更适用,这样对于大数据来说节省了很大空间。
参考:
https://blog.csdn.net/HLBoy_happy/article/details/77146012
https://www.zhihu.com/question/20852004
降维【PCA & SVD】的更多相关文章
- # 机器学习算法总结-第五天(降维算法PCA/SVD)
- PCA, SVD以及代码示例
本文是对PCA和SVD学习的整理笔记,为了避免很多重复内容的工作,我会在介绍概念的时候引用其他童鞋的工作和内容,具体来源我会标记在参考资料中. 一.PCA (Principle component a ...
- PCA,SVD
PCA的数学原理 https://www.zhihu.com/question/34143886/answer/196294308 奇异值分解的揭秘(二):降维与奇异向量的意义 奇异值分解的揭秘(一) ...
- 机器学习降维--PCA
1.原理和概念 PCA(Principal Component Analysis),即主成分分析方法,是一种使用最广泛的数据降维算法. PCA的主要思想是将n维特征映射到k维上,这k维是全新的正交特征 ...
- 降维PCA技术
降维技术使得数据变得更易使用,并且它们往往能够去除数据中的噪声,使得机器学习任务往往更加精确. 降维往往作为预处理步骤,在数据应用到其它算法之前清洗数据.有很多技术可以用于数据降维,在这些技术中,独立 ...
- 数据降维-PCA主成分分析
1.什么是PCA? PCA(Principal Component Analysis),即主成分分析方法,是一种使用最广泛的数据降维算法.PCA的主要思想是将n维特征映射到k维上,这k维是全新的正交特 ...
- 11_数据降维PCA
1.sklearn降维API:sklearn. decomposition 2.PCA是什么:主成分分析 本质:PCA是一种分析.简化数据集的技术. 目的:是数据维数压缩,尽可能降低原数据的维数(复杂 ...
- 2019-07-31【机器学习】无监督学习之降维PCA算法实例 (鸢尾花)
样本 代码: import matplotlib.pyplot as plt from sklearn.decomposition import PCA from sklearn.datasets i ...
- matlab练习程序(PCA<SVD>)
clear all;close all;clc;img1=imread('Corner.png');img2=imread('Corner1.png');img3=imread('Corner2.pn ...
随机推荐
- 宇宙第一开发工具:vs2019 开发Python
1.初步认识 现在人工智能逐步进入人们的视野,人工智能开发也越来越火. 而python语言,被作为大数据库开发的首选语言之一~.前一段时间vs2019预览版发布.相信不少小伙伴已经开始使用,vs201 ...
- Asp.net mvc 项目返回Json
因mvc控制器返回类型JsonResult 在处理对象转JSON的时候,对日期的格式化处理并不太符合要求,所以重新继承抽象类ActionResult使用Newtonsoft.Json来系列化 usin ...
- 浅谈TCP IP协议栈(三)路由器简介
读完这个系列的第一篇浅谈TCP/IP协议栈(一)入门知识和第二篇浅谈TCP/IP协议栈(二)IP地址,在第一篇中,可能我对协议栈中这个栈的解释有问题,栈在数据结构中是一种先进后出的常见结构,而在整个T ...
- MySQL 数据查询
SELECT子句:用来指定查询返回字段,星号(*)表示返回所有字段 SELECT [DISTINCT]*|字段列表 #DISTINCT 用来过滤重复数据 FROM子句:用来指定数据来源 ...
- day15-面向对象基础(二)
今天整理类的组合以及类的三大特性 1.类的组合 2.类的继承 3.类的封装 4.类的多态 开始今日份整理 1.类的组合 类与类之间,并不是独立的,很多的时候在正常使用的时候都是类与类之间互相调用,所以 ...
- 跳跳棋[LCA+二分查找]-洛谷1852
传送门 这真是一道神仙题 虽然我猜到了这是一道LCA的题 但是... 第一遍看题,我是怎么也没想到能和树形图扯上关系 并且用上LCA 但其实其实和上一道lightoj上的那道题很类似 只不过那时一道很 ...
- 在 .NET Core 中结合 HttpClientFactory 使用 Polly(下篇)
译者:王亮作者:Polly 团队原文:http://t.cn/EhZ90oq声明:我翻译技术文章不是逐句翻译的,而是根据我自己的理解来表述的(包括标题).其中可能会去除一些不影响理解但本人实在不知道如 ...
- 【学习总结】GirlsInAI ML-diary day-13-Try/Except 异常处理
[学习总结]GirlsInAI ML-diary 总 原博github链接-day13 认识异常处理 要点小结: try和except是同个等级,注意对齐和缩进 可以把try和except直接理解成另 ...
- Shell脚本中的break continue exit return
转自:http://www.cnblogs.com/guosj/p/4571239.html break结束并退出循环 continue在循环中不执行continue下面的代码,转而进入下一轮循环 e ...
- SQL Server没有足够的内存继续执行程序 (mscorlib)的解决办法
在Microsoft SQL Server Management Studio 中执行较大的sql脚本时,会报没有足够的内存继续执行程序(mscorlib)的错误.如下图所示 解决方法: 使用sqlc ...