机器学习实战之PCA

1.  向量及其基变换

1.1 向量内积

(1)两个维数相同的向量的内积定义如下: 内积运算将两个向量映射为一个实数.

(2) 内积的几何意义

假设A\B是两个n维向量, n维向量可以等价表示为n维空间中的一条从原点发射的有向线段, 为方便理解, 在这里假设A和B都是二维向量.A=(x1,y1) , B=(x2,y2),在二维平面上A/B可以用两条发自原点的有向线段表示,如下图:

在上图中,从A点向B所在的直线引一条垂线.垂线与B的交点叫A在B上的投影.A与B的夹角是a,则投影的矢量长度为

* 矢量长度可能为负,其绝对值是线段长度. 符号取决于其方向与标准方向相同或相反. 标量长度总是大于等于0,值就是线段的长度.

内积另外一种表示形式:

A和B的内积等于A到B的投影长度乘以B的模.设向量B的模为1的话,则A和B的内积值等于A向B所在直线投影的矢量长度.

1.2 基

(1) 一个二维向量对应二维直角坐标系中从原点出发的一个有向线段, 代数方面, 常使用线段终点的点坐标表示向量, 例如(3,2), 但是一个(3,2)并不能精确的表示一个向量,. 分析可得: "3"实际表示的是向量在x轴上的投影值是3,在y轴的投影值是2, 也就是隐式的引入了一个定义: 以x轴和y轴正方向长度为1的向量为标准. 更具体地,向量(x,y)实际可以表示线性组合:.
此处(1,0)/(0,1)为二维空间中的一组基.

结论: 为了准确描述向量,首先确定一组基,然后给出在基所在的各个直线上的投影值即可.

(2) 任何两个线性无关的二维向量都可以成为一组基.一般假设基的模为1, 例如一组基为,则点(3,2)在新基上的坐标为,形象的从下图中可以观察:

(3) 基变换的矩阵表示

第二节中的例子转为矩阵表示为:

矩阵的两行分别为两个基.乘以原向量恰好是新坐标; 若是有多个二维向量要转换到新基下的坐标,即将这些二维向量按列排成一个矩阵,例如点(1,1)/(2,2)/(3,3)

*结论: 如果有m个n维向量,想将其变换为r个n维空间表示的新空间中,首先将r个基按行组成矩阵A,然后将向量按列组成矩阵B, 那么两矩阵的乘积AB就是变换结果,其中AB的第m列为B中第m列的变换结果. r决定了变换后数据的维数.即可以将一n维数据变换到更低维的空间中去,变换后的维数取决于基的数量.

两个矩阵相乘的意义就是将右边矩阵中的每一列列向量转换到左边每一行行向量为基表示的空间中去.

2. 协方差矩阵

2.1 基础准备

前面讨论了不同的基可以对同一组数据给出不同的表示,如果基的数量少于向量自身的维数, 则可以达到降维的目标. 如何选择k个n维向量(k个基)使得最大程度上保留原有的信息?

下面举例说明:

数据的5条记录组成, 将它们表示成矩阵形式:

其中每一列为一条数据记录,一行对应一个字段,为了处理方便,首先将每个字段内所有值减去字段均值,其结果就是将每个字段的均值都变为0,上述矩阵变换后的结果为:

其在坐标系中对应的位置为:

问题: 现在要用一维来表示这些数据,又希望尽可能的保留原始的信息,该怎么选择基?

答案: 希望投影后的投影值尽可能分散.

上述图所将数据点向第一象限和第三象限的斜线投影,则上述5个点在投影后还是可以区分的.

2.2.  方差

希望投影后得到的数据值尽可能分散, 分散程度可以用数学上的方差来表述.

一个字段的方差可以看作是每个元素与字段均值差的平方和的均值,即

由于上面已将数据的每个字段平均化了,因此方差可以直接用每个元素的平方和除以元素个数,即

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

2.3 协方差

