python pca降维_机器学习的降维打击

f5f1d57fc4c3199715ffe7d10a9de10d.png
6f817faab5a87726afae5fd0862b3c88.gif
326ea35a681fe47e1e907114e14acc73.png

文章发布于公号【数智物语】 (ID:decision_engine),关注公号不错过每一篇干货。

来源 | SAMshare(id:SAMshare)

作者 | samshare

93ef0359b34384920c52bf7b9045049d.png

"本次主要讲解的内容就是特征降维,主要涉及PCA以及一些常见分析方法。"

01

Index

一,PCA降维算法

 1. 内积与投影

 2. 基与基变换

 3. 方差

 4. 协方差

 5. 协方差矩阵

 6. 协方差矩阵对角化

 7. PCA算法步骤

 8. PCA实例

 9. PCA的Python操作

二,LDA降维算法

 1. LDA介绍

 2. LDA的优缺点

 3. LDA的Python操作

在机器学习中,我们有的时候会遇到维度灾难,当模型的训练入参有很多的时候,往往是需要很多的时间和资源去训练的,而这不是我们想要看到的结果。一般情况下,我们都是会对源数据进行特征处理,提取对预测更加有效的特征。

有的时候,我们会得到比较高维的特征向量,而这里面往往包含很多的噪声与冗余数据,所以我们需要通过降维的方式去获取特征更加有效的信息,一来提高特征表达能力,二来提高模型训练的效率。

02

PCA降维算法

PCA(Principal Components Analysis),即主成分分析,是降维操作中最经典的方法,它是一种线性的、无监督、全局性的降维算法,旨在找到数据中的"主要成分",提取主成分从而达到降维的目的。PCA是一种无监督算法,也就是我们不需要标签也能对数据做降维,这就使得其应用范围更加广泛了,但是PCA也有一个问题,原来的数据中比如包括了年龄,性别,身高等指标降维后的数据既然维度变小了,那么每一维都是什么含义呢?这个就很难解释了,所以PCA本质来说是无法解释降维后的数据的物理含义。

在了解PCA之前,有一些基础的名词需要温习一下:

01

内积与投影

内积运算将两个向量映射为一个实数,下面是两个维数相同的向量的内积:

584702f5eb5be991defb82354e4cf395.png

假设存在两个点A,B,其在坐标轴的位置如下图:

ec75d45442e18af66dd7fd4ee8afa5ce.png

我们从A向B引一条垂线,也就是A在B上的投影,其夹角为a,则投影的矢量长度为|A|cos(a),其中

94218c7456aca1f13ba9798eec9656ae.png

是向量A的模,也就是A线段的标量长度。

而内积的另一种表现形式为:

7206701275a887bf6a80657ed293373d.png

也就是说,当B的模为1的时候,也就是单位向量的时候,内积可以表示为:

fc9308a333077fc97a47a0fe88982f34.png

也就是A与B的内积值等于A向B所在直线投影的矢量长度。

02

基与基变换

基可以理解为单位向量,基都是正交的(即内积为0,直观来说就是相互垂直),并且是线性无关的。

基变换指的是当前向量和一个基进行内积运算,得到的结果作为新的坐标分量。

假设存在一个点(3,2),一般我们都会取(1,0)和(0,1)为基,也就是我们的X和Y轴方向。如果我们取(1,1)和(-1,1)为我们的基,但我们希望基的模为1,这样子会方便计算,所以可以除以当前的模长,所以上面的基就变成了:

1e55e30d7104e5e1b3a041cef3570189.png

如下图所示:

e281f5b77adb4090de214e568e85aaf1.png

所以,进行基变换,只需要进行一次内积运算:

e430ee4b10bb35ac75f26f2c00c54b82.png

03

方差

一个字段的方差可以看做是每个元素与字段均值的差的平方和的均值,即:

c801d24b666942652f0f4caf5b8b61e5.png

一般我们都会把均值为化为0,即进行一次变换,所以方差可以表示为:

