数据集怎么导出_PCA算法 | 数据集特征数量太多怎么办?用这个算法对它降维打击...

今天是机器学习专题的第27文章,我们一起来聊聊数据处理领域的降维(dimensionality reduction)算法。

我们都知道,图片格式当中有一种叫做svg,这种格式的图片无论我们将它放大多少倍,也不会失真更不会出现边缘模糊的情况。原因也很简单,因为这种图片是矢量图,一般的图片存储的是每一个像素点的颜色值,而在矢量图当中,我们存储的是矢量,也就是起点终点以及颜色。由于矢量图只记录起点终点,所以无论我们如何放大,图片都不会失真,而传统的图片就做不到这一点。

其实svg就相当于图片的降维,我们将上百万的像素点简化成了若干个矢量完成了图片的存储,大大减少了数据的规模。机器学习领域中的降维算法其实也是差不多的原理。

背景与原理

现在降维算法这个词已经越来越少听到了,在面试当中也很少被提及,这是有时代因素的。因为现在的计算资源以及存储资源越来越廉价了,在以前很难承担的计算量,现在变得越来越轻松。所以相对而言,降维算法没有之前热门了,也越来越少在面试当中出现。

从现状倒推回从前,我们大概可以猜到,在若干年以前,当我们面临海量无法承担的数据的时候,降维算法是多么的重要。因为,我们都知道,机器学习训练的速度和它使用的数据量有这非常密切的关系,使用10维特征和使用100维特征的模型的收敛速度至少是10倍以上的差距。那么,自然而然地我们就会想到,如果有某种方法可以将100维的数据”压缩“成10维,该有多好?

但问题来了,数据不是实体,我们真的可以随意压缩吗,这其中的原理是什么呢?

最根本的原理是既然特征可以用来训练模型,那么特征的分布和label的分布必然是有一定的内在联系的。也就是说数据并不是随意分散的,而是彼此之间有联系的。我们各种各样的压缩算法,本质上都是利用了数据之间的关联。

举个不是非常恰当,但是很直观的例子。假设说我们现在有三个特征,分别是一个人的考试成绩、智商以及努力程度。我们会很明显地发现,考试成绩和智商以及努力程度这两个特征高度相关。如果我们能够找到它们之间的关联,我们完全可以去掉考试成绩这个特征,而通过智商、努力程度和它的这种关联来推算出这个值来。当然既然是推算出来的,显然会和原本的值有一定的误差,这也是不可避免的。

从这个例子当中,我们可以明确两点,首先,压缩数据是利用的数据分布的关联或者是特性,如果是完全随机的数据是无法降维压缩的。其次,降维压缩必然会带来信息损失,也就是误差,这是不可避免的。

降维算法

降维压缩的算法有好几种,常见的有PCA、ICA和FA,下面我们来简单介绍一下。

首先是PCA,PCA的英文全称是Principal Component Analysis即主成分分析。这种方法的主要原理是对数据进行坐标变换,即将数据从原来的坐标系更换到新的坐标系。新的坐标轴是通过最大方差理论推导得到的,即新的坐标轴包含了原始数据中大部分的方差,这里的方差可以理解成信息。

ICA的英文是Independent Component Analysis即独立成分分析,在这个算法当中它假设数据是通过N个数据源生成的。假设数据是这N个数据源数据混合观察的结果。这些数据源在统计上是互相独立的,如果数据源的数目少于原始特征的数目,也可以完成降维。

最后是FA即Factor Analysis即因子分析。在因子分析当中,我们假设样本当中存在一些隐变量,我们假设样本是这些隐变量和一些噪音的线性组合。那么只要这些隐变量的数量少于原始特征的数量,我们就可以用这些隐变量来作为新的数据从而实现降维。

这三种降维算法虽然各不相同,但是核心的思路都是一致的。都是假设数据的分布满足某一种特性,通过利用这一种特性来对数据进行压缩。这其中使用范围最广的是PCA,所以我们着重来了解一下PCA的原理以及实现。