对于将二维变为一维的问题,找到使得方差最大的方向即可; 但是对于更高维,需要考虑更多,例如三维降到二维, 与之前相同,首先希望找到一个方向使得投影后方差最大,这样就完成了地一个方向的选择,继续我们还需要选择第二个投影方向.

若继续选择方差最大的方向,则这个方向和第一个方向应该是几乎重合的, 显然这样是不行的,. 从直观上看,为了让这两个字段尽可能的表示更多的原始信息,希望它们之间是线性不相关的,因为相关性意味这两个字段不是完全独立,存在重复表示的信息.

数学上用两个字段的协方差来表示其相关性,由于已经让每个字段的均值为0,则其协方差计算公式如下:

由式子可以得出, 在字段均值为0的情况下, 两个字段的协方差简洁的表示为其内积除以元素数.

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

***降维的优化目标: 将一组n维向量降为k维,其目标是选择k个单位(模为1)正交基,使得原始数据变换到这组基上后, 个字段两两间协方差为0,且字段的方差尽可能大(在正交的约束下,取最大的k个方差)

2.4 协方差矩阵

最终目的与字段内方差和字段间的协方差密切相关,现在想做的就是使得两者统一.

假设我们有a和b两个字段,m个向量,将其按行组成矩阵X:

然后用X乘以X的转置,并除以向量个数:

可以发现,这个矩阵对角线上的两个元素分别是来那个个字段的方差,而其它元素是a和b的协方差.即方差和协方差被统一到了一个矩阵中.

***推广得到一般结论: 若有m个n维数据,将其按列拍成n*m的矩阵X,,则C是一个对称矩阵,其对角线分别是各个字段对应的方差,第i行j列与第j行i列的元素一样,表示i和j两个字段的协方差.

2.5 协方差矩阵对角化

为了达到使得字段内方差尽可能大,字段间的协方差为0的目标, 等于将协方差矩阵对角化:即除对角线外的其它元素均为0,并且对角线上的元素按从大到小的顺序排列,这样就达到了优化目的.

令原始数据矩阵X对应的协方差矩阵为C,P是一组基按行组成的矩阵,Y=PX,则Y为X对P做基变换后的数据.设Y的协方差矩阵为D,推导D与C的关系:

显然, 变换后的矩阵Y的协方差矩阵D应该除对角线外的元素为0.我们寻找的P是能让原始协方差矩阵对角化的P.

即优化目标变为:寻找一个矩阵P, 满足是一个对角矩阵,且对角元素按从大到小依次排列,那么P的前k行就是寻找的基,用P的前k行组成的矩阵乘以C就使得X从n维降到了k维并满足上述优化条件.

2.6 协方差对角化

协方差矩阵C是一个对称矩阵,实对称矩阵有很好的性质:

3. 降维方法

3.1 降维目的:

  • 使得数据集更易使用
  • 降低很多算法的计算开销
  • 去除噪声
  • 使得结果易懂

3.2 三种降维方法

(1) 主成分分析法 (principal component analysis, PCA)

在PCA中,数据从原来的坐标系转换到了新的坐标系,新坐标系的选择由数据本身决定. 第一个新坐标轴选择的是原始数据中方差最大的方向,第二个新坐标轴的选择是和第一个新坐标轴正交且具有最大方差的方向.过程一直重复,重复次数为原始数据中特征的数目.

(2) 因子分析(factor analysis)

在因子分析中,假设在观察数据的生成中有一些观察不到的隐变量.假设观察数据是这些隐变量和某些噪声的线性组合.

(3) 独立成分分析(independent component analysis,ICA)

在ICA中, 假设数据是从N个数据源生成的.即数据为多个数据源的混合观察结果,这些数据源之间在统计上是相互独立的,在PCA中只假设数据是不相关的.同因子分析一样,若数据源的数目小于观察数据的数目,就可以实现降维.

4. PCA(principal component analysis,主成分分析)

4.1 性能评价

优点: 降低数据的复杂性,识别到最重要的几个特征

缺点:不一定需要,且可能损失有用信息

