特征向量&特征值及其应用
大学学习线性代数的时候,特征值(eigenvalue)和特征向量(eigenvector)一直不甚理解,尽管课本上说特征值和特征向量在工程技术领域有着广泛的应用,但是除了知道怎么求解特征值和特征向量之外,对其包含的现实意义知之甚少。
毕业五六年后,学习机器学习,用到PCA在进行主成分分析过程中,需要求解变量的协方差矩阵的特征值和特征向量,并根据特征值的大小确定主成分,似乎知道了特征值和特征向量的一点点现实意义。
最近看机器学习的一些方法,如特征降维方法如SVD和PCA,线性判别法(Linear Discriminant Analysis,LDA)等方法的时候都涉及到特征值和特征向量,发现如果不深入理解特征值和特征向量,对这些方法的学习只能浮于表面,难以透彻理解。
痛定思痛,决定由表及里好好的学习一下特征值和特征向量,本文的关于特征值和特征向量的理解和表述大量参考了网上资料,仅作为本人学习笔记,分享出来。
PCA的目的,其实就是为了找到一组样本数据中能代表最最主要方向(变量/维度)的这些基向量(特征向量),并保留前几个主要(特征值)的特征向量(主成分)。
PCA过程的本质,其实就是变量(维度)协方差矩阵对角化。 体现了方差和协方差、特征值与特征向量的内涵应用。
一、特征值和特征向量的概念和数学计算
先看一下教科书上的定义:设A是n阶方阵,如果存在常数及非零n向量x,使得,则称是矩阵A的特征值,x是A属于特征值的特征向量。给定n阶矩阵A,行列式
的结果是关于的一个多项式,成为矩阵A的特征多项式,该特征多项式构成的方程称为矩阵A的特征方程。
定理:n阶矩阵A的n个特征值就是其特征方程的n个根;而A的属于特征值的特征向量就是其次线性方程的非零解。
例: 求的特征根和特征向量
解: ,解一元二次方程可得,;
λ1 对应的特征向量为x满足,求得 ,其中(2,-1)T是的一个基础解系;
λ2 对应的特征向量为x满足,求得,其中(1,-1)T是的一个基础解系。
二、特征值和特征向量的几何意义
1、矩阵、向量、向量的矩阵变换
在进行特征值和特征向量的几何意义解释之前,我们先回顾一下向量、矩阵、向量矩阵变换的等相关知识。
向量有行向量和列向量,向量在几何上被解释成一系列与轴平行的位移,一般说来,任意向量v都能写成"扩展"形式:
以3维向量为例,定义p、q、r为指向+x,+y和+z方向的单位向量,则有v=xp+yq+zr。现在向量v就被表示成p、q、r的线性变换了。这里的基向量是笛卡尔积坐标轴,但事实上这个一个坐标系可以由任意的3个基向量定义,只要这3个基向量线性无关就行(不在同一平面上)。因此,用一个矩阵乘以向量,如Ax,表述如下:
如果把矩阵的行解释为坐标系的基向量,矩阵与向量相乘(或向量与矩阵相乘)相当于执行一次坐标转换,Ax=y可表述为x经矩阵A变换后变为y。因此,追溯矩阵的由来,与向量的关系,我们会觉得矩阵并不神秘,它只是用一种紧凑的方式来表达坐标转换所需的数学运算。
2、矩阵的特征值和特征向量
矩阵A的特征值和特征向量分别为和x,记为,该式子可理解为向量x在几何空间中经过矩阵A的变换后得到向量。由此可知,向量x经过矩阵A变换后,方向并无改变(反方向不算方向改变),只是伸缩了倍。
以矩阵为例,其特征值分别为,,对应的特征向量为,,那么()表示向量经过矩阵A变换后,得到,向量变换变为改变方向,知识将在原方向上扩充了2倍。特征值也是同样道理,经过矩阵A变换后特征向量在原方向上扩充了3倍。
因此,将特征向量看成基向量,矩阵就是这些基向量向对应的特征值伸展所需的数学运算。给定一个矩阵,就可以找出对应的基向量(特征向量),及透过向量变换(矩阵),这些基的伸展(特征值)。
实对称矩阵的不同特征值对应的特征向量必定正交。
同一特征值可以对应无数个特征向量(非重根),但是线性无关的只有一个。
同一特征值对应的任意个特征向量的线性组合仍然属于同一特征值的特征向量。
顾名思义,特征值和特征向量表达了一个线性变换的特征。在物理意义上,一个高维空间的线性变换可以想象是在对一个向量在各个主要方向(特征向量)上进行了不同程度(特征值)的变换,特征向量之间是线性无关的。
换句话说,对于任何一个n阶方矩阵,都可以找到使得经过n阶方阵变换的主要方向(特征向量)+各个方向的拉伸大小(特征值)。即求特征向量,就是把矩阵A所代表的空间进行正交分解,使得A的向量集合可以表示为每个向量a在各个特征向量上的投影长度。我们通常求特征值和特征向量即为求出这个矩阵能使哪些向量只发生拉伸,而方向不发生变化,观察其发生拉伸的程度。这样做的意义在于,看清一个矩阵在哪些方面能产生最大的分散度(scatter),减少重叠,意味着更多的信息被保留下来。
PCA的目的其实就是为了找到一个样本数据中能代表最最主要方向(变量/维度)的这些基向量(特征向量),并保留前几个主要(特征值)的特征向量(主成分)。
PCA过程的本质其实就是对角化 变量(维度)协方差矩阵。
三、特征值和特征向量的应用实例——主成分分析(Principle Component Analysis, PCA)
(1)方差、协方差、相关系数、协方差矩阵
- 方差:
方差是衡量单变量的离散程度,即单个变量的“自身变异”大小;
- 协方差: , ,
协方差是衡量两个变量的相关程度(亲疏),协方差越大表明两个变量相互影响越大(即越亲密),协方差越小表明两个变量之间相互独立的程度越大。
协方差只能处理二维问题。
- 相关系数:,
相关系数和协方差都可以衡量两个表明的相关程度,协方差未消除量纲,不同变量之间的协方差大小不能直接比较,而相关系数消除了量纲,可以比较不同变量之间的相关程度。
- 协方差矩阵:如果有两个变量X,Y,那么协方差矩阵为,
协方差矩阵整体反映了变量(维度)之间以及变量自身的关系。协方差矩阵的对角化使得新矩阵非对角线元素为0,其实就是让新维度之间的相关性尽可能小,最终对角线上的特征值即为新维度自身的新方差。同一新维度的新方差越大,说明这个维度越能反映出不同样本之间的差异,越重要。最终实现降噪和降冗余,获得新特征向量——>再根据特征值,选择确立主成分。
协方差矩阵能处理多维问题;
协方差矩阵计算的是不同变量(纬度)之间的协方差,而不是不同样本之间的协方差; 样本矩阵中若每行为一个样本,每列为一个变量(维度),那么计算协方差时,要按列计算均值。
协方差矩阵是一个对称矩阵,对角线是各变量(维度)上的方差;
(2)主成分分析的思想和实现算法
主成分分析是利用降维的思想,通过线性变换,把数据变换到一个新的坐标系统中,使得任何数据投影的第一大方差在第一个坐标(称为第一主成分)上,第二大方差在第二个坐标(第二主成分)上,依次类推。最终将一组样本数据的多个变量(维或特征)转化为保留下来的少数几个综合变量(即主成分,其中每个主成分都是原始变量的线性组合,各主成分之间互不相关),从而这些主成分能够反映始变量的绝大部分信息,且所含的信息互不重叠。
或者这样描述,将一组 N 维向量降为 K 维,其目标是选择 K 个单位正交基,使得原始数据变换到这组基上后,各变量两两间协方差为 0,而变量自身方差则尽可能大(在正交的约束下,取最大的 K 个方差)。
假设用p个变量(维度)来描述研究对象,分别用X1,X2…Xp来表示,这p个变量构成的p维随机向量为X=(X1,X2…Xp),n个样本构成组成了n行p列的矩阵A。主成分求解过程如下:
第一步,求解得到矩阵A的协方差阵B;
第二步,求解协方差阵B,得到按大小顺序排列的特征值向量,为特征值向量中每个特征值组成的对角矩阵,U为所有特征值对应的特征向量构成的矩阵,因此有。重点来了,U是由特征向量构成的正定阵(即每个特征向量也由原始n维度构成),向量的每一行可以视为一个的基向量,这些基向量经过矩阵B转换后,得到了在各个基向量上的伸缩,伸缩的大小即为特征值。
第三步,主成分个数选择,根据特征值的大小,将特征值较大的作为主成分(一般取前累计85%+),其对应的特征向量就为基向量,特征值的筛选根据实际情况而定,一般大于1即可考虑作为主成分。
(3)PCA有什么作用呢?
PCA经常用于减少数据集的维数,同时保持数据集的对方差贡献最大的特征(主成分)。PCA 不仅将数据压缩到低维,它也使得降维之后的数据各特征(主成分)相互独立;
那为什么要降维呢?
- 最直接的是,对于大数据来说,降维后可以降低算力要求:PCA算法通过舍去一部分信息之后能使得样本的采样密度增大(因为维数降低了),这是缓解维度灾难的重要手段。
- 其次,降噪:当数据受到噪声影响时,最小特征值对应的特征向量往往与噪声有关,将它们舍弃能在一定程度上起到降噪的效果。
- 降低复杂性,便于直观展示:通常数据展示是二维,超过四维就难以展示了,另一方面,多维数据分析的难度很大。很多情况下,许多变量(维度或特征)之间可能存在相关性,从而增加了问题分析的复杂性,对分析带来不便。如果分别对每个指标进行分析,分析往往是孤立的,而不是综合的。盲目减少指标又会损失很多信息,容易产生错误的结论。
(4)主成分分析也有缺点
- 可能加剧过拟合:PCA 保留了主要信息,但这个主要信息只是针对训练集的,而且这个主要信息未必是重要信息。有可能舍弃了一些看似无用的信息,但是这些看似无用的信息恰好是重要信息,只是在训练集上没有很大的表现,所以 PCA 也可能加剧了过拟合;
- PCA降维完啦计算机能更好的认识这些数据,但是降维后的新维度就不一定好理解了。原来的数据中比如包括了年龄,性别,身高等指标降维后的数据既然维度变小了,那么新的成分每一维都是什么含义呢?这个就很难解释了。
- PCA对数据有两个假设前提:数据必须是连续数值型;数据中没有缺失值。
(5)实例分析——机器学习中的分类问题
机器学习中的分类问题,给出178个葡萄酒样本,每个样本含有13个参数,比如酒精度、酸度、镁含量等,这些样本属于3个不同种类的葡萄酒。任务是提取3种葡萄酒的特征,以便下一次给出一个新的葡萄酒样本的时候,能根据已有数据判断出新样本是哪一种葡萄酒。
问题详细描述:http://archive.ics.uci.edu/ml/datasets/Wine
训练样本数据:http://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data
把数据集赋给一个178行13列的矩阵R,它的协方差矩阵C是13行13列的矩阵,对C进行特征分解,对角化,其中U是特征向量组成的矩阵,D是特征之组成的对角矩阵,并按由大到小排列。然后,令,就实现了数据集在特征向量这组正交基上的投影。嗯,重点来了,中的数据列是按照对应特征值的大小排列的,后面的列对应小特征值,去掉以后对整个数据集的影响比较小。比如,现在我们直接去掉后面的7列,只保留前6列,就完成了降维。
下面我们看一下降维前和降维后的使用svm分类结果,本部分采用实现SVM的R语言包e1071,代码如下表所示。分类结果显示,使用主成分分析后的样本和未进行主成分分析样本的分类结果一样。因此,主成分分析提取的6个主成分能较好的表达原样本的13个变量。
library("e1071") #读取数据 wineData=read.table("E:\\research in progress\\百度云同步盘\\blog\\特征值和特征向量\\data.csv",header=T,sep=","); #计算协方差阵 covariance = cov(wineData[2:14]) #计算特征值和特征向量 eigenResult=eigen(covariance) #选取6个主成分,并计算这6个主成分解释的方差总和 PC_NUM = 6 varSum=sum(eigenResult$values[1:PC_NUM])/sum(eigenResult$values) #降维后的样本 ruduceData= data.matrix(wineData[2:14])%*%eigenResult$vectors[,1:PC_NUM] #加入分类标签 #finalData=cbind(wineData$class,ruduceData) #给finalData添加列名 #colnames(finalDat) =c("calss","pc1","pc2","pc3","pc4","pc5","pc6") #训练样本--主成分分析后的样本作为训练样本 y=wineData$class; x1=ruduceData; model1 <- svm(x1, y,cross=10) pred1 <- predict(model1, x1) #pred1 <- fitted(model1) table(pred1, y) #使用table来查看预测结果 #训练样本--原数据作为训练样本 x2=wineData[2:14] model2 <- svm(x2, y,cross=10) #pred2 <- predict(model2, x2) pred2 <- fitted(model2) table(pred2, y) #使用table来查看预测结果
【参考】
【1】特征值与特征向量及其应用
【3】初识PCA数据降维