理论推导

关于PCA算法有两种通俗的解释,一种是最大方差理论,另外一种是最小化降维损失,这两个思路推导出的结果是一样的。相比之下,最大方差理论更加容易理解一些,所以我们就选择最大方差理论来做个简单的解释。

在信号系统当中,我们普遍认为信号具有较大的方差,而噪音拥有较小的方差。信噪比就是信号与噪声的方差比,这个比值越大越好,越大说明噪音越小,信号的质量越高。比如下图当中的这个数据分布,我们可以在原始数据当中找到两个正交轴,根据方差最大理论,我们会把方差大的那个轴看成是信号,方差小的看成是噪音。

根据这个思路,最好的k维特征是将n维的样本转换成k维坐标之后,拥有最大方差的k个

13e75a9ce19df6680b78aec9d7b4a753.png

协方差

到这里,我们虽然知道了要获取方差最大的方向作为新的坐标轴,但是如果我们直接去计算的话是会有问题的。最大的问题在于我们没办法选出K个来,如果只是选择类似的K个方向,这K个轴的信息都差不多,会丢失大量的信息。所以我们不仅要选择K个轴,而且要保证这K个轴尽可能线性无关

要做到线性无关,也就是说这K个轴应该是彼此正交的。如果两个轴正交,可以进一步得到这两个轴的协方差为零。为了简化运算,我们可以先让原始数据全部减去各自特征的均值。在去除均值之后,两个特征的协方差可以表示为:

f39a299fdd38f8332b520c4b4c461c2d.png

两个特征正交等价于它们的协方差为0,我们假设去除了均值之后的矩阵为X,我们来写出它的协方差矩阵。

协方差矩阵

对于去除了均值的矩阵X而言,有一个性质是它的协方差矩阵

X_cov=1/m X X^T。我们可以来简单证明一下,假设矩阵当中只有两个特征a和b,那么我们将它按行写成矩阵:

5af02b20b65ab75d2e4f9449c99c0e96.png

我们假设X的协方差矩阵为C,那么C是一个对称矩阵,它的对角线上的元素表示各个特征的方差,其他的元素则表示特征之间的协方差。我们的目标是希望能够得到一个类似形式的对角矩阵,也就是说除了对角线之外的其余元素全为0,这样这些特征之间就是正交矩阵,我们根据对角线上的值挑选出方差最大的K个特征即可。

我们的目的和方向已经很明确了,距离终点只有一步之遥,但是这一步怎么迈过去呢?

对角化

这里我们采用逆向思维来思考,假设我们已经找到了矩阵P,通过P对X进行线性变换的结果是Y,那么Y=PX,我们假设Y的协方差矩阵为D,那么根据刚才我们推导的结论可以得到:

b8c7fbeb042adc3567a597b100af9423.png

我们希望D是一个对角矩阵,所以我们要寻找的就是P,P找到之后一切都迎刃而解。因为D是一个对角矩阵,我们将它对角的元素从大到小排列之后,对应P的行组成的矩阵就是我们寻找的基。我们用P的前K行组成的新矩阵对原始数据X进行线性变换,就将它从n维降低到了K维。

所以问题就只剩下了一个,这个P矩阵要怎么求呢?我们干想是很困难的,其实数据家们已经给了我们答案,就是C矩阵的特征向量

由于C是对称矩阵,根据线性代数的原理,它有如下两条性质:

  1. 对称矩阵不同的特征值对应的特征向量必然正交
  2. 特征值是实数,K重特征值对应的线性无关的特征向量刚好有K个

根据这两条性质,我们可以得到,对于n*n的矩阵C来说,我们可以找到n个特征向量 e_1, e_2, ... , e_n。我们将它们按列组成矩阵:

87945ffc0ef6bd9793ea0dd2b5517a5a.png

我们通过E可以将C对角化:

da9ec266d9121c0a4526729ada3dd4cb.png