4.2 PCA实现

将数据转换成前N个主成分的伪代码如下:

去除平均值(将数据的每一维特征减去其平均值)

计算由数据构成矩阵的协方差矩阵

计算协方差矩阵的特征值和特征向量

将特征值从大到小排序

保留最上面的N个特征向量

将数据转换到上述N个特征向量构建的新空间中

其实现代码如下:

<span style="font-size:18px;"><span style="font-size:18px;">def pca(dataMat,topNfeat = 999999):
	#每一行对应一个数据点,求每一列的平均值(即每个特征的均值)
	meanVal = mean(dataMat,axis = 0)
	#数据均值化
	meanData = dataMat - meanVal

	#求数据的协方差矩阵
	covMat = cov(meanData,rowvar = 0)
	#协方差矩阵的特征向量和特征值
	eigVal,eigVec = linalg.eig(mat(covMat))

	eigValIndex = argsort(eigVal)
	eigValIndex = eigValIndex[:-(topNfeat+1):-1]
	redEigVec = eigVec[:,eigValIndex]
	#得到降维后的数据
	lowDataMat = meanData * redEigVec

	#原始数据被重构后返回用于调试
	reconMat = (lowDataMat * redEigVec.T) + meanVal

	return lowDataMat,reconMat</span></span>

4.3 重构

还原原始数据的过程就是获得样本点映射以后在原空间中的估计位置的过程.

检验:在命令行输入以下代码:将降维后的数据和原始数据一起画出来.得到图片如下:

<span style="font-size:18px;">>>> lowdata,recon = pca.pca(datas,1)
[[ 1.]]
>>> import matplotlib.pyplot as plt
>>> fig = plt.figure()
>>> ax = fig.add_subplot(111)
>>> ax.scatter(datas[:,0].flatten().A[0],datas[:,1].flatten().A[0],marker='^',s=90)
<matplotlib.collections.PathCollection object at 0x7f8b84d70590>
>>> ax.scatter(recon[:,0].flatten().A[0],recon[:,1].flatten().A[0],marker='o',s=50,c='red')
<matplotlib.collections.PathCollection object at 0x7f8b84d40290>
>>> plt.show()
</span>

即红色的线表示原始数据沿着这条线投影.即第一新坐标轴.

参考:

(1)PCA数学原理:http://www.360doc.com/content/13/1124/02/9482_331688889.shtml

时间: 2024-12-28 01:49:35

机器学习实战之PCA的相关文章

13机器学习实战之PCA

降维技术 对数据进行降维有如下一系列的原因: 使得数据集更容易使用 降低很多算法的计算开销 去除噪音 使得结果易懂 在以下3种降维技术中, PCA的应用目前最为广泛,因此本章主要关注PCA. 主成分分析(Principal Component Analysis, PCA) 通俗理解:就是找出一个最主要的特征,然后进行分析. 在PCA中,数据集从原始坐标系转换为新的坐标系.新的坐标系选择由数据本身决定.第一个新轴选择数据中方差最大的方向.第二轴与第一轴正交,且具有最大方差的方向.对于原始数据中的所

机器学习实战 10-PCA

1 先备知识 1.1 一些统计学认识 方差: 用来描述样本偏离中心程度的量 协方差:用来描述两变量 X,Y 相互关系的量,协方差越大,对彼此影响越大,协方差等于0,两者独立 协方差矩阵:  如果一组样本 y1,.......ym ,每个样本是 n 维行向量,则这组样本的协方差矩阵为: 注意:矩阵中的 x1,......xn ,指的是上面m个样本的每一维值,则 xn 为 m 维列向量. 理解:由 m 个样本确定的 n 维空间,协方差矩阵的每一列表示的是所有维对某一维分别影响值(即相关性),描述这个

【机器学习实战】Machine Learning in Action 代码 视频 项目案例

