一、PCA的概念
PCA(Principal Component Analysis),即主成分分析方法,是一种使用最广泛的数据降维算法。PCA的主要思想是将n维特征映射到k维上,这k维是全新的正交特征也被称为主成分,是在原有n维特征的基础上重新构造出来的k维特征。
二、怎么找到主成分方向
通过计算数据矩阵的协方差矩阵,然后得到协方差矩阵的特征值和特征向量,选择特征值最大(即方差最大)的k个特征所对应的特征向量组成的矩阵。这样就可以将数据矩阵转换到新的空间当中,实现数据特征的降维。
1.协方差矩阵的求解方法
1.1 特征值分解矩阵
对于矩阵A,有一组特征向量v,将这组向量进行正交化单位化,就能得到一组正交单位向量。特征值分解,就是将矩阵A分解为如下式:
其中,Q是矩阵A的特征向量组成的矩阵,Σ则是一个对角阵,对角线上的元素就是特征值。
1.2 奇异值分解协方差矩阵
奇异值分解是一个能适用于任意矩阵的一种分解的方法,对于任意矩阵A总是存在一个奇异值分解:
其中,U是一个m∗m的方阵,里面的正交向量被称为左奇异向量。∑是一个m∗n的矩阵,∑除了对角线其它元素都为0,对角线上的元素称为奇异值。VT是V的转置矩阵,是一个n∗n的矩阵,它里面的正交向量被称为右奇异值向量。
2.协方差
样本均值:
样本方差:
样本X和样本Y的方差:
三、PCA算法的两种实现方法
1.基于特征值分解实现PCA
步骤:
•去平均值(即去中心化),即每一位特征减去各自的平均值。
- 计算协方差矩阵:计算出数据集的协方差矩阵。
- 特征值分解:求解协方差矩阵的特征值和特征向量。
- 选取主成分:将特征值从大到小排序,选取k个最大的特征值对应的特征向量作为新的坐标系。
- 映射到新空间:将原始数据映射到新的坐标系中,得到低维数据。
2.基于SAD分解实现PCA
步骤:
• 去平均值,即每一位特征减去各自的平均值。
• 计算协方差矩阵。
• 通过SVD计算协方差矩阵的特征值与特征向量。
• 对特征值从大到小排序,选择其中最大的k个。然后将其对应的k个特征向量分别作为列向量组成特征向量矩阵。
• 将数据转换到k个特征向量构建的新空间中。
四、实例:PCA在人脸识别中的应用
数据集:10个文件夹中的400张图片,每个文件夹中各有10张图像。
代码:
1.加载图像数据
def load_images(dataset_path):
data = []
labels = [] # 添加标签用于区分不同的人
for label, subfolder in enumerate(os.listdir(dataset_path)):
subfolder_path = os.path.join(dataset_path, subfolder)
if os.path.isdir(subfolder_path):
for file in os.listdir(subfolder_path):
file_path = os.path.join(subfolder_path, file)
if file.endswith(".pgm"):
img = cv2.imread(file_path, cv2.IMREAD_GRAYSCALE)
if img is not None:
data.append(img.flatten())
labels.append(label)
data = np.array(data)
labels = np.array(labels)
return data, labels
2.PCA实现:首先计算数据的均值并将数据中心化。然后,计算协方差矩阵并找到其特征值和特征向量。最后,选择前n个主成分并将数据投影到这些主成分上。
def pca(data, n_components):
# 标准化数据
scaler = StandardScaler()
data_scaled = scaler.fit_transform(data)
# 计算均值
mean_face = np.mean(data_scaled, axis=0)
# 中心化数据
centered_data = data_scaled - mean_face
# 检查数据的维度
if centered_data.shape[0] <= 1:
raise ValueError("Insufficient data for PCA. Check your dataset.")
# 计算协方差矩阵
cov_matrix = np.cov(centered_data, rowvar=False)
# 计算特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eigh(cov_matrix)
# 选择前n_components个主成分
top_eigenvectors = eigenvectors[:, -n_components:]
# 投影数据到主成分上
projected_data = np.dot(centered_data, top_eigenvectors)
return mean_face, top_eigenvectors, projected_data
3.对数据可视化
def visualize_data_2d(data, title="2D Projection"):
plt.scatter(data[:, 0], data[:, 1], marker='o', alpha=0.5)
plt.title(title)
plt.xlabel("Principal Component 1")
plt.ylabel("Principal Component 2")
plt.show()
def visualize_data_3d(data, title="3D Projection"):
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(data[:, 0], data[:, 1], data[:, 2], marker='o', alpha=0.5)
ax.set_title(title)
ax.set_xlabel("Principal Component 1")
ax.set_ylabel("Principal Component 2")
ax.set_zlabel("Principal Component 3")
plt.show()
4.主函数
def main():
# 设置人脸数据集的路径
dataset_path = 'D:/University/Junior year/Machine learning/PCA/Face/ORL_Faces'
# 加载图像数据
data = load_images(dataset_path)
# 选择的主成分数量
n_components = 3
# 进行PCA降维
_, _, projected_data = pca(data, n_components)
# 可视化降维后的数据
if n_components == 2:
visualize_data_2d(projected_data)
elif n_components == 3:
visualize_data_3d(projected_data)
if __name__ == "__main__":
main()
5.可视化结果
主成分是3

主成分为2
五、参阅
【数据处理方法】主成分分析(PCA)原理分析_主成分分析原理-CSDN博客
机器学习——主成分分析法(PCA)概念公式及应用python实现_主成分分析(pca)在手写数字识别中的应用-CSDN博客
1万+

被折叠的 条评论
为什么被折叠?