我们对Lambda中的特征值从大到小排列,选出前K个特征值对应的特征向量组成矩阵即得到了最终的结果P。

最后,我们整理一下上述的整个过程。

  1. 每一维特征减去平均值
  2. 计算协方差矩阵
  3. 求解协方差矩阵的特征值和特征向量
  4. 对特征值降序排序,选择其中最大的K个,然后将对应的K个特征向量作为行向量组成特征向量P
  5. 转换之后的结果X_t = PX

我们把这个逻辑整理一下,写成代码:

import numpy as npdef pca(df, k):    mean = np.mean(df, axis=0)    new_df = df - mean    # 计算协方差矩阵,也可以用公式自己算    cov = np.cov(new_df, rowvar=0)    # 求解矩阵特征值和特征向量    eigVals, eigVects = np.linalg.eig(np.mat(cov))    # 对特征值排序,选最大的K个,由于是从小到大排,所以我们取反    eigValIndice = np.argsort(-eigVals)    # 构建变换矩阵    n_eigValIndice = eigValIndice[:k]    n_eigVect = eigVects[:, n_eigValIndice]    data_ret = new_df.dot(n_eigVect)    return data_ret

实战验证

为了验证程序效果,我们找了一份经典的机器学习数据:http://archive.ics.uci.edu/ml/datasets/SECOM。

我们把它下载下来之后,用pandas读入进来:

a381105514f82d823a1abf538b7fff45.png

可以看到它的特征有590维,展开看的话会发现特征当中有许多空值:

abf57fa639e282b733e19069b138ff59.png

我们对它进行一个简单地预处理,将空值替换成特征均值,并且再读入label的值:

46625bc6263579936b1fda078519ae80.png

为了验证PCA降维的效果,我们用同样一份数据,用同样的模型,比较一下做PCA之前和之后模型的效果

这里我选择的是随机森林,其实不管用什么模型都大同小异。我们将数据拆分成训练数据与测试数据,并且调用skelarn库当中的随机森林完成训练和预测,最后计算模型在测试集当中的表现。说起来挺复杂,但是由于sklearn替我们完成了大量的工作,所以用到的代码并不多:

0c78e4aca0606169c7860c4afc415981.png

我们可以看到,在PCA之前,随机森林在测试集上的表现是92.3%的准确率。

接下来,我们用同样的数据和模型来验证PCA之后对于模型性能的影响。为了保证数据集的完全一致,我们把测试集的随机种子也设置成一样

b001e2c5bcf428464be71928eef62212.png

可以看到模型在测试集上的准确率完全一样,说明PCA并没有过多降低模型的性能,和我们的预期一致。

总结

在今天的文章当中,我们详细介绍并推导了PCA背后的原理,并采取实际数据集验证了PCA算法的效果。从最后的结果上来看,虽然我们将590维的特征缩减到了10维,但是模型的效果却几乎没有多大影响,可见PCA的威力。

当然,这背后的因素很多,除了PCA本身的原理之外,和数据的分布以及训练测试样本的数量也有关系。在极端场景下,可能特征的数量非常多,含有大量的噪音,如果我们不做降维直接训练的话,很有可能导致模型很难收敛。在这种情况下,使用降维算法是必要的,而且会带来正向的提升。如果特征数量不多,模型能够收敛,使用降维算法可能没什么助益,而且会稍稍降低模型的效果。但在一般的情况下,数据集特征的分布也符合二八定律,即20%的特征带来80%以上的贡献,大部分特征效果不明显,或者噪音很多。在这种情况下,使用PCA进行降维,几乎是一定起到正向作用的。

当然在实际的应用场景当中,降维算法用的越来越少,除了计算能力提升之外,另外一个很重要的原因是深度学习的兴起。深度神经网络本身就带有特征筛选的效果,它自己会选择合适的特征组合达到最好的效果,所以很多特征处理和降维等操作显得不是特别有必要了。虽然如此,但是算法本身的思想还是很有借鉴作用,PCA算法在Kaggle比赛当中使用频率也很高,对它进行详细地了解和学习还是很有必要的。