cd17ee3bf94dae2cf2ade20ab045f7fc.png

04

协方差

如果单纯地选择方差最大的方向,则无法保证两个字段之间相互独立,因为我们需要的是尽可能多地保留原始信息,但又是相互独立,这里我们引入一下概念,协方差,用来表示两个字段的相关性,公式为:

5c84e445499e961b0e5b93a1c2083cb2.png

协方差:度量各个维度偏离其均值的程度。协方差的值如果为正值,则说明两者是正相关的(从协方差可以引出“相关系数”的定义),结果为负值就说明负相关的,如果为0,也是就是统计上说的“相互独立”。

所以,我们的目标就是让两个字段的协方差为0,为了协方差为0,选择第二个基的时候,必须要在第一个基的正交方向上选择。

我们说的PCA降维,就是把N维的特征,降到K维(0 < K < N),也就是说要选择k个单位正交基,并且尽可能让方差最大化。

05

协方差矩阵

在统计学与概率论中,协方差矩阵的每个元素是各个向量元素之间的协方差,是从标量随机变量到高维度随机向量的自然推广。

假设存在矩阵X:

c8ad5de8944531a5abb6b8357c64fd4c.png

其协方差矩阵为:

2af98c86f2c45fbe7d3f2cf5ebaec946.png

可以看出,协方差矩阵的对角线元素为两个字段的方差,而其他元素为矩阵的协方差,按照我们之前的说法,我们需要得到协方差为0,并且方差最大的转换。

06

协方差矩阵对角化

根据上述推导,我们发现要达到优化目前,等价于将协方差矩阵对角化:即除对角线外的其它元素化为0,并且在对角线上将元素按大小从上到下排列,这样我们就达到了优化目的。这样说可能还不是很明晰,我们进一步看下原矩阵与基变换后矩阵协方差矩阵的关系。

设原始数据矩阵X对应的协方差矩阵为C,而P是一组基按行组成的矩阵,设Y=PX,则Y为X对P做基变换后的数据。设Y的协方差矩阵为D,我们推导一下D与C的关系:

72d63047b6057fc5ba53629780671619.png

我们要找的P不是别的,而是能让原始协方差矩阵对角化的P。换句话说,优化目标变成了寻找一个矩阵P,满足PCP^T是一个对角矩阵,并且对角元素按从大到小依次排列,那么P的前K行就是要寻找的基,用P的前K行组成的矩阵乘以X就使得X从N维降到了K维并满足上述优化条件。

07

PCA算法步骤

设有mXn维数据。

1)将原始数据按列组成n行m列矩阵X

2)将X的每一行(代表一个属性字段)进行零均值化,即减去这一行的均值

3)求出协方差矩阵C=1mXXT

4)求出协方差矩阵的特征值及对应的特征向量

5)将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P

6)Y=PX即为降维到k维后的数据

08

PCA实例

假设存在2维数据

64730874a4210bf6897d6a12bcc623f0.png

:,需要将其降至1维。

1)均值归0:目前每个维度的均值均为0,无需变换。

2)求协方差矩阵

de7809cbe40b30b7f7edd5561289fe3c.png

3)求解特征值以及特征向量

75099f0663427e84d229536ecce21d5a.png
13e48a7fb80d6969b98e4bc781c977e0.png

可以参考:https://jingyan.baidu.com/article/27fa7326afb4c146f8271ff3.html

4)标准化特征向量

4c1fdaaeb7d44017fb014165c6452d37.png

5)得到对角矩阵P并验证对角化

778e4c5e43328abb48a729a790e7a9b1.png
553fac17aba9ae9130c7aba8124734d7.png

6)因为需要得到1维矩阵,因此用P的第一行乘以原矩阵即可:

84228675054ae27b9ecb416f9bb67856.png

降维投影如下图所示:

87fe841cfad20162e0fa33f1f0fda6f9.png

09

Python操作

