IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 奇异值分解(SVD)与 主成分分析(PCA) -> 正文阅读

[人工智能]奇异值分解(SVD)与 主成分分析(PCA)

线性映射

线性映射同构于矩阵乘。线性空间的一组基 α = ( α 1 , ? ? , α n ) \alpha=(\alpha_1, \cdots, \alpha_n) α=(α1?,?,αn?),一个点的坐标为 x = ( x 1 , ? ? , x n ) x=(x_1,\cdots,x_n) x=(x1?,?,xn?),那么点可以记做两者内积 α ? x = ∑ i = 1 n x i α i \alpha \cdot x = \sum_{i=1}^{n} x_i\alpha_i α?x=i=1n?xi?αi?。注意,基不一定是向量,可以是任何线性无关的对象(比如,三角函数)。

线性映射 A : U → V \mathscr A :\mathbb U \rightarrow \mathbb V A:UV,在空间 U U U下的基 ( α 1 , ? ? , α n ) (\alpha_1, \cdots, \alpha_n) (α1?,?,αn?)下和空间 V V V下的基 ( β 1 , ? ? , β m ) (\beta_1, \cdots, \beta_m) (β1?,?,βm?)的矩阵是 A A A,在空间 U U U下的基 ( α ~ 1 , ? ? , α ~ n ) (\tilde \alpha_1, \cdots, \tilde \alpha_n) (α~1?,?,α~n?)下和空间 V V V下的基 ( β ~ 1 , ? ? , β ~ m ) (\tilde \beta_1, \cdots, \tilde \beta_m) (β~?1?,?,β~?m?)的矩阵是 B B B,即
A ( α 1 , ? ? , α n ) = ( β 1 , ? ? , β m ) A A ( α ~ 1 , ? ? , α ~ n ) = ( β ~ 1 , ? ? , β ~ m ) B \mathscr A(\alpha_1, \cdots, \alpha_n) = (\beta_1, \cdots, \beta_m)A\\ \mathscr A(\tilde \alpha_1, \cdots, \tilde \alpha_n) = (\tilde \beta_1, \cdots, \tilde \beta_m)B\\ A(α1?,?,αn?)=(β1?,?,βm?)AA(α~1?,?,α~n?)=(β~?1?,?,β~?m?)B
假设 ( α 1 , ? ? , α n ) (\alpha_1, \cdots, \alpha_n) (α1?,?,αn?) ( α ~ 1 , ? ? , α ~ n ) (\tilde \alpha_1, \cdots, \tilde \alpha_n) (α~1?,?,α~n?)的过渡矩阵为 P P P ( β 1 , ? ? , β m ) (\beta_1, \cdots, \beta_m) (β1?,?,βm?) ( β ~ 1 , ? ? , β ~ m ) (\tilde \beta_1, \cdots, \tilde \beta_m) (β~?1?,?,β~?m?)的过渡矩阵为 Q Q Q,即
( α 1 , ? ? , α n ) P = ( α ~ 1 , ? ? , α ~ n ) ( β 1 , ? ? , β m ) Q = ( β ~ 1 , ? ? , β ~ m ) (\alpha_1, \cdots, \alpha_n)P=(\tilde \alpha_1, \cdots, \tilde \alpha_n)\\ (\beta_1, \cdots, \beta_m)Q=(\tilde \beta_1, \cdots, \tilde \beta_m) (α1?,?,αn?)P=(α~1?,?,α~n?)(β1?,?,βm?)Q=(β~?1?,?,β~?m?)
那么 B = Q A P B=QAP B=QAP相抵),相抵矩阵代表相同的线性映射。对于基 α \alpha α下坐标为 x x x的点 P 1 ∈ U P_1 \in \mathbb U P1?U,映射到了 P 2 = A ( α ? x ) = A ( α ) ? x = ( β 1 , ? ? , β m ) A x P_2 = \mathscr A(\alpha \cdot x) = \mathscr A(\alpha) \cdot x = (\beta_1, \cdots, \beta_m)Ax P2?=A(α?x)=A(α)?x=(β1?,?,βm?)Ax,在基 β \beta β下点 P 2 ∈ V P_2 \in \mathbb V P2?V的坐标为 y = A x y=Ax y=Ax

