主成分分析

1.假设\(x\)\(m\) 维随机变量,其均值为\(\mu\),协方差矩阵为\(\Sigma\)

考虑由\(m\)维随机变量\(x\)\(m\)维随机变量\(y\)的线性变换 \[y _ { i } = \alpha _ { i } ^ { T } x = \sum _ { k = 1 } ^ { m } \alpha _ { k i } x _ { k } , \quad i = 1,2 , \cdots , m\] 其中\(\alpha _ { i } ^ { T } = ( \alpha _ { 1 i } , \alpha _ { 2 i } , \cdots , \alpha _ { m i } )\)

如果该线性变换满足以下条件,则称之为总体主成分:

(1)\(\alpha _ { i } ^ { T } \alpha _ { i } = 1 , i = 1,2 , \cdots , m\)

(2)\(\operatorname { cov } ( y _ { i } , y _ { j } ) = 0 ( i \neq j )\);

(3)变量\(y_1\)\(x\)的所有线性变换中方差最大的;\(y_2\)是与\(y_1\)不相关的\(x\)的所有线性变换中方差最大的;一般地,\(y_i\)是与\(y _ { 1 } , y _ { 2 } , \cdots , y _ { i - 1 } , ( i = 1,2 , \cdots , m )\)都不相关的\(x\)的所有线性变换中方差最大的;这时分别称\(y _ { 1 } , y _ { 2 } , \cdots , y _ { m }\)\(x\)的第一主成分、第二主成分、…、第\(m\)主成分。

2.假设\(x\)\(m\)维随机变量,其协方差矩阵是\(\Sigma\)\(\Sigma\)的特征值分别是\(\lambda _ { 1 } \geq\lambda _ { 2 } \geq \cdots \geq \lambda _ { m } \geq 0\),特征值对应的单位特征向量分别是\(\alpha _ { 1 } , \alpha _ { 2 } , \cdots , \alpha _ { m }\),则\(x\)的第2主成分可以写作

\[y _ { i } = \alpha _ { i } ^ { T } x = \sum _ { k = 1 } ^ { m } \alpha _ { k i } x _ { k } , \quad i = 1,2 , \cdots , m\] 并且,\(x\)的第\(i\)主成分的方差是协方差矩阵\(\Sigma\)的第\(i\)个特征值,即\[\operatorname { var } ( y _ { i } ) = \alpha _ { i } ^ { T } \Sigma \alpha _ { i } = \lambda _ { i }\]

3.主成分有以下性质:

主成分\(y\)的协方差矩阵是对角矩阵\[\operatorname { cov } ( y ) = \Lambda = \operatorname { diag } ( \lambda _ { 1 } , \lambda _ { 2 } , \cdots , \lambda _ { m } )\]

主成分\(y\)的方差之和等于随机变量\(x\)的方差之和 \[\sum _ { i = 1 } ^ { m } \lambda _ { i } = \sum _ { i = 1 } ^ { m } \sigma _ { i i }\] 其中\(\sigma _ { i i }\)\(x_2\)的方差,即协方差矩阵\(\Sigma\)的对角线元素。

主成分\(y_k\)与变量\(x_2\)的相关系数\(\rho ( y _ { k } , x _ { i } )\)称为因子负荷量(factor loading),它表示第\(k\)个主成分\(y_k\)与变量\(x\)的相关关系,即\(y_k\)\(x\)的贡献程度。 \[\rho ( y _ { k } , x _ { i } ) = \frac { \sqrt { \lambda _ { k } } \alpha _ { i k } } { \sqrt { \sigma _ { i i } } } , \quad k , i = 1,2 , \cdots , m\]

4.样本主成分分析就是基于样本协方差矩阵的主成分分析。

给定样本矩阵 \[X = \left[ \begin{array} { l l l l } { x _ { 1 } } & { x _ { 2 } } & { \cdots } & { x _ { n } } \end{array} \right] = \left[ \begin{array} { c c c c } { x _ { 11 } } & { x _ { 12 } } & { \cdots } & { x _ { 1 n } } \\ { x _ { 21 } } & { x _ { 22 } } & { \cdots } & { x _ { 2 n } } \\ { \vdots } & { \vdots } & { } & { \vdots } \\ { x _ { m 1 } } & { x _ { m 2 } } & { \cdots } & { x _ { m n } } \end{array} \right]\]

其中\(x _ { j } = ( x _ { 1 j } , x _ { 2 j } , \cdots , x _ { m j } ) ^ { T }\)\(x\)的第\(j\)个独立观测样本,\(j=1,2,…,n\)

\(X\)的样本协方差矩阵 \[\left. \begin{array} { c } { S = [ s _ { i j } ] _ { m \times m } , \quad s _ { i j } = \frac { 1 } { n - 1 } \sum _ { k = 1 } ^ { n } ( x _ { i k } - \overline { x } _ { i } ) ( x _ { j k } - \overline { x } _ { j } ) } \\ { i = 1,2 , \cdots , m , \quad j = 1,2 , \cdots , m } \end{array} \right.\]