# 使用sklearn进行PCA降维import numpy as npfrom sklearn.decomposition import PCAX = np.array([[-1,2,66,-1], [-2,6,58,-1], [-3,8,45,-2], [1,9,36,1], [2,10,62,1], [3,5,83,2]]) #导入数据,维度为4print('原矩阵X:', X)pca = PCA(n_components=2) #降到2维pca.fit(X) #训练newX=pca.fit_transform(X) #降维后的数据print('贡献率:', pca.explained_variance_ratio_)print('降维后矩阵:', newX)'''参数解释:n_components: 我们可以利用此参数设置想要的特征维度数目,可以是int型的数字,也可以是阈值百分比,如95%,让PCA类根据样本特征方差来降到合适的维数,也可以指定为string类型,MLE。copy:bool类型,TRUE或者FALSE,是否将原始数据复制一份,这样运行后原始数据值不会改变,默认为TRUE。whiten:bool类型,是否进行白化(就是对降维后的数据进行归一化,使方差为1),默认为FALSE。如果需要后续处理可以改为TRUE。explained_variance_: 代表降为后各主成分的方差值,方差值越大,表明越重要。explained_variance_ratio_: 代表各主成分的贡献率。inverse_transform(): 将降维后的数据转换成原始数据,X=pca.inverse_transform(newX)。'''

output:

0629bd3fe71ea1ea97b6cf0c7cd55144.png

03

LDA降维算法

线性判别分析(Linear Discriminant Analysis,LDA)是一种有监督学习算法,也是经常被拿来降维,它和PCA的区别在于是否存在标签,其中心思想就是—— 最大化类间距离和最小化类内距离。

b73032c7e7d617b4fe755a2433df7eb4.png

而PCA的不足在于不能很好地分开不同类别的数据,如下图:

f3d327e039b4a39cdb2172c23c3029a5.png

LDA算法既可以用来降维,又可以用来分类,但是目前来说,主要还是用于降维。在我们进行图像识别图像识别相关的数据分析时,LDA是一个有力的工具。下面总结下LDA算法的优缺点:

01

优点:

1)在降维过程中可以使用类别的先验知识经验,而像PCA这样的无监督学习则无法使用类别先验知识。

2)LDA在样本分类信息依赖均值而不是方差的时候,比PCA之类的算法较优。

02

缺点:

1)LDA不适合对非高斯分布样本进行降维,PCA也有这个问题。

2)LDA降维最多降到类别数k-1的维数,如果我们降维的维度大于k-1,则不能使用LDA。当然目前有一些LDA的进化版算法可以绕过这个问题。

3)LDA在样本分类信息依赖方差而不是均值的时候,降维效果不好。

4)LDA可能过度拟合数据。

03

Python操作

import numpy as npfrom sklearn.discriminant_analysis import LinearDiscriminantAnalysisX = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])y = np.array([1, 1, 1, 2, 2, 2])clf = LinearDiscriminantAnalysis()clf.fit(X, y) LinearDiscriminantAnalysis(n_components=None, priors=None, shrinkage=None, solver='svd', store_covariance=False, tol=0.0001)print(clf.predict([[-0.8, -1]]))

04

Reference

1)Reference十分钟搞定PCA主成分分析

https://blog.csdn.net/tangyudi/article/details/80188302#comments

2)PCA的数学原理

http://blog.codinglabs.org/articles/pca-tutorial.html

85047e0c4b1d0ca2bc2e1db5da32c850.png
993d0b2da85ea8c03a1c8ba62c4b4677.png

星标我,每天多一点智慧

23cdc2984b9ef5d212d0006261704f28.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/537420.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么样的项目是成功的?

项目成功的标准是什么&#xff1f; 项目范围控制住&#xff0c;成本没超标&#xff0c;质量达标&#xff0c;进度按计划&#xff0c;顺利验收。做到这些就是项目成功了吗&#xff1f; 答案显然是不一定&#xff01;&#xff01;! 有多少项目的成本、进度、目标都能够严格按照…