线性变换 A : V → V \mathscr A :\mathbb V \rightarrow \mathbb V A:VV,空间 V V V的两组基 ( α 1 , ? ? , α n ) , ( α ~ 1 , ? ? , α ~ n ) (\alpha_1, \cdots, \alpha_n),(\tilde \alpha_1, \cdots, \tilde \alpha_n) (α1?,?,αn?),(α~1?,?,α~n?),若
A ( α 1 , ? ? , α n ) = ( α 1 , ? ? , α n ) A A ( α ~ 1 , ? ? , α ~ n ) = ( α ~ 1 , ? ? , α ~ n ) B \mathscr A(\alpha_1, \cdots, \alpha_n) = (\alpha_1, \cdots, \alpha_n)A\\ \mathscr A(\tilde \alpha_1, \cdots, \tilde \alpha_n)= (\tilde \alpha_1, \cdots, \tilde \alpha_n)B\\ A(α1?,?,αn?)=(α1?,?,αn?)AA(α~1?,?,α~n?)=(α~1?,?,α~n?)B
假设从基 α \alpha α到基 α ~ \tilde \alpha α~的过渡矩阵为可逆方阵 P P P,即
( α 1 , ? ? , α n ) P = ( α ~ 1 , ? ? , α ~ n ) (\alpha_1, \cdots, \alpha_n)P=(\tilde \alpha_1, \cdots, \tilde \alpha_n) (α1?,?,αn?)P=(α~1?,?,α~n?)
那么 B = P ? 1 A P B=P^{-1}AP B=P?1AP相似),相似矩阵代表相同的线性变换。对于基 α \alpha α下坐标为 x x x的点 P 1 ∈ V P_1\in \mathbb V P1?V,映射到了 P 2 = A ( α ? x ) = A ( α ) ? x = ( α 1 , ? ? , α n ) A x P_2 = \mathscr A(\alpha \cdot x) = \mathscr A(\alpha) \cdot x = (\alpha_1, \cdots, \alpha_n)Ax P2?=A(α?x)=A(α)?x=(α1?,?,αn?)Ax,在基 α \alpha α下点 P 2 ∈ V P_2\in \mathbb V P2?V的坐标为 y = A x y=Ax y=Ax

SVD

对角化:对于 n n n维方阵 A A A,如果存在 n n n个线性无关的特征向量 w 1 , ? ? , w n w_1,\cdots,w_n w1?,?,wn?,以及对应的特征值 λ 1 ≤ ? ≤ λ n \lambda_1 \le \cdots \le \lambda_n λ1??λn?,那么可以表示为: A = W Σ W ? 1 A=W \Sigma W^{-1} A=WΣW?1,其中 W = [ w 1 , ? ? , w n ] W=[w_1,\cdots,w_n] W=[w1?,?,wn?] Σ = d i a g ( λ 1 , ? ? , λ n ) \Sigma=diag(\lambda_1,\cdots,\lambda_n) Σ=diag(λ1?,?,λn?)

一个实对称矩阵 A = A T ∈ R n × n A=A^T \in R^{n\times n} A=ATRn×n),它满足:

  1. 不同特征值对应的特征向量彼此正交
  2. 若特征值 λ \lambda λ的重数为 r r r,那么就存在 r r r个线性无关的特征向量 λ \lambda λ(几何重数=代数重数)

因此,一个 n n n阶实对称方阵中一定可以找到 n n n单位正交特征向量!或者说,存在 W T W = I W^TW=I WTW=I(酉矩阵)

对于长矩阵 A ∈ R m × n A \in R^{m \times n} ARm×n,有