给定样本数据矩阵\(X\),考虑向量\(x\)\(y\)的线性变换\[y = A ^ { T } x\] 这里 \[A = \left[ \begin{array} { l l l l } { a _ { 1 } } & { a _ { 2 } } & { \cdots } & { a _ { m } } \end{array} \right] = \left[ \begin{array} { c c c c } { a _ { 11 } } & { a _ { 12 } } & { \cdots } & { a _ { 1 m } } \\ { a _ { 21 } } & { a _ { 22 } } & { \cdots } & { a _ { 2 m } } \\ { \vdots } & { \vdots } & { } & { \vdots } \\ { a _ { m 1 } } & { a _ { m 2 } } & { \cdots } & { a _ { m m } } \end{array} \right]\]

如果该线性变换满足以下条件,则称之为样本主成分。样本第一主成分\(y _ { 1 } = a _ { 1 } ^ { T } x\)是在\(a _ { 1 } ^ { T } a _ { 1 } = 1\)条件下,使得\(a _ { 1 } ^ { T } x _ { j } ( j = 1,2 , \cdots , n )\)的样本方差\(a _ { 1 } ^ { T } S a _ { 1 }\)最大的\(x\)的线性变换;

样本第二主成分\(y _ { 2 } = a _ { 2 } ^ { T } x\)是在\(a _ { 2 } ^ { T } a _ { 2 } = 1\)\(a _ { 2 } ^ { T } x _ { j }\)\(a _ { 1 } ^ { T } x _ { j } ( j = 1,2 , \cdots , n )\)的样本协方差\(a _ { 1 } ^ { T } S a _ { 2 } = 0\)条件下,使得\(a _ { 2 } ^ { T } x _ { j } ( j = 1,2 , \cdots , n )\)的样本方差\(a _ { 2 } ^ { T } S a _ { 2 }\)最大的\(x\)的线性变换;

一般地,样本第\(i\)主成分\(y _ { i } = a _ { i } ^ { T } x\)是在\(a _ { i } ^ { T } a _ { i } = 1\)\(a _ { i } ^ { T } x _ { j }\)\(a _ { k } ^ { T } x _ { j } ( k < i , j = 1,2 , \cdots , n )\)的样本协方差\(a _ { k } ^ { T } S a _ { i } = 0\)条件下,使得\(a _ { i } ^ { T } x _ { j } ( j = 1,2 , \cdots , n )\)的样本方差\(a _ { k } ^ { T } S a _ { i }\)最大的\(x\)的线性变换。

5.主成分分析方法主要有两种,可以通过相关矩阵的特征值分解或样本矩阵的奇异值分解进行。

(1)相关矩阵的特征值分解算法。针对\(m \times n\)样本矩阵\(X\),求样本相关矩阵 \[R = \frac { 1 } { n - 1 } X X ^ { T }\] 再求样本相关矩阵的\(k\)个特征值和对应的单位特征向量,构造正交矩阵 \[V = ( v _ { 1 } , v _ { 2 } , \cdots , v _ { k } )\]

\(V\)的每一列对应一个主成分,得到\(k \times n\)样本主成分矩阵 \[Y = V ^ { T } X\]

(2)矩阵\(X\)的奇异值分解算法。针对\(m \times n\)样本矩阵\(X\) \[X ^ { \prime } = \frac { 1 } { \sqrt { n - 1 } } X ^ { T }\] 对矩阵\(X ^ { \prime }\)进行截断奇异值分解,保留\(k\)个奇异值、奇异向量,得到 \[X ^ { \prime } = U S V ^ { T }\] \(V\)的每一列对应一个主成分,得到\(k \times n\)样本主成分矩阵\(Y\) \[Y = V ^ { T } X\]

本章代码直接使用Coursera机器学习课程的第六个编程练习。


PCA(principal components analysis)即主成分分析技术旨在利用降维的思想,把多指标转化为少数几个综合指标。

1
2
3
4
5
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sb
from scipy.io import loadmat
1
2
data = loadmat('data/ex7data1.mat')
# data
1
2
3
4
5
X = data['X']

fig, ax = plt.subplots(figsize=(12,8))
ax.scatter(X[:, 0], X[:, 1])
plt.show()

PCA的算法相当简单。 在确保数据被归一化之后,输出仅仅是原始数据的协方差矩阵的奇异值分解。

1
2
3
4
5
6
7
8
9
10
11
12
def pca(X):
# normalize the features
X = (X - X.mean()) / X.std()

# compute the covariance matrix
X = np.matrix(X)
cov = (X.T * X) / X.shape[0]

# perform SVD
U, S, V = np.linalg.svd(cov)