ng-notadd 0.10.1,基于 Angular7 和 material2 的中后台解决方案

更新内容修复 scss左侧导航栏美化修复导航栏 2px 间隔问题技术栈TypescriptAngularMaterial2rxjsGraphql相关链接项目地址DEMOng-notadd-mock-serverQuick startgit clone https://github.com/notadd/ng-notadd.gitcd ng-notaddnpm installnpm start# or use ng cling serve复制…

python需要什么包装_python学习之包装与授权

实现授权的关键点就是覆盖__getattr__()方法&#xff0c;在代码中包含一个对getattr()内建函数的调用。 特别调用getattr()以得到默认对象属性&#xff08;数据属性或者方法&#xff09;并返回它以便访问或调用。 特殊方法__getattr__()的工作方式是&#xff0c;当搜索一个属性…

参加技术培训前的辅导,选得对,学得好

最近几年&#xff0c;每年都会有人问我培训班的事情&#xff0c;我也有培训班经历&#xff0c;在软件行业工作了十多年&#xff0c;每次解答培训班的咨询我都很认真&#xff0c;也很高兴能帮到他人。 决定通过专栏的形式解答培训班常见问题&#xff0c;我把专栏取名“技术培训…

[算法]浅谈求n范围以内的质数(素数)

汗颜&#xff0c;数学符号表达今天才学会呀-_-# 下面是百度百科对质数的定义 质数&#xff08;prime number&#xff09;又称素数&#xff0c;有无限个。质数定义为在大于1的自然数中&#xff0c;除了1和它本身以外不再有其他因数。求质数的方法自然不少&#xff0c;但主要还是…

进入IT行业,要不要参加培训班?

IT行业介绍 考虑培训班无非是要入行,那IT行业好不好?IT行业当然好,看看培训班的数量就知道了。现在房产行业好赚钱,每个小区门口好几家中介门店,相同品牌的可能不止1家。不用去看网上的软文,也不用去问百度,看市场的反应,这是真实的反馈。培训班越来越多,课程越来越多…

python commands_Windows环境下使用python的commands.getstatusoutput

windows调用系统或其他脚本的&#xff0c;常用的是os.popen&#xff0c;次命令本身并不返回执行后的状态&#xff0c;无法用于后续的判断&#xff0c;故尝试Unix下的commands.getstatusoutput&#xff0c;发现在windows下并不能正常使用&#xff0c;如下&#xff1a; >>&…

Kubernetes在上汽集团云平台及AI方面的应用

2019独角兽企业重金招聘Python工程师标准>>> 帆一尚行成立于2015年&#xff0c;是上汽集团的全资子公司&#xff0c;建设有上海、南京、郑州&#xff08;在建&#xff09;三个数据中心&#xff0c;拥有超过4000台物理服务器&#xff0c;10PB的数据存储&#xff0c;总…

我的Java培训经历

此文讲述我的Java开发培训经历&#xff0c;来解答关心的培训费、培训节奏、就业等问题。 我在2010年参加达内Java培训&#xff0c;如今再回首那段时光&#xff0c;虽然辛苦&#xff0c;但很值得&#xff01;&#xff08;后悔参加培训班&#xff0c;大部分原因是冲动&#xff0…

python跨函数调用变量_对python中不同模块(函数、类、变量)的调用详解

首先&#xff0c;先介绍两种引入模块的方法。 法一&#xff1a;将整个文件引入 import 文件名 文件名.函数名( ) / 文件名.类名 通过这个方法可以运行另外一个文件里的函数 法二&#xff1a;只引入某个文件中一个类/函数/变量 需要从某个文件中引入多个函数或变量时&#xff0c…

软件培训技术选哪个?