特征值分解

  1. 计算协方差矩阵 C = 1 n ? 1 A T A ∈ R n × n C = \frac{1}{n-1} A^T A \in R^{n \times n} C=n?11?ATARn×n(无偏估计,不除以 n ? 1 n-1 n?1或者除以 n n n都不影响特征值和特征向量)
  2. 协方差矩阵 C C C n n n阶实对称方阵,因此可以对角化: C = W Σ W T C = W \Sigma W^T C=WΣWT

奇异值分解(Singular Value Decomposition,SVD):

  1. 对于矩阵 A T A ∈ R n × n A^T A \in R^{n \times n} ATARn×n,计算 n n n个单位正交的特征向量(右奇异向量 v i v_i vi?),按列组合成酉矩阵 V ∈ R n × n V \in R^{n \times n} VRn×n,对应的特征值为 λ i \lambda_i λi?

  2. 对于矩阵 A A T ∈ R m × m A A^T \in R^{m \times m} AATRm×m,计算 m m m个单位正交的特征向量(左奇异向量 u i u_i ui?),按列组合成酉矩阵 U ∈ R m × m U \in R^{m \times m} URm×m,对应的特征值为 λ ~ i \tilde \lambda_i λ~i?

  3. 根据 σ i = A v i / u i \sigma_i = Av_i/u_i σi?=Avi?/ui?或者 σ i 2 = λ i = λ ~ i \sigma_i^2=\lambda_i=\tilde \lambda_i σi2?=λi?=λ~i?计算奇异值,组合成 Σ ∈ R m × n \Sigma \in R^{m \times n} ΣRm×n,它的对角线是对应的奇异值

  4. 最终得到 A = U Σ V T A = U \Sigma V^T A=UΣVT(易知, A V = U Σ AV = U \Sigma AV=UΣ A T A = V Σ T U T ? U Σ V T = V Σ 2 V T A^T A = V \Sigma^T U^T \cdot U \Sigma V^T = V \Sigma^2 V^T ATA=VΣTUT?UΣVT=VΣ2VT A A T = U Σ V T ? V Σ T U T = U Σ 2 U T A A^T = U \Sigma V^T \cdot V \Sigma^T U^T = U \Sigma^2 U^T AAT=UΣVT?VΣTUT=UΣ2UT

一般地,特征值分解以及奇异值分解都将 Σ \Sigma Σ中的特征值或奇异值按照从大到小的顺序排列。并且,奇异值会快速衰减(前10%甚至1%的奇异值的加和,可以占全部奇异值之和的99%以上),可用于压缩数据。

numpy计算,

import numpy as np

A = np.array([[-1, 1, 1],
              [-4, 3, 2],
              [1, 0, 3]])

#特征值、特征向量
eigenvalue, featurevector = np.linalg.eig(A)	#计算
index = list(reversed(np.argsort(eigenvalue)))	#从大到小排序
eigenvalue = eigenvalue[index]
featurevector = featurevector.T[index]
print("特征值:\n", eigenvalue)
print("特征向量:\n", featurevector)

#逆矩阵
det = np.linalg.det(W)
print("det:",det)
W_inv = np.linalg.inv(W) 
print("W_inv:\n",W_inv)

#特征值的对角阵
Sigma = np.diag(eigenvalue) 
print("Sigma:\n",Sigma)

# A2 = A
A2 = W@Sigma@W_inv
print("A2:\n",A2)

其实,更简单的

# 特征值分解
S,W = np.linalg.eig(A)
print("\nW = \n",W)
print("\nS = \n",S)
print("\nA2 = \n",(W*S)@np.linalg.inv(W))	#W * diag(S) * W.inv

A = np.array([[-1, 1, 1, 5],
              [-4, 3, 2, -2],
              [1, 0, 3, 1]])

# 奇异值分解
U, S, VT = np.linalg.svd(A)
print("\nU = \n",U)
print("\nS = \n",S)
print("\nV.T = \n",VT)
Sigma = np.zeros(A.shape)
for i,s in enumerate(S):
	Sigma[i,i]=s
print("\nA2 = \n",U@Sigma@VT)	#U * diag(S) * V.T

PCA

主成分分析(Principal Component Analysis,PCA)是非常经典的降维算法。

对于 A ∈ R m × n A \in R^{m \times n} ARm×n,它表示 m m m维特征空间中的 n n n个数据点,但特征的维度 m m m过大

方法一:

  1. 去中心化,将各特征(如 A i j A_{ij} Aij?)减去它们的均值(如 1 n ? 1 ∑ j = 1 n A i j \frac{1}{n-1}\sum_{j=1}^n A_{ij} n?11?j=1n?Aij?),得到矩阵 X ∈ R m × n X \in R^{m \times n} XRm×n
  2. 计算协方差矩阵 C = 1 n ? 1 X T X ∈ R n × n C = \frac{1}{n-1} X^T X \in R^{n \times n} C=n?11?XTXRn×n
  3. 特征值分解 C = W Σ W T C = W \Sigma W^T C=WΣWT
  4. 选取最大的 k k k个特征值,将 W W W截取最左边的 k k k个特征向量,按行组合成矩阵 P P P
  5. 做线性变换, Y = P A ∈ R k × n Y = PA \in R^{k \times n} Y=PARk×n,这是 k ? n k \ll n k?n维空间中的 n n n个数据点

方法二:

  1. 去中心化,将各特征(如 A i j A_{ij} Aij?)减去它们的均值(如 1 n ? 1 ∑ j = 1 n A i j \frac{1}{n-1}\sum_{j=1}^n A_{ij} n?11?j=1n?Aij?),得到矩阵 X ∈ R m × n X \in R^{m \times n} XRm×n
  2. 奇异值分解 X = U Σ V T X = U \Sigma V^T X=UΣVT
  3. 选取最大的 k k k个奇异值,将 U U U截取最左边的 k k k个特征向量,按行组合成矩阵 P P P
  4. 做线性变换, Y = P A ∈ R k × n Y = PA \in R^{k \times n} Y=PARk×n,这是 k ? n k \ll n k?n维空间中的 n n n个数据点

PCA的含义:由于截取的 k k k个特征值较大,这意味着,在对应的特征向量的方向上的方差较大。由于 P P P是由特征向量按行组合的,且这些特征向量彼此单位正交,所以 Y = P A Y = PA Y=PA其实就是将 m m m维空间中的 n n n个数据点,正交投影到这些特征向量张成的 k k k维子空间中(内积就是投影系数),矩阵 P ∈ R k × m P \in R^{k \times m} PRk×m是从 m m m维空间到 k k k维子空间的线性变换。我们认为这 k k k维子空间上的投影是消息本身,而另外 m ? k m-k m?k维补空间内的投影则是噪音

选取合适的主成分个数 k k k
1 ? ∑ i = 1 k Σ i i ∑ i = 1 n Σ i i ≤ t 1 - \frac{\sum_{i=1}^k \Sigma_{ii}}{\sum_{i=1}^n \Sigma_{ii}} \le t 1?i=1n?Σii?i=1k?Σii??t
这里的 t t t是误差大小,选取 t = 0.01 t=0.01 t=0.01表示主成分保留了至少 99 % 99\% 99%的原始信息。

代码实现,

def PCA(X,k):
	'X是m*n长矩阵,m维空间中的n个数据点'
	X_mean = np.mean(X,1)			#每一行的均值
	X2 = np.array(X,dtype=float)
	for i,x in enumerate(X2):		#去中心化
		X2[i] = x-X_mean[i]
	U, S, VT = np.linalg.svd(X2)	#SVD
	tmp = 0
	for i in range(k):
		tmp += S[i]
	t = 1 - tmp/np.sum(S)			#误差大小
	P = U[:,:k].T
	return P@X, t					#(投影,误差)
  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-04-28 11:50:53  更:2022-04-28 11:51:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 8:43:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码