PCA(主成分分析方法)

2023-10-27

 

目录

1. 降维问题

2. 向量与基变换

2.1 内积与投影

2.2 基

2.3 基变换的矩阵

3. 协方差矩阵及优化目标

3.1 方差

3.2 协方差

3.3 协方差矩阵

3.4 协方差矩阵对角化

4. 算法与实例

4.1 PCA算法

4.2 实例

5. 讨论


      PCA(Principal Component Analysis)是常用的数据分析方法。PCA是通过线性变换,将原始数据变换为一组各维度线性无关的数据表示方法,可用于提取数据的主要特征分量,常用于高维数据的降维。

1. 降维问题

      数据挖掘和机器学习中,数据以向量表示。例如某个淘宝店2012年全年的流量及交易情况可以看成一组记录的集合,其中每一天的数据是一条记录,格式如下:

                          (日期, 浏览量, 访客数, 下单数, 成交数, 成交金额)

其中“日期”是一个记录标志而非度量值,而数据挖掘关心的大多是度量值,因此如果我们忽略日期这个字段后,我们得到一组记录,每条记录可以被表示为一个五维向量,其中一条样本如下所示: 

                          

一般习惯上使用列向量表示一条记录,本文后面也会遵循这个准则。

      机器学习的很多算法复杂度和数据的维数有着密切关系,甚至与维数呈指数级关联。这里区区5维的数据,也许无所谓,但是实际机器学习中处理成千上万甚至几十万维的数据也并不罕见,在这种情况下,机器学习的资源消耗是不可接受的,因此就会对数据采取降维的操作。降维就意味着信息的丢失,不过鉴于实际数据本身常常存在相关性,所以在降维时想办法降低信息的损失。

       例如上面淘宝店铺的数据,从经验可知,“浏览量”和“访客数”往往具有较强的相关性,而“下单数”和“成交数”也具有较强的相关性。可以直观理解为“当某一天这个店铺的浏览量较高(或较低)时,我们应该很大程度上认为这天的访客数也较高(或较低)”。因此,如果删除浏览量或访客数,最终并不会丢失太多信息,从而降低数据的维度,也就是所谓的降维操作。如果把数据降维用数学来分析讨论,用专业名词表示就是PCA,这是一种具有严格数学基础并且已被广泛采用的降维方法。

2. 向量与基变换

2.1 内积与投影

      两个大小相同向量的内积被定义如下:

                              

      

2.2 基

       在代数中,经常用线段终点的点坐标表示向量。假设某个向量的坐标为(3,2),这里的3实际表示的是向量在x轴上的投影值是3,在y轴上的投影值是2。也就是说隐式引入了一个定义:以x轴和y轴上正方向长度为1的向量为标准。那么一个向量(3,2)实际是在x轴投影为3而y轴的投影为2。注意投影是一个矢量,可以为负。向量(x, y)实际上表示线性组合:

                                               

由上面的表示,可以得到所有二维向量都可以表示为这样的线性组合。此处(1,0)和(0,1)叫做二维空间中的一组基。

                               

      之所以默认选择(1,0)和(0,1)为基,当然是为了方便,因为它们分别是x和y轴正方向上的单位向量,因此就使得二维平面上点坐标和向量一一对应。但实际上任何两个线性无关的二维向量都可以成为一组基,所谓线性无关在二维平面内,从直观上就是两个不在一条直线的向量。

      例如,(1,1)和(-1,1)也可以成为一组基。一般来希望基的模是1,因为从内积的意义可以看到,如果基的模是1,那么就可以方便的用向量点乘基而直接获得其在新基上的坐标。实际上,对应任何一个向量我们总可以找到其同方向上模为1的向量,只要让两个分量分别除以模,则上面的基变为。于是坐标(3,2)在新的基上的坐标为,其中计算的过程是用坐标(3,2)分别与两个基做内积。

                                

       另外这里的基是正交的(即内积为0,或直观说相互垂直),可以成为一组基的唯一要求就是线性无关,非正交的基也是可以的。不过因为正交基有较好的性质,所以一般使用的基都是正交的。

2.3 基变换的矩阵

     上述例子中的基变换,可以采用矩阵的乘法来表示,即

                                         

      如果推广一下,假设有M个N维向量,想将其变换为由R个N维向量表示的新空间中,那么首先将R个基按行组成矩阵A,然后将向量按列组成矩阵B,那么两矩阵的乘积AB就是变换结果,其中AB的第m列为A中第m列变换后的结果,通过矩阵相乘表示为:

                           

其中是一个行向量表示第i个基,是一个列向量表示第i个原始数据记录。特别要注意的是,这里R可以小于N,而R决定了变换后数据的维数。也就是说,将N维数据变换到更低维度的空间中,变换后的维度取决于基的数量。

