理论教育 Python计算思维:奇异值分解与主成分分解简介

Python计算思维:奇异值分解与主成分分解简介

时间:2023-11-22 理论教育 版权反馈
【摘要】:矩阵分解是将一个矩阵分解为多个有特殊性质矩阵的乘积,目的是简化计算,并获取矩阵中包含的信息。常见的矩阵分解方法包括SVD(奇异值)、QR分解等。本节着重讲解SVD分解及与SVD密切相关的主成分分解。由于每个主成分都是数学上独立的一维,与其他信息都是正交的,所以主成分分析也经常用来降低空间的维数,即降维。

Python计算思维:奇异值分解与主成分分解简介

矩阵分解是将一个矩阵分解为多个有特殊性质矩阵的乘积,目的是简化计算,并获取矩阵中包含的信息。常见的矩阵分解方法包括SVD(奇异值)、QR分解等。本节着重讲解SVD分解及与SVD密切相关的主成分分解。

1.SVD分解

实矩阵的SVD分解,将一个实矩阵分解为三个矩阵的乘积,其结果可以表达为:

A=USV

视频讲解:矩阵SVD分解及应用

其中S为对角矩阵,其每个对角线上的元素是矩阵的A的实奇异值,每个奇异值的平方则是特征值,从大到小排列,U是列正交矩阵,且每个列的模为1,V是行正交矩阵。所谓列(行)正交,是指矩阵的任意两列(行)的对应元素的乘积之和为0,也可以这么理解,UTU是一个单位矩阵I,维数是A矩阵的行,VTV也是单位矩阵I,维数为A矩阵的列。

numpy对实矩阵A进行SVD,生成的三个矩阵中,S矩阵采用一维数据表达,其语句如下:

B=np.linalg.svd(A,full_matrices=False)

其中,full_matrices=False一定要写,否则会按复数方式分解。

分解结果存储在B中,它是一个列表,只有3个元素,分别为:U、S、V矩阵,例如:

这里可以验证一个规律:U矩阵的行数等于A矩阵的行数,V矩阵的列数则等于A矩阵的列数,S的元素个数是原矩阵A的秩,也就是特征值的数目。

numpy库中提供的SVD分解可以计算得到奇异值,scipy库对其进行了扩充,可以方便地获取方阵的特征值和特征向量。其操作如下面的代码:

上面代码直接使用scipy对linalg的扩展,使用其eig方法,求得方阵的特征值和特征向量,并将特征值、特征向量分别代入Ax=λx方程,对结果进行了验证。

可以证明,矩阵A奇异值的平方是其协方差矩阵的特征值,如下面代码所示:

import numpy as np

from scipy import linalg

A=np.array([[1,5.0,3.0],[2.1,2.0,7.0]])

Z=np.linalg.svd(A,full_matrices=False)

print(Z[1])

X=A.dot(A.T)

la,v=linalg.eig(X)(www.daowen.com)

print(la)

程序的运行结果为:

[9.00833663 3.35557316]

[11.25987123+0.j 81.15012877+0.j]

可以发现,scipy求得的特征值,正好是两个奇异值的平方(结果中次序颠倒)。

2.主成分分析

SVD分解将实矩阵X分解为:

X=USV

程序:PCA分解

其中S的每个元素对应于一个实数奇异值,从大到小有序排列。从物理意义上讲,奇异值的大小,对应于独立信息的强弱。由于各种实验测量仪器都有较高的信噪比,故可以通过相邻奇异值的比值来判断信号和噪声,这样就可以确定前n个对应于独立信息的奇异值,这n个奇异值对应于U矩阵的前n列,V矩阵的前n行。

视频讲解:矩阵主成分分析

在计量学领域经济计量学,有一种分析方法被称为主成分分析(Principle Component Analysis,PCA),其实质与SVD分解类同,但它将每个数学上独立的信息称为一个主成分,追求物理意义上的解,而不是纯数学上的表达。

由于每个主成分都是数学上独立的一维,与其他信息都是正交的,所以主成分分析也经常用来降低空间的维数,即降维。

美国著名化学计量学研究者B.R.Kowalski,将PCA算法用于矩阵分解,用如下的2个矩阵的乘积表达:

X=TPT

其中T是SVD分解中US的乘积,称为得分矩阵,P是V的转置,称为载荷矩阵。采用这种表达方式的原因,是将每个主成分都表达在矩阵的列中。

因为P是列正交的矩阵,且每列的模为1,PTP是单位阵,所以有:

T=XP

也就是说,得分矩阵T是原始矩阵X在P所形成的空间中的投影,属于X的一种线性变换

由于可以通过比较奇异值的大小来确定有效信息,而T又是X的线性变换,所以可以取T的前n列代替X,而不会导致有效信息的丢失。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