PCA:主成分分析
小于 1 分钟
主成分分析简单步骤。
1. PCA 介绍
在 SVD:奇异值分解 中,我们介绍了特征值分解和奇异值分解的基本方法,本节我们将使用这两种方法进行 主成分分析(Principal Component Analysis,PCA)。
2. 使用特征值分解进行 PCA
设有 条 维数据,需要降维到 维(),使用特征值进行 PCA 的基本步骤如下:
- 将原始数据按列组成 行 列矩阵
- 将 的每一行(代表一个属性字段)进行零均值化,即减去这一行的均值
- 求出协方差矩阵
- 求出协方差矩阵 的特征值及对应的特征向量
- 将特征向量按对应特征值大小从上到下按行排列成矩阵,取前 行组成矩阵
- 即为降维到 维后的数据
3. 使用奇异值分解进行 PCA
import numpy as np
def pca(X: np.ndarray, k: int): # k is the components you want
# mean of each feature
n_samples, n_features = X.shape
mean = np.array([np.mean(X[:, i]) for i in range(n_features)])
# normalization
norm_X = X-mean
# scatter matrix
scatter_matrix = np.dot(np.transpose(norm_X), norm_X)
# Calculate the eigenvectors and eigenvalues
eig_val, eig_vec = np.linalg.eig(scatter_matrix)
eig_pairs = [
(np.abs(eig_val[i]), eig_vec[:, i])
for i in range(n_features)
]
# sort eig_vec based on eig_val from highest to lowest
eig_pairs.sort(reverse=True)
# select the top k eig_vec
feature = np.array([ele[1] for ele in eig_pairs[:k]])
# get new data
data = np.dot(norm_X, np.transpose(feature))
return data
X = np.array([[-1, 1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
print(pca(X, 1))