最后,矩阵的乘法运算的物理解释:两个矩阵相乘的意义是将右边矩阵中的每一列列向量变换到左边矩阵中每一行行向量为基所表示的空间中去

3. 协方差矩阵及优化目标

      在进行数据降维的时候,关键的问题是如何判定选择的基是最优。也就是选择最优基是最大程度的保证原始数据的特征。这里假设有5条数据为

                                           

计算每一行的平均值,然后再让每一行减去得到的平均值,得到

                                             

通过坐标的形式表现矩阵,得到的图如下:

                                   

      那么现在的问题是:用一维向量来表示这些数据,又希望尽量保留原有的信息,该如何选择呢?这个问题实际上是要在二维平面中选择一个方向的向量,将所有数据点都投影到这条直线上,用投影的值表示原始记录,即二维降到一维的问题。那么如何选择这个方向(或者说基)才能尽量保留最多的原始信息呢?一种直观的看法是:希望投影后的投影值尽可能分散。

3.1 方差

上述问题是希望投影后投影的值尽可能在一个方向上分散,而这种分散程度,可以采用数学上的方差来表述,即:

                                  

于是上面的问题被形式化表述为:寻找一个一维基,使得所有数据变换为这个基上的坐标后,方差值最大。

3.2 协方差

数学上可以用两个特征的协方差表示其相关性,即:

                               

当协方差为0时,表示两个特征完全独立。为了让协方差为0,选择第二个基时只能在与第一个基正交的方向上选择。因此最终选择的两个方向一定是正交的。

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

3.3 协方差矩阵

假设只有x和y两个字段,将它们按行组成矩阵,其中是通过中心化的矩阵,也就是每条字段减去每条字段的平均值得到的矩阵:

                                        

然后用乘以的转置,并乘上系数

                               

于是得到矩阵,其中对角线上的值正好是两个字段的方差,而其他值便是两个字段的协方差。如果把上面换成的矩阵,则字段就变成个。

3.4 协方差矩阵对角化

4. 算法与实例

4.1 PCA算法

4.2 实例

                                

5. 讨论

根据上面对PCA的数学原理的解释,可以了解到一些PCA的能力和限制。PCA本质上是将方差最大的方向作为主要特征,并且在各个正交方向上将数据“离相关”,也就是让它们在不同正交方向上没有相关性。

因此,PCA也存在一些限制,例如它可以很好的解除线性相关,但是对于高阶相关性就没有办法了,对于存在高阶相关性的数据,可以考虑Kernel PCA,通过Kernel函数将非线性相关转为线性相关。另外,PCA假设数据各主特征是分布在正交方向上,如果在非正交方向上存在几个方差较大的方向,PCA的效果就大打折扣了。

最后需要说明的是,PCA是一种无参数技术,也就是说面对同样的数据,如果不考虑清洗,谁来做结果都一样,没有主观参数的介入,所以PCA便于通用实现,但是本身无法个性化的优化。

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PCA(主成分分析方法) 的相关文章