要培训了,培训技术怎么选? 技术需慎重选 女怕嫁错郎,男怕入错行。后悔参加培训班,因为技术没选好的占比很高。 技术没选好会有什么影响? 近的影响是就业!远的影响是发展! 对于程序员来说,技术就是立身之本,需要慎重选择! 我在《要不要参加培训班?》文章中介绍…

django安装_技术大牛详解:Django框架之环境安装

黑马程序员视频库播妞微信号&#xff1a;boniu236传智播客旗下互联网资讯、学习资源免费分享平台虚拟环境安装:开发中问题&#xff1a;如何在同一台主机中&#xff0c;要开发多个不同的项目&#xff0c;而且需要用到同一个包的不同版本&#xff1f;尝试分析&#xff1a;在开发过…

安装 Alibaba Cloud Toolkit

IntelliJ IDEA版 JetBrains 插件市场下载 Eclipse 版 Eclipse 插件市场仓库下载 (推荐)URL 地址在线安装Maven 版 在 POM 文件中依赖 PyCharm、PhpStorm、RubyMine 和 WebStorm 版 公测中官网https://toolkit.aliyun.com 交流群&#xff08;钉钉&#xff09; 交流群&#xff08…

软件Java前端大数据培训机构怎么选?

先看这篇文章《要不要参加培训班》。 选技术就像选另一半,那选培训机构就是选另一半的家庭。另一半家庭好与不好,与婚后幸福生活息息相关。 选培训机构的几个维度: 1.成立时间 2.专业性 3.市场普及率 成立时间 成立久的不一定好,比如北大某鸟 成立不足3年的,不要选…

高效管理论坛广告贴的小窍门

欢迎访问网易云社区&#xff0c;了解更多网易技术产品运营经验。这里提供一个关于如何管理论坛广告贴的深度视角。一般的论坛在发展初期&#xff0c;用户自发产生的内容不多&#xff0c;每一条数据都弥足珍贵&#xff0c;因此几乎不会考虑到反垃圾需求。随着产品规模的扩大&…

Chrome浏览器多开,亲测有效

原理 指定不同的用户目录&#xff0c;就可以实现多开。即&#xff1a;"--user-data-dir" 指定不同的目录。 操作 新建用户目录文件夹 要开几个&#xff0c;就新建几个&#xff0c;文件夹名随意。 复制chrome快捷方式 修改目标路径 每个快捷方式&#xff0c;修改…

计算机技术与软件专业技术资格(水平)考试 全国各省市成绩查询

大家好&#xff0c;我是51CTO学院的文慧&#xff0c;目前收到很多参加软考考试的学生针对考试成绩查询的问题&#xff0c;无法一一帮助到大家&#xff0c;故开此博客&#xff0c;希望可以帮助到大家。 2018年下半年软考合格标准是多少&#xff1f;根据近几年软考合格标准来看&a…

培训时常犯的学习误区与应对方法

和在学校里上课一样,同一位老师教,同班同学成绩不同。同学之间的资质都是差不多的,因学习方法不同,学习心态不同,课后努力程度不同导致的成绩差异。 本文介绍下培训时容易犯的学习误区和误区的应对方法。 误区1 不懂不明白的地方,非要打破铁锅问到底。 应对方法 培训…

julia有没有希望超越python_未来5-10年,Julia会替代Python成为量化投资热门语言吗?...

今年上过一个quantative programming的课程&#xff0c;去年教学用的语言还是python&#xff0c;加速的方法用的是jit即时编译来提高编程效率&#xff0c;今年课程的设计就改成Julia了。 因为自己从2016年起数据研究用的都是python&#xff0c;所以最开始使用Julia的时候并不习…

常见的三种撞库方法

欢迎访问网易云社区&#xff0c;了解更多网易技术产品运营经验。 在安全领域向来是先知道如何攻&#xff0c;其次才是防。在介绍如何防范网站被黑客扫描撞库之前&#xff0c;先简单介绍一下什么是撞库&#xff1a;撞库是黑客通过收集互联网已泄露的用户和密码信息&#xff0c;生…