今天的文章就到这里,如果喜欢本文,可以的话,请点个赞和关注吧,给我一点鼓励,也方便获取更多文章。

本文始发于公众号:TechFlow

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

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

相关文章

常用命令_GIT常用命令大全

Git 是一个很强大的分布式版本控制系统。它不但适用于管理大型开源软件的源代码,管理私人的文档和源代码也有很多优势。克隆远程文件:git clone https://gitee.com/abcd/codefile.git projectgit checkout -b dev(本地分支名称) origin/dev(远程分支名称…

nvidia显示设置不可用_Nvidia显示设置不可用,您当前未使用连接到NVIDIA GPU的显示器的解决方法...

相信不少用户遇到这样一个问题,就是新购买的台式机电脑,配置达标的情况下,玩游戏出现卡顿不流畅的现象,准备在NVIDIA控制面板查看是否设置的问题,在打开NVIDIA控制面板的时候,提示了“Nvidia显示设置不可用…

oracle tns 代理配置_Toad for oracle安装配置与使用

一.toad安装与配置注意:toad的使用本机电脑必须安装完整版oracle客户端,不能是精简版的.1.1完整版oracle客户端的安装.1.解压文件,安装oracle客户端打开安装包,找到setup.ext,开始安装。提示下图弹窗,可根据此网址内容进行更改(https://blog.…

吴枫 python小课账号_无门槛速学编程——Python小短课,自上而下分而治之

【Python小短课 11】自上而下,分而治之 做任何事都需计划,编程也是。 譬如写文章要列大纲、作画要想布局,编程也需先谋全局,而后思虑细节。 就以上回说到的“找宝藏”这个程序举例,最顶层的需求自然就是“找宝藏”&…

计算机本地磁盘D无法扩展,计算机上的本地磁盘D突然无法打开,表明它需要格式化...

接受使用数据恢复软件将重要数据保存到其他磁盘FindDate特定操作: 运行软件----“打开”后,将显示要还原的驱动器. C \ D \ E \ F选择您要还原的一个,它将开始. 扫描后,再次保存扫描的文件. 哈哈,希望对您有所帮助.最后&#xff0…

caffe运行不停止_caffe(gpu)安装过程及问题解决

2019.12.05 caffe(gpu)安装参考网址:教程1:weiliu89/caffe​github.com教程2:https://blog.csdn.net/yggaoeecs/article/details/79163789​blog.csdn.net环境:Ubuntu16.04cuda10.0安装过程:git clone https://github.…

2021年考计算机考研三战,2021考研的小伙伴有3条忠告一定要记得,这些都是历年实战经验...

2021考研的小伙伴有3条忠告一定要记得,这些都是历年实战经验,考研一定要记得避开三个大坑。1,分数线低的学校就一定容易考。有一些学校分数线看着很低但实际上难度不低,比如首都师范大学 ,很多专业就是国家线录取甚至招…

c++ 返回string_JVM系列之:String.intern和stringTable

简介StringTable是什么?它和String.intern有什么关系呢?在字符串对象的创建过程中,StringTable有起到了什么作用呢?一切的答案都在本文中,快来看看吧。intern简介intern是String类中的一个native方法,所以它…

华为 虚拟键盘_华为mate30 pro虚拟机械键盘特有体验,虽是虚拟,但却感受逼真...

华为Mate30 pro已于26日在国内正式发布了。此外,根据了解华为Mate30系列现在已经突破了5亿的销售额。看来,华为的这个下半年旗舰手机非常受欢迎啊。华为Mate30系列现在在国内已经发布了,其整体感官看上去与海外的没有多大的区别。其实&#x…

计算机有什么著名基金经理排名,百万年薪的基金经理,都是什么专业出身?!...

有人会说了“小哔君你四不四撒!基金经理肯定是金融专业出身的咯?不然嘞?”但事实的真相是许多基金经理都并非科班出身这要从基金经理的晋升机制说起了!如下图基金经理都是从研究员做起的!那么问题来了,如何…

遍历children_589. N叉树的前序遍历

589. N叉树的前序遍历给定一个 N 叉树,返回其节点值的前序遍历。例如,给定一个 3叉树 :返回其前序遍历: [1,3,5,6,2,4]。说明: 递归法很简单,你可以使用迭代法完成此题吗?题解:既然是树的遍历,那么一共就是两种思路&a…

计算机未显示移动硬盘,电脑不显示移动硬盘怎么办_移动硬盘已连接不显示解决教程...

最近有很多小伙伴咨询小编,电脑不显示移动硬盘怎么办,怎么设置才能恢复呢?其实操作内容很简单,尝试删除你的USB3.0可扩展主机控制器,再扫描硬件改动,今天就由小编来告诉你,移动硬盘已连接不显示的解决方法。…

八个角最多可以把平面分成多少部分?_一个空间最多能被分成几块?

相信大家在小学奥数中都遇到这样一个问题:4条直线最多能将平面分成几部分?这个问题并不能难倒我们,但是如果将问题改为:4个平面最多能将空间分为几部分?这下子我们可能就要放弃了。为了解决这个问题,今天我…

破坏计算机信息系统功能罪,破坏计算机信息系统罪

破坏计算机信息系统罪2010年05月05日19:42法律咨询 我要评论一、概念&nbsp&nbsp&nbsp&nbsp破坏计算机信息系统罪(刑法第286条),是指违反国家规定,对计算机信息系统功能或计算机信息系统中存储、处理或者传输的数据和应用程序进行破坏…

东京战纪服务器维护中,东京战纪7月21维护公告 当前测试进度介绍

东京战纪当前的测试进度已经有了很大的进步,接下来小编就跟大家一起看看测试期间对玩家给大家的报告吧。亲爱的喰种和CCG搜查官们7月19日中午12:00,我们怀着紧张又忐忑的心情开启了《东京战纪》官网限量删档技术测试。大家对《东京喰种》IP的热爱和对《东…

docker重启后容器消失_docker设置固定ip地址

代码来源:博客园 原文作者:雪之谷 原文链接:https://www.cnblogs.com/xuezhigu/p/8257129.html 本文版权归原作者所有,如有侵权请立即与我联系,我将及时处理。 背景: 我开发用的机器上边会启动几个容器,就因为保洁阿姨碰了一下我的插排,我的机器被断电关机了。 默认情况下…

模型稳定后放在服务器上,把工程放在服务器上

把工程放在服务器上 内容精选换一换获取方式:Ascend-mindx-msinstaller_{version}.zip:获取链接适用场景:在一台Linux服务器上使用msInstaller工具给本机安装开发或运行环境。在一台Linux服务器上使用msInstaller工具远程给昇腾AI设备安装开发…

html计算器_学习HTML、CSS和JavaScript的最佳方法是什么?

与其他后端语言相比,HTML、CSS和JavaScript无论从阅读角度还是编写的角度来说都更加容易一点。所以新手在学习前端知识的时候不必有太大的心理压力 ,心态摆正后,大部分人都可以将前端学好。下面聊聊Html、CSS、JavaScript的最佳学习方法&…

网站重新解析换服务器,更换解析服务器地址

更换解析服务器地址 内容精选换一换普通的域名解析只为用户返回解析记录,不会考虑访问者的来源,这样所有的访问者都被解析到相同的IP地址上,容易出现由跨运营商访问引起网络延迟。运营商线路解析是云解析服务提供的按运营商维度来区分访问者来…

git merge 回退_Git 基础学习总结2(学不会你锤我)

作者序:我在知乎上搜索了有关 Git 的学习文章,虽然点赞很多但我认为他们写得并不好,内容不够详尽,排版让人看得疲劳,所以我决定自己写几篇关于 Git 的学习文章。当别人提供的不好用就自己创造一个新的,这也…