PCA算法思路:

首先利用样本集及特征构建一个样本矩阵,然后利用样本矩阵计算得到一个协方差矩阵,再计算协方差矩阵的特征值和特征向量,保留特征值前k个大的对应的特征向量作为新的维度方向,再将原始样本数据转换到新的空间维度。(他非常巧妙地利用协方差矩阵来计算出样本集在不同方向上的分散程度,利用方差最大的方向作为样本集的主方向)

上述提到的k(k<n,n是n维特征,)这个k维是全新的正交特征,这k维特征称为主成分,是重新构造出来的k维特征,而不是简单的从n维特征中去除其余n-k维特征。

我原来对PCA进行了解不深一直有一个误区是选择k维特征后边的都不要了,其实不是的,是选择k个特征向量,把所有的样本个数都转换都这个k维空间下,样本个数没有变化,只是特征维度变成了k。

为什么要用到PCA:

PCA算法是专门用来对高维数据进行降维,因此算法的核心就是在于找出数据变化的主方向和次方向。比如下图二维平面内有一些点,那么向量u1的方向可以认为是该数据的主方向,而u2是次方向。

去均值:

为什么要去均值:

这主要是去除均值对变化的影响,减去均值后数据的信息量没有变化,即数据的区分度(方差)是不变的。如果不去均值,第一主成分,可能会或多或少的与均值有关。

归一化:

将不同特征的数据范围归一化到同一范围中,一般做法是将每个值除以当前维的最大值。

(将每一维特征的均值中心化,方差归一化)

对于组成的协方差矩阵求取的特征值与特征向量:

特征值越大的特征向量,样本集在该方向上的变化越大。(因为协方差矩阵计算出来的特征值为其特征向量上的样本集的方差,当方差越大说明数据集在该特征向量方向上越分散,变化越大,所以该方向就可以用来作为数据集的主方向。)对于由特征向量组成的矩阵我们称为特征矩阵U,特征矩阵是一个正交矩阵,即满足(特征向量之间相互正交,说明各特征之间相关性最小,基本接近0。独立===>不相关<===>协方差为0

计算新维度下的每个样本对应的新样本数据值:

已经得到了数据变化的主次方向,现在需要计算样本在每个特征向量上的长度,对于原始样本x,其在特征向量u1方向上的长度为:

PCA具有缩放不变性:

所有的特征分量被放大或缩小相同的倍数,PCA输出的特征向量不会发生变化。

例子分析:

比如下边有3个维度为4的样本数据(X,Y,Z,A)首先假设XYZA之间互不相关。

样本编号 X Y Z A
1 1 1 12 30
2 90 2 13 30
3 847 3 14 30

由上边几个简单的样本我们就可以看出XYZ作为主成分,X可以作为该样本的第一主成分,因为分布比较广。

但是如果每一个维度我们都不能明显的看出他们分布的差异性,意思就是在同一个维度上每个样本之间的差值都非常小,那么我们就不能一眼看出该样本的主成分。

通过如下一些二维数据我们走一遍PCA的过程:

原始样本编号 x y
1 2.5 2.4
2 0.5 0.7
3 2.2 2.9
4 1.9 2.2
5 3.1 3.0
6 2.3 2.7
7 2 1.6
8 1 1.1
9 1.5 1.6
10 1.1 0.9

第一步:求x、y的均值。=1.81,,得到去均值之后的样本如下:

去均值后的样本个数 x y
1 0.69 0.49
2 -1.31 -1.21
3 0.39 0.99
4 0.09 0.29
5 1.29 1.09
6 0.49 0.79
7 0.19 -0.31
8 -0.81 -0.81
9 -0.31 -0.31
10 -0.71 -1.01

第二步:求x,y的协方差矩阵:

求的协方差矩阵,对角线上分别是方差,非对角线上是协方差,协方差是衡量两个变量同时变化的变化程度(协方差大于0表示,x和y若一个增另外一个也增;小于0表示一个增,一个相应的减。如果x和y是统计独立的,那么两者之间的协方差就是0;相反协方差是0并不能说明两者是独立的。而且两者协方差的绝对值越大,那么两者对彼此的影响就越大,反之越小。协方差是没有单位的量。)

第三步:求协方差的特征值和特征向量,得到

第四步:将特征值按照从大到小的顺序排序,选择其中最大的k个,然后将其对应的k个特征向量分别作为列向量组成特征向量矩阵。

这里特征值只有两个,我们选择其中最大的那个,这里是1.28402771,对应的特征向量是(-0.677873399, -0.735178656)T。

第五步:将样本点投影到选取的特征向量上。假设样例数为m(此处是10),特征数为n(此处是2),减去均值后的样本矩阵为DataAdjust(m*n)(此处是10x2),协方差矩阵是n*n(此处是2x2),选取的k个特征向量组成的矩阵为EigenVectors(n*k)(此处是2x1)。那么投影后的数据FinalData为

FinalData(10*1) = DataAdjust(10*2矩阵) x 特征向量(-0.677873399, -0.735178656)T(此步的矩阵乘法就是将原始样本点分别往特征向量对应的轴上做投影)

最后将每一个去均值后的数据点与选择的k个特征向量做乘后的结果为:(10x2)与(2x1)矩阵得到(10x1)

Transformed Data(一个维度)
-0.828
1.778
-0.992
-0.274
-1.676
-0.913
-0.991
1.144
0.438
1.224

这样,就将原始样例的n维特征变成了k维,这k维就是原始特征在k维上的投影。

最后例子参照博客:https://blog.csdn.net/zhongkelee/article/details/44064401

PCA(1):基础知识介绍相关推荐

  1. NLP汉语自然语言处理入门基础知识介绍

    NLP汉语自然语言处理入门基础知识介绍 自然语言处理定义: 自然语言处理是一门计算机科学.人工智能以及语言学的交叉学科.虽然语言只是人工智能的一部分(人工智能还包括计算机视觉等),但它是非常独特的一部 ...

  2. 【 MATLAB 】逆离散余弦变换(idct)的基础知识介绍

    基础知识介绍 逆离散余弦变换从离散余弦变换 (DCT) 系数中重建序列.idct 函数是 dct 函数的逆. The DCT has four standard variants. For a tra ...

  3. 视频编解码的理论和实践1:基础知识介绍

    近几年,视频编解码技术在理论及应用方面都取得了重大的进展,越来越多的人想要了解编解码技术.因此,网易云信研发工程师为大家进行了归纳梳理,从理论及实践两个方面简单介绍视频编解码技术. 相关阅读推荐 &l ...

  4. OpenGL开发之旅基础知识介绍

    最近由于手机项目中需要用到OpenGL ES的知识,所以这段时间正在研究OpenGL的相关知识.因为OpenGL ES是OpenGL的剪裁版本,所以我直接从OpenGL入手,然后再去看OpenGL E ...

  5. UICC 之 USIM 详解全系列——UICC基础知识介绍

    本人就职于国际知名终端厂商,负责modem芯片研发. 在5G早期负责终端数据业务层.核心网相关的开发工作,目前牵头6G算力网络技术标准研究. UICC 之 USIM 详解全系列--UICC(TS102 ...

  6. view基础知识介绍(一)

    view基础知识介绍 view是一种界面层的控件的一种抽象 分为view和viewGroup viewGroup继承自view 也就是说view本身可以是单个控件 也可以是一个控件组 例如:一个vie ...

  7. 计算机动画的基础知识是什么,计算机动画历史基础知识介绍课件

    计算机动画历史基础知识介绍课件 早期无神经系统定位症状和体征.抽搐发作和其他不自主运动可见于疾病晚期,并有锥体系和锥体外系症状和体征,包括震颤.肌强直和肢体屈曲等 早期无神经系统定位症状和体征.抽搐发 ...

  8. 计算机应用基础知识盘,计算机应用基础知识介绍.ppt

    计算机应用基础知识介绍.ppt 计 算 机 应 用 基 础;第三章 Word2003的操作与应用;启动Word窗口的常用方法有:?从[开始]菜单启动:单击[开始]|[所有程序]| Microsoft ...

  9. JMeter-01-性能测试基础知识介绍

    JMeter-01-性能测试基础知识介绍 开篇词 性能测试常见分类 Web服务的主要指标 前端页面的主要指标 数据库的主要指标 开篇词 参加工作这些年来,性能测试做过不少,主要用的LoadRunner ...

  10. 蓝牙模块基础知识介绍

    蓝牙模块基础知识介绍 随着近年来蓝牙技术的不断发展,在功耗不断降低的情形下,蓝牙的传输速率也不断地得到提高,使蓝牙的应用范围更加广泛.但若想设计一套完善的蓝牙系统,就必须充分掌握蓝牙的相关技术知识,如 ...

最新文章

  1. C#实现网页截图功能
  2. vim 同一行内单字符搜索跳转(笔记)
  3. webApp之meta标签
  4. python怎么安装pip-安装 Python 模块
  5. python学习之散学
  6. 【Maven学习】Nexus OSS私服仓库的备份与迁移
  7. Boost:使用类array <>的简单示例
  8. 关于windows10用c++部署libtorch过程中遇到的一些问题
  9. boost原理与sklearn源码_机器学习sklearn系列之决策树
  10. JAVA IOC及代理模式
  11. 【经验心得】固定布局做到各手机屏幕适配简单粗暴的方法
  12. Spring Boot实战解决高并发数据入库: Redis 缓存+MySQL 批量入库
  13. Redis的哨兵(sentinel)模式
  14. Java学习日志(19-3-IO流-字节流操作)
  15. 使用Docker 安装jdk8
  16. 这三个究极骚气的炫酷底部导航栏,只有经常逛GitHub划水的人才知道!
  17. GoCN社区Go读书会第二期:《Go语言精进之路》直播文字稿
  18. 解除当前设置不允许下载该文件
  19. linux startx无效_LINUX startx命令-用来启动X Window
  20. java 将json写入txt_关于json:在java中将String写入文本文件

热门文章

  1. 高并发下接口幂等性技术方案
  2. DCN-S4600 telent、http远程登录配置
  3. java中hashcode_浅谈Java中的Hash值
  4. ValueError: urls must start with a leading slash
  5. Caused by: org.gradle.api.InvalidUserDataException: NDK not configured
  6. 微信小程序自定义组件Component的简单使用
  7. Android studio怎么找到当前文件在电脑路径位置
  8. Android 项目版本的修改
  9. 基于uFUN开发板的心率计(一)DMA方式获取传感器数据
  10. 递归函数 集合 列表 元组