MachineLearning 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远 Machine Learning in Action (机器学习实战) | ApacheCN(apache中文网) 视频每周更新:如果你觉得有价值,请帮忙点 Star[后续组织学习活动:sklearn + tensorflow] ApacheCN - 学习机器学习群[629470233] 第一部分 分类 1.) 机器学习基础 2.) k-近邻算法 3.) 决策树 4.) 基于概率论的分类方法:朴素

机器学习实战

机器学习实战ByMatlab(1):KNN算法 KNN 算法其实简单的说就是"物以类聚",也就是将新的没有被分类的点分类为周围的点中大多数属于的类.它采用测量不同特征值之间的距离方法进行分类,思想很简单:如果一个样本的特征空间中最为临近(欧式距离进行判断)的K个点大都属于某一个类,那么该样本就属于这个类.这就是物以类聚的思想. 当然,实际中,不同的K取值会影响到分类效果,并且在K个临近点的选择中,都不加意外的认为这K个点都是已经分类好的了,否则该算法也就失去了物以类聚的意义了. KNN

机器学习实战 [Machine learning in action]

内容简介 机器学习是人工智能研究领域中一个极其重要的研究方向,在现今的大数据时代背景下,捕获数据并从中萃取有价值的信息或模式,成为各行业求生存.谋发展的决定性手段,这使得这一过去为分析师和数学家所专属的研究领域越来越为人们所瞩目. <机器学习实战>主要介绍机器学习基础,以及如何利用算法进行分类,并逐步介绍了多种经典的监督学习算法,如k近邻算法.朴素贝叶斯算法.Logistic回归算法.支持向量机.AdaBoost集成方法.基于树的回归算法和分类回归树(CART)算法等.第三部分则重点介绍无监督

《机器学习实战》之K-均值聚类算法的python实现

<机器学习实战>之K-均值聚类算法的python实现 最近的项目是关于"基于数据挖掘的电路故障分析",项目基本上都是师兄们在做,我只是在研究关于项目中用到的如下几种算法:二分均值聚类.最近邻分类.基于规则的分类器以及支持向量机.基于项目的保密性(其实也没有什么保密的,但是怕以后老板看到我写的这篇博文,所以,你懂的),这里就不介绍"基于数据挖掘的电路故障分析"的思路了. 废话不多说了,开始正题哈. 基本K-均值聚类算法 基本K均值算法的基本思路为:首先选择

机器学习实战笔记(Python实现)-03-朴素贝叶斯

--------------------------------------------------------------------------------------- 本系列文章为<机器学习实战>学习笔记,内容整理自书本,网络以及自己的理解,如有错误欢迎指正. 源码在Python3.5上测试均通过,代码及数据 --> https://github.com/Wellat/MLaction -----------------------------------------------

机器学习实战------利用logistics回归预测病马死亡率

大家好久不见,实战部分一直托更,很不好意思.本文实验数据与代码来自机器学习实战这本书,倾删. 一:前期代码准备 1.1数据预处理 还是一样,设置两个数组,前两个作为特征值,后一个作为标签.当然这是简单的处理,实际开发中特征值都是让我们自己选的,所以有时候对业务逻辑的理解还是很重要的. 1.2 sigmoid函数设置 1.3固定步长梯度上升算法 这段代码见一面1.4节. Alpha表示步长,maxcycles表示最大的迭代次数,其中weights=ones((n,1))是初始化一个全部为一的n*1

《机器学习实战》之二分K-均值聚类算法的python实现

<机器学习实战>之二分K-均值聚类算法的python实现 上面博文介绍了K-均值聚类算法及其用python实现,上篇博文中的两张截图,我们可以看到,由于K-均值聚类算法中由于初始质心的选取,会造成聚类的局部最优,并不是全局最优,因此,会造成聚类的效果并不理想,为克服K-均值算法收敛于局部最小值的问题,就有了二分K-均值算法. 二分K-均值聚类算法 二分K均值算法是基本K均值算法的直接扩充,其基本思想是:为了得到K个簇,首先将所有点的集合分裂成两个簇,然后从这些簇中选取一个继续分裂,迭代直到产生