随机推荐

  • 萌新的Arduino大作业

    全自动收 晾衣服机 备注 本人因学校社团假期作业要求 用Arduino IDE编写并模拟实现了一个全自动 收 凉衣服的机器 由于硬件条件不足只能模拟 本人也是萌新一枚 希望观看的 大佬们不喜勿喷 有发现做错的话欢迎在评论区讨论 如果对你有帮
  • 西门子编程基础学习分享(3)-数据类型详述

    1200PLC的数据类型详述 前文所提到的数据类型用于描述数据的长度以及属性 即为指定数据元素的大小以及如何解释数据 每个指令至少支持一种数据类型 因而指令上使用的操作数的数据类型必须与指令所支持的数据类型一致 所以在设计程序 建立变量时需
  • Uva 540 Team Queue

    有t个团体的人正在排一个长队 每次新来一个人时 如果这个成员所在的团体已经有人在排队了 那么他就加到最后一个队友身后 如果整个大队列中没有他的团体 那么他就要排在整个大队列的最后 输入每个团队的人数 每个人的编号 要求支持下面的操作 前两种
  • 【订单服务】库存解锁和关单

    消息队列流程图 监听库存解锁 下单成功 库存锁定成功 接下来的业务调用失败 导致订单回滚 之前锁定的库存就要自动解锁 配置队列和交换机 Configuration public class MyRabbitConfig 使用json序列化机
  • 失业在家靠做PPT日赚800-1000元,有一门副业真的很重要!

    下班做PPT 半年挣8万是什么感觉 你好 我是佳佳 一个用PPT兼职挣钱的宝妈 我现在每天抽2个小时 坐在电脑前 把各种素材像拼图一样拼接一下 像这样 然后把成稿投稿到设计平台 就能挣到钱 你是不是觉得 我是个职业设计师 挺厉害的 不是的
  • NLP(十五)让模型来告诉你文本中的时间

    背景介绍 在文章NLP入门 十一 从文本中提取时间 中 笔者演示了如何利用分词 词性标注的方法从文本中获取时间 当时的想法比较简单快捷 只是利用了词性标注这个功能而已 因此 在某些地方 时间的识别效果并不太好 比如以下的两个例子 原文1 苏
  • python递归实现字符串逆反

    def main string input Enter a string string1 reverse string print string s reverse format is string1 def reverse string
  • YOLOV7学习记录之训练过程

    在前面学习YOLOV7的过程中 我们已经学习了其网络结构 然而实际上YOLOV7项目的难点并不在于其网络模型而是在于其损失函数的设计 即如何才能训练出来合适的bbox 神经网络模型都有训练和测试 推理 过程 在YOLOV7的训练过程中 包含
  • Java学习笔记:Java中的加号“+”

    在今晚学习Java时惊奇地发现Java中有 System out println 赋值后c的值为 c 这样的与c语言不同的语法 本着打破砂锅问到底 xue dao si 的精神 稍微整理了一下 下面是整理出来的Java中加号 的用法 算术运
  • mysql字段使用非int做主键,查询时候使用整型和字符串做查询条件的区别

    where条件key是整型的时候也可以找到记录 但是效率慢 不会使用索引 使用字符串的时候会使用主键索引会很快
  • ionic入门教程第十五课-ionic性能优化之图片延时加载

    周五的时候有个朋友让我写一个关于图片延时加载的教程 直到今天才有空编辑 这阶段真的是很忙 公众号都变成僵尸号了 实在是对不起大家 有人喜欢我的教程 可能我总习惯了用比较简单容易理解的方式去描述这些东西 别的就不多说了 大家遇到什么问题 可以
  • 100天精通Python(基础篇)——第23天:while循环 :99乘法表

    i 0 while i lt 10 print 我喜欢你 i 1 print endl i 0 sum 0 while i lt 101 i 1 sum i print f sum sum import random num random
  • django1.10 静态文件配置

    settings配置 网站引用静态文件时都会加上该地址 如 http www xxx com static css mini css STATIC URL static 静态文件根目录 执行命令 python manage py colle
  • PostgreSQL 服务启动不了问题

    配置了postgresql数据的配置文件 pg hba conf后 重记一下服务 结果启动不了 提 示错误 root instance 609xznso run systemctl start postgresql 11 Job for p
  • C++11 function、bind、可变参数模板

    在设计回调函数的时候 无可避免地会接触到可回调对象 在C 11中 提供了std function和 std bind两个方法来对可回调对象进行统一和封装 C 语言中有几种可调用对象 函数 函数指针 lambda表达式 bind创建的对象以及
  • Hibernate的加载方式——GET与LOAD的对比

    在Hibernate框架中 最常用到的加载方式就非Get和Load莫属了 然而Get和Load在加载方式上边还有很多的不同 下面让我们来分析一下他们的不同之处 区别 从返回的结果上来看 get load在检索到数据的时候 会返回对象 代理对
  • firefox火狐书签windows和ubuntu无法同步问题

    装了ubuntu后发现firefox的书签没法同步 最终发现问题的原因 firefox有个全球服务和本地服务 ubuntu下的firefox默认是全球服务的 而windows下的firefox默认是本地服务的 这样相当于两个系统下默认的存储
  • 【生信】初探基因定位和全基因组关联分析

    初探QTL和GWAS 文章目录 初探QTL和GWAS 实验目的 实验内容 实验题目 第一题 玉米MAGIC群体的QTL分析 第二题 TASSEL自带数据集的关联分析 实验过程 玉米MAGIC群体的QTL分析 包含的数据 绘制LOD曲线 株高
  • PyTorch训练深度卷积生成对抗网络DCGAN

    文章目录 DCGAN介绍 代码 结果 参考 DCGAN介绍 将CNN和GAN结合起来 把监督学习和无监督学习结合起来 具体解释可以参见 深度卷积对抗生成网络 DCGAN DCGAN的生成器结构 图片来源 https arxiv org ab
  • PCA(主成分分析方法)

    目录 1 降维问题 2 向量与基变换 2 1 内积与投影 2 2 基 2 3 基变换的矩阵 3 协方差矩阵及优化目标 3 1 方差 3 2 协方差 3 3 协方差矩阵 3 4 协方差矩阵对角化 4 算法与实例 4 1 PCA算法 4 2 实