11.1 PCA的基本概念
- 主成分分析(Principal component analysis, PCA)是一种常见的无监督学习方式,利用正交变换把线性相关变量表示的观测数据转换成几个线性无关变量所表示的数据。
- 这些线性无关的变量就叫做主成分
- 主成分分析是一种降维的方法
- 《统计学习方法》中一书中举了很多种例子
- 在数据总体上进行的主成分分析叫做总体主成分分析,在有限的样本数据上进行的主成分分析称为样本主成分分析
11.2 样本主成分分析
- 问题的情景:对m维的随机变量x进行n次独立的观测,得到一个大小为的样本矩阵,并且可以估计这些样本的均值向量:
11.2.1样本的统计量
- 对于上面的样本,协方差矩阵,其中
(x%7Bjk%7D-%5Cbar%20x_j)%0A#card=math&code=s%7Bij%7D%3D%5Cfrac%201%7Bn-1%7D%5Csum%7Bk%3D1%7D%5En%28x%7Bik%7D-%5Cbar%20xi%29%28x%7Bjk%7D-%5Cbar%20x_j%29%0A)
- 样本的相关矩阵可以写作:
11.2.2 主成分的定义
- 我们可以设一个m维的随机变量x到m维的随机变量y的一个线性变换:
%3DA%5ETx%3D%5Csum%7Bi%3D1%7D%5Em%5Calpha_ix_i%0A#card=math&code=%5Cmathcal%20Y%3D%28y_1%2Cy_2%2C%5Cdots%2Cy_m%29%3DA%5ETx%3D%5Csum%7Bi%3D1%7D%5Em%5Calpha_ix_i%0A)
11.2.3 主成分的统计量
- 对于随机变量#card=math&code=%5Cmathcal%20Y%3D%28y_1%2Cy_2%2C%5Cdots%2Cy_m%29),其统计量有:
%3D%5Calphai%5ET%20S%5Calpha_i%20%5C%5C%20%5Cmathrm%7Bcov%7D(y_i%2Cy_j)%3D%5Calpha_i%5ET%20S%5Calpha_j%0A#card=math&code=%5Cbar%20y_i%3D%5Cfrac%201n%5Csum%7Bj%3D1%7D%5En%5Calpha_i%5ETx_j%3D%5Calpha_i%20%5Cbar%20x%20%5C%5C%20%5Cmathrm%7Bvar%7D%28y_i%29%3D%5Calpha_i%5ET%20S%5Calpha_i%20%5C%5C%20%5Cmathrm%7Bcov%7D%28y_i%2Cy_j%29%3D%5Calpha_i%5ET%20S%5Calpha_j%0A)
11.2.4 PCA的算法
- 先将样本矩阵进行normalization:
- 计算样本的协方差矩阵并对其进行特征值的分解
- 取最大的d个特征值所对应的特征向量
- 输出投影矩阵#card=math&code=W%5E%2A%3D%28w_1%2Cw_2%2C%5Cdots%2Cw_d%29)
11.3 PCA算法的实现
def PCA(data):
"""
PCA Principal Component Analysis
Input:
data - Data numpy array. Each row vector of fea is a data point.
Output:
eigvector - Each column is an embedding function, for a new
data point (row vector) x, y = x*eigvector
will be the embedding result of x.
eigvalue - The sorted eigvalue of PCA eigen-problem.
"""
# Hint: you may need to **normalize** the data before applying PCA
# begin answer
p, N = data.shape
normal_data = data - np.average(data, axis=1).reshape(p, 1)
conv = np.matmul(normal_data, normal_data.T) / N
eigen_values, eigen_vectors = np.linalg.eig(conv)
index = np.argsort(eigen_values)[:: -1]
eigen_values = eigen_values[index]
eigen_vectors = eigen_vectors[:, index]
# end answer
return eigen_vectors, eigen_values