PCA

PCA 就是找出数据最主要的方面,用数据里最主要的方面来代替原始数据。

PCA 是最重要的降维方法之一,在数据压缩、消除冗余和数据噪音消除等领域都有广泛的应用。

1. PCA最大可分性的思想

最大可分性: 样本点在超平面上的投影尽可能的分开

2. 基变换(线性变换)

欲获得原始数据新的表示空间,最简单方法是对原始数据进行基变换(线性变换)。

3. 方差

​ 如何选择一个方向或者基才是最优的?基于PCA最大可分思想,我们要找的方向是降维后损失最小,可以理解为投影后的数据尽可能分得开,而分散程度可以用数学上的方差来表示,因为方差越大数据也就越分散

4. 协方差

​ 在高维变换中,我们希望基变换后选择的各个方向(或者基)是不相关的,这样才能表示更多的信息。数学上使用协方差表示相关性:

\[Cov(a,b) = \frac{1}{m} \sum_{i=1}^{m}a_ib_i
\]

如果 \(Cov(a,b)=0\) ,则表示两个字段完全独立,这也是我们的优化目标

5. 协方差矩阵

​ 我们想达到的目标(\(Cov(a,b)=0\))字段内方差字段间协方差 有着密切的关系。假设只有 \(a, b\) 两个字段,按行组成 \(X\) ,求取协方差矩阵:

可见,协方差矩阵是一个对称的矩阵,对角线是各个维度的方差(字段内方差),而其它元素是字段间协方差,两者被统一到了一个矩阵之中。

6. 协方差矩阵对角化

​ 我们的目标是使 \(Cov(a,b)=0\) ,由协方差矩阵可知我们的优化目标 \(C=\frac{1}{m}XX^T\) 等价于协方差矩阵对角化(除对角线以外的其它元素都为0,并且对角线将元素按照大小从上到下排列)。

​ 推导:

7. PCA算法流程

输入: \(n\) 维样本集 \(X = (x_1, x_2, ... ,X_m)\),要降维到的维数 \(n^{'}\)

输出: 降维后的样本集 \(Y\)

算法:

​ 1)对所有样本进行中心化 \(x_i = x_i -\frac{1}{m}\sum_{j=1}^mx_j\)

​ 2)计算样本的协方差矩阵 \(C=\frac{1}{m}XX^T\)

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

​ 4)将特征向量按对应特征值大小从上到下排列成矩阵,取前 \(K\) 行组成矩阵 \(P\)

​ 5)\(Y=PX\) 即为原始样本降维到 \(K\) 维后的数据矩阵

代码:

"""
这里假设原始数据集为矩阵 dataMat,其中每一行代表一个样本,每一列代表同一个特征(与上面的介绍稍有不同,上 面是每一列代表一个样本,每一行代表同一个特征)。
""" import numpy as np ################################
# (1)零均值化
################################
def zeroMean(dataMat):
meanVal=np.mean(dataMat,axis=0) #按列求均值(axis=0),即求各个特征的均值
newData=dataMat-meanVal
return newData,meanVal # newData是零均值化后的数据,meanVal是每个特征的均值 ################################
# (2)求协方差矩阵
# 若rowvar=0,说明传入的数据一行代表一个样本;
# 若非0,说明传入的数据一列代表一个样本。
################################
newData,meanVal=zeroMean(dataMat)
covMat=np.cov(newData,rowvar=0) ################################
# (3)求特征值和特征矩阵
# eigVals存放特征值,行向量
# eigVects存放特征向量,每一列带别一个特征向量
# 特征值和特征向量是一一对应的
################################
eigVals,eigVects=np.linalg.eig(np.mat(covMat)) ################################
# (4)保留比较大的前n个特征向量
# 第三步得到了特征值向量eigVals,假设里面有m个特征值,我们可以对其排序,排在前面的n个特征值所对应的特征 # 向量就是我们要保留的,它们组成了新的特征空间的一组基n_eigVect
################################
eigValIndice=np.argsort(eigVals) #对特征值从小到大排序
n_eigValIndice=eigValIndice[-1:-(n+1):-1] #最大的n个特征值的下标,首先argsort对特征值是从小到大排序的,那么最大的n个特征值就排在后面,所以eigValIndice[-1:-(n+1):-1]就取出这个n个特征值对应的下标(python里面,list[a:b:c]代表从下标a开始到b,步长为c)
n_eigVect=eigVects[:,n_eigValIndice] #最大的n个特征值对应的特征向量 ################################
# (5)获取降维后的数据
# 将零均值化后的数据乘以n_eigVect就可以得到降维后的数据
################################
lowDDataMat=newData*n_eigVect #低维特征空间的数据
reconMat=(lowDDataMat*n_eigVect.T)+meanVal #重构数据

8. PCA算法总结

优点:

​ 1) 仅仅依靠方差衡量信息量,不受数据集以外的因素影响

​ 2)各主成分之间相互正交,可消除原始数据成分间的相互影响的因素

​ 3)计算方法简单,主要运用特征值分解

缺点:

​ 1)主成分各个特征维度的含义具有一定的模糊性,不如原始样本特征的解释性强

​ 2)方差小的主成分也有可能含有对样本差异的重要信息,由于降维丢弃可能会对后续数据处理有影响