return U, S, V
1
2
U, S, V = pca(X)
U, S, V
(matrix([[-0.79241747, -0.60997914],
         [-0.60997914,  0.79241747]]),
 array([1.43584536, 0.56415464]),
 matrix([[-0.79241747, -0.60997914],
         [-0.60997914,  0.79241747]]))

现在我们有主成分(矩阵U),我们可以用这些来将原始数据投影到一个较低维的空间中。 对于这个任务,我们将实现一个计算投影并且仅选择顶部K个分量的函数,有效地减少了维数。

1
2
3
def project_data(X, U, k):
U_reduced = U[:,:k]
return np.dot(X, U_reduced)
1
2
Z = project_data(X, U, 1)
Z
matrix([[-4.74689738],
        [-7.15889408],
        [-4.79563345],
        [-4.45754509],
        [-4.80263579],
        [-7.04081342],
        [-4.97025076],
        [-8.75934561],
        [-6.2232703 ],
        [-7.04497331],
        [-6.91702866],
        [-6.79543508],
        [-6.3438312 ],
        [-6.99891495],
        [-4.54558119],
        [-8.31574426],
        [-7.16920841],
        [-5.08083842],
        [-8.54077427],
        [-6.94102769],
        [-8.5978815 ],
        [-5.76620067],
        [-8.2020797 ],
        [-6.23890078],
        [-4.37943868],
        [-5.56947441],
        [-7.53865023],
        [-7.70645413],
        [-5.17158343],
        [-6.19268884],
        [-6.24385246],
        [-8.02715303],
        [-4.81235176],
        [-7.07993347],
        [-5.45953289],
        [-7.60014707],
        [-4.39612191],
        [-7.82288033],
        [-3.40498213],
        [-6.54290343],
        [-7.17879573],
        [-5.22572421],
        [-4.83081168],
        [-7.23907851],
        [-4.36164051],
        [-6.44590096],
        [-2.69118076],
        [-4.61386195],
        [-5.88236227],
        [-7.76732508]])

我们也可以通过反向转换步骤来恢复原始数据。

1
2
3
def recover_data(Z, U, k):
U_reduced = U[:,:k]
return np.dot(Z, U_reduced.T)
1
2
X_recovered = recover_data(Z, U, 1)
X_recovered
matrix([[3.76152442, 2.89550838],
        [5.67283275, 4.36677606],
        [3.80014373, 2.92523637],
        [3.53223661, 2.71900952],
        [3.80569251, 2.92950765],
        [5.57926356, 4.29474931],
        [3.93851354, 3.03174929],
        [6.94105849, 5.3430181 ],
        [4.93142811, 3.79606507],
        [5.58255993, 4.29728676],
        [5.48117436, 4.21924319],
        [5.38482148, 4.14507365],
        [5.02696267, 3.8696047 ],
        [5.54606249, 4.26919213],
        [3.60199795, 2.77270971],
        [6.58954104, 5.07243054],
        [5.681006  , 4.37306758],
        [4.02614513, 3.09920545],
        [6.76785875, 5.20969415],
        [5.50019161, 4.2338821 ],
        [6.81311151, 5.24452836],
        [4.56923815, 3.51726213],
        [6.49947125, 5.00309752],
        [4.94381398, 3.80559934],
        [3.47034372, 2.67136624],
        [4.41334883, 3.39726321],
        [5.97375815, 4.59841938],
        [6.10672889, 4.70077626],
        [4.09805306, 3.15455801],
        [4.90719483, 3.77741101],
        [4.94773778, 3.80861976],
        [6.36085631, 4.8963959 ],
        [3.81339161, 2.93543419],
        [5.61026298, 4.31861173],
        [4.32622924, 3.33020118],
        [6.02248932, 4.63593118],
        [3.48356381, 2.68154267],
        [6.19898705, 4.77179382],
        [2.69816733, 2.07696807],
        [5.18471099, 3.99103461],
        [5.68860316, 4.37891565],
        [4.14095516, 3.18758276],
        [3.82801958, 2.94669436],
        [5.73637229, 4.41568689],
        [3.45624014, 2.66050973],
        [5.10784454, 3.93186513],
        [2.13253865, 1.64156413],
        [3.65610482, 2.81435955],
        [4.66128664, 3.58811828],
        [6.1549641 , 4.73790627]])
1
2
3
fig, ax = plt.subplots(figsize=(12,8))
ax.scatter(list(X_recovered[:, 0]), list(X_recovered[:, 1]))
plt.show()

请注意,第一主成分的投影轴基本上是数据集中的对角线。 当我们将数据减少到一个维度时,我们失去了该对角线周围的变化,所以在我们的再现中,一切都沿着该对角线。

作者

ฅ´ω`ฅ

发布于

2021-07-24

更新于

2021-08-21

许可协议


评论