笔者最近在学习的过程需要使用一些数据分析和处理的方法,而PCA就是其中常用的一种手段。但在自学的过程中,由于笔者水平有限,对一些博客中的公式不是能很好理解(数学不好的辛酸Ծ‸Ծ),导致总是对整个方法的原理没有一个透彻的理解。后来在视频用最直观的方式告诉你:什么是主成分分析PCA_哔哩哔哩_bilibili
的帮助下,笔者终于从整体上理解了该方法,在此也向该视频作者致以诚挚的感谢。接下来,笔者尽量用自己的话来总结从该视频中的收获,谈谈对PCA原理的理解。为照顾一些和笔者一样基础不太好的小伙伴,这里尽量使用少的公式,而用一些图示来辅助理解。如无特别标明,本文所用的所有图片均来自上述视频。
事先说明,如果仅是对PCA步骤感兴趣的小伙伴,可以直接跳到总结部分,也方便节约时间。:)
主成分分析(Principal components analysis, PCA),顾名思义,其目的在于提取数据中的主要成分信息,因此,常用于对数据的提炼,例如:降维(使用最多的领域之一),异常值检测等,是数据分析中的一种重要方法。
那么,PCA究竟做了什么呢?我们通过下面的图来简单理解一下:

我们首先来看一个特殊情况,假如在原坐标系下,有这样六个点,每个点的坐标包括x和y,这样,当我们要记录这些点的坐标时,我们需要同时记录它们的x坐标和y坐标,也就是要记录2个维度的信息。
那么,假如我们移动坐标系,让新坐标系如右所示,令所有的点都位于一个轴上,同时能较好的保留原先数据分布的信息。这样,由于在y'上坐标全部为0,因此我们完全可以去掉,仅用x'坐标就可以表示这些点。这样,原先需要保存2维的坐标信息,在进行这样的坐标系转换后,就仅需保留1维的坐标信息,我们便完成了对数据的提炼,或者在这里,可以称为对数据的降维。
相信在看了上面一段话后,有的小伙伴已经悟到了,没错,PCA所作的,就是这样一个坐标系转换的事情。

PCA其实目的就是为了寻找这样一个转换后的坐标系,使数据能尽可能分布在一个或几个坐标轴上,同时尽可能保留原先数据分布的主要信息,使的原先高维度的信息,在经过转换后可以用低维度的信息来保存。而新坐标系的坐标轴,称为主成分(Principal components, PC), 这也就是PCA的名称来源。
那么,怎么样的坐标系,算是“保留信息最多呢”?

答:选择数据分布最分散,即方差最大的方向。
可以对比上面两张图上的两个坐标轴方向,可以看到,当数据投影到图一方向的坐标轴上时,数据分布的最为分散,此时,方差也是最大,这种情况下,能够最完整的保留原先数据的差异性,从而便于区分。
而在图二中,数据在坐标轴上的投影就有许多重叠的地方,方差会较小,这种情况下,原先差异性很大的数据在投影后便无法区分,没有保留原先数据的信息,不是一个好的方向。
因此,我们把方差最大的方向选为主成分1的方向,其垂直方向即为主成分2方向,以此类推。
在了解PCA的目的后,接下来,就是考虑如何实现,即如何实现这样的坐标系转换。
首先,要将数据去中心化,即将坐标原点放在数据中心。若不执行去中心化,就会出现这种现象:


相当于在原地空转,可能发现不了最好的方向。
进行了去中心化后,将数据中心放在坐标原点,则就会避免这个问题。


即找到方差最大的方向。
在回答这个问题前,我们首先回顾一下矩阵线性变换的知识。

拉伸矩阵S的特点是只在对角线上有数字,即拉伸矩阵是对称矩阵,满足,它实现的数据在轴上的水平拉伸(包括缩放)。

如图,旋转矩阵的特点是,其逆矩阵就等于其本身,即,图中R的操作,实现的是逆时针旋转坐标轴θ角。


我们手里的数据,其实就相当于一个服从多维高斯分布的数据经过拉伸和旋转之后形成的数据,因此,找到方差最大的方向,其实就是求这个旋转矩阵R,即求我们旋转的角度。
如何求R,这里先给个结论,协方差矩阵的特征向量就是R。具体推导我们慢慢来:

首先回顾一下协方差的概念,协方差代表的是两个变量变化的一个相关程度,如果x增大,y也增大,则成为正相关;反之,则为负相关,而这个相关的程度,就是协方差。x和y的协方差用cov(x,y)表示,正相关时,cov(x,y)>0;负相关时,cov(x,y)<0,不相关则为0。顺便一提,变量自己和自己的协方差,就是方差,即cov(x,x)=var(x)
因此,协方差矩阵的表示如下:
当数据进行拉伸和旋转时,协方差也会随之改变,根据协方差的定义,协方差矩阵也可以通过这样计算得到。
即C等于数据乘以其转置,再除以n-1,n为数据的维度。

现在再回来看我们手上的数据D’,由于D’是由白数据经过拉伸S和旋转R得到,即D’=RSD,而白数据的协方差矩阵C为单位矩阵,因此,结合拉伸和旋转矩阵的性质代入公式后,可以得到D'的协方差矩阵C’=RLR-1。R即旋转矩阵,L为S的平方。



结合特征向量和特征值的概念,现在,我们可以清楚的看到,R就是C'的特征向量的矩阵,而L则是特征值的矩阵,两者分别代表旋转和拉伸的程度。
现在,我们就可以对如何求R做一个概括:只要我们对手上的数据求协方差矩阵,然后求它的特征向量矩阵,这个特诊向量矩阵就是R。同时,确定了R后,我们就确定了方差最大的方向,也就是主成分的方向,这样,就完成了对坐标系的转换。
总结来说,PCA的步骤主要就是以下几步:
对数据进行去中心化(将坐标原点放到数据中心)->求数据的协方差矩阵C->再求得C的特征向量矩阵R->将原坐标系下(去中心化后)的数据通过R进行旋转变化,即得到经过PCA转换后的坐标,R也是主成分的方向。
以上便是关于PCA的原理分析。由于笔者才疏学浅,定然还有许多错误与纰漏之处,欢迎大家的补充,未来笔者也会不断进行修订。在对代码理解后,笔者接下来计划补充matlab上PCA的使用方式,帮助进入实际应用。
最后,再次感谢该视频及其创作者!
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01 客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02 数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit
文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co
我正在尝试在Rails上安装ruby,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf
文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,
SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手