【机器学习】PCA的更多相关文章

  1. [机器学习]-PCA数据降维:从代码到原理的深入解析

    &*&:2017/6/16update,最近几天发现阅读这篇文章的朋友比较多,自己阅读发现,部分内容出现了问题,进行了更新. 一.什么是PCA:摘用一下百度百科的解释 PCA(Prin ...

  2. 机器学习--PCA降维和Lasso算法

    1.PCA降维 降维有什么作用呢?数据在低维下更容易处理.更容易使用:相关特征,特别是重要特征更能在数据中明确的显示出来:如果只有两维或者三维的话,更便于可视化展示:去除数据噪声降低算法开销 常见的降 ...

  3. 机器学习--PCA算法代码实现(基于Sklearn的PCA代码实现)

    一.基于Sklearn的PCA代码实现 import numpy as np import matplotlib.pyplot as plt from sklearn import datasets ...

  4. [机器学习 ]PCA降维--两种实现 : SVD或EVD. 强力总结. 在鸢尾花数据集(iris)实做

    PCA降维--两种实现 : SVD或EVD. 强力总结. 在鸢尾花数据集(iris)实做 今天自己实现PCA,从网上看文章的时候,发现有的文章没有搞清楚把SVD(奇异值分解)实现和EVD(特征值分解) ...

  5. 机器学习(4)——PCA与梯度上升法

    主成分分析(Principal Component Analysis) 一个非监督的机器学习算法 主要用于数据的降维 通过降维,可以发现更便于人类理解的特征 其他应用:可视化.去噪 通过映射,我们可以 ...

  6. 131.008 Unsupervised Learning - Principle component Analysis |PCA | 非监督学习 - 主成分分析

    @(131 - Machine Learning | 机器学习) PCA是一种特征选择方法,可将一组相关变量转变成一组基础正交变量 25 PCA的回顾和定义 Demo: when to use PCA ...

  7. PCA主成分分析 ICA独立成分分析 LDA线性判别分析 SVD性质

    机器学习(8) -- 降维 核心思想:将数据沿方差最大方向投影,数据更易于区分 简而言之:PCA算法其表现形式是降维,同时也是一种特征融合算法. 对于正交属性空间(对2维空间即为直角坐标系)中的样本点 ...

  8. SIGAI深度学习第四集 深度学习简介

    讲授机器学习面临的挑战.人工特征的局限性.为什么选择神经网络.深度学习的诞生和发展.典型的网络结构.深度学习在机器视觉.语音识别.自然语言处理.推荐系统中的应用 大纲: 机器学习面临的挑战 特征工程的 ...

  9. 机器学习笔记----四大降维方法之PCA(内带python及matlab实现)

    大家看了之后,可以点一波关注或者推荐一下,以后我也会尽心尽力地写出好的文章和大家分享. 本文先导:在我们平时看NBA的时候,可能我们只关心球员是否能把球打进,而不太关心这个球的颜色,品牌,只要有3D效 ...

  10. 《机器学习实战》学习笔记——第13章 PCA

    1. 降维技术 1.1 降维的必要性 1. 多重共线性--预测变量之间相互关联.多重共线性会导致解空间的不稳定,从而可能导致结果的不连贯.2. 高维空间本身具有稀疏性.一维正态分布有68%的值落于正负 ...

随机推荐

  1. 自定义Visual Studio调试器中的对象显示方式

    你有没有盯着调试器窗口中的对象,并希望你可以通过其他类型的东西来查看这些对象?我当然有!扩展项目以确定每个人的身份可能会非常快速.理想情况下,通过特定的属性值快速定位它们会很棒.对我们来说幸运的是,V ...

  2. crm-3权限

    1.权限基本实现 rbac: rbac基于角色的权限控制 ,权限本质就是url 权限表: url列表 角色表: 一个角色固定访问一些url的地址 用户表: 用户可以绑定角色 ,用户拥有了角色的权限 生 ...

  3. IOS中的深拷贝和浅拷贝

    标签: 什么是深拷贝?什么是浅拷贝? 为什么经常看到字符串属性要这样定义,那个copy是神马意思? @property(nonatomic,copy)NSString* name; 为什么下面的写法是 ...

  4. [b0002] Hadoop HDFS cmd常用命令练手

    目的: 学会HDFS CLI 常用操作 环境: Hadoop 2.6.4 伪分布式版 环境搭建参考本博客前篇文章: 伪分布式 hadoop 2.6.4 帮助: hadoop@ssmaster:~$ h ...

  5. MySQL获取指定字段不重复的记录

    关键词:DISTINCT 1.比如数据库一组数据查询如下,返回店铺下所有的区域id 2.SQL统计返回指定字段 district 不重复的 记录id,SQL如下 SELECT DISTINCT(dis ...

  6. Python—实现sftp客户端(连接远程服务器)

    使用SFTP上传与下载文件方式一: import paramiko transport = paramiko.Transport(("106.15.88.182", 22)) # ...

  7. unity_animator_stop_replay(重新播放)

    对于一个Animation重复播放,但在隐藏后,再次显示播放会出现有些属性未复原 问题描述 特效同事给的Animation中更改了物体的很多属性,如Active,Alpha, Scale,Positi ...

  8. CentOS离线安装Rust

    条件所限,无法在线连接外网,或是下载慢,容易中断时,可以采用. 一,下载离线安装包 https://forge.rust-lang.org/other-installation-methods.htm ...

  9. Appium左右、上下滑动(Java)

    网上很多文章都说用swipe来左右滑动,你把代码一贴,结果报错,看半天,原来是java-client中swipe早就被废除了!!!下面介绍一种Java写法来左右上下滑动: 首先,创建一个Swipe类 ...

  10. ioctl操作

    在本书中有两个地方都对这个函数进行了介绍,其实还有很多地方需要这个函数.ioclt函数传统上一直作为纳西而不适合归入其他精细定义类别的特性的系统接口.网络程序(特别是服务器程序)经常在程序启动执行后使 ...