当前位置:   article > 正文

使用PCA主成分分析进行图像的降维_pca图像降维

pca图像降维

介绍

代码实现

        完整代码:

        运行结果:

总结


  • 介绍

        PCA(主成分分析)是一种常用的数据降维技术,用于将高维数据集转换为低维表示,同时保留原始数据中最重要的变化信息。PCA(主成分分析)的目标是通过线性变换将原始数据投影到一个新的坐标系中,使得投影后的数据在各个维度上具有最大的方差。这样做的好处是,可以减少数据的冗余信息,并捕捉到数据中最显著的结构和模式。

        PCA(主成分分析)基本思路是:通过协方差分析,建立高维空间到低维空间的线性映射/矩阵;保留尽可能多的样本信息;压缩后的数据对分类、聚类尽量不产生影响,甚至有所提升。将原始高维向量通过投影矩阵,投射到低维空间,这些向量称为主成分(PCs),具有无关性、正交的特点。重要的是这些向量的数量要远小于高维空间的维度。

        在执行PCA算法时,我们一般要进行以下计算流程:

  • 代码实现

        准备数据集:我们将多张人脸图片汇总到一个名为face的文件夹中,直接将其放在桌面上,以方便供我们使用。

       读取数据:我们定义load_dataset()函数用于读取人脸数据集。它接收数据集路径和图像大小作为输入,并返回包含图像数据、标签和标签名称字典的NumPy数组。因为我们数据集中的照片命名格式为人名+数字的格式,所以我们在进行读取名字作为标签的时候要将数字去掉。另外,数据集中的照片尺寸大小不一,我们需要调整图像大小否则会报错。

  1. # 读取人脸数据集
  2. def load_dataset(dataset_path, image_size):
  3. X = []
  4. y = []
  5. label_name_dict = {}
  6. label = 0
  7. for root, dirs, files in os.walk(dataset_path):
  8. for file in files:
  9. if file.endswith(".jpg"):
  10. # 获取人名(去除数字)
  11. name = re.sub(r'\d+', '', file.split(".")[0])
  12. if name not in label_name_dict:
  13. label_name_dict[name] = label
  14. label += 1
  15. label = label_name_dict[name]
  16. image_path = os.path.join(root, file)
  17. image = Image.open(image_path).convert('L') # 以灰度图像方式读取
  18. image = image.resize(image_size) # 调整图像大小
  19. image_array = np.array(image)
  20. X.append(image_array.flatten()) # 将图像展平成一维向量
  21. y.append(label)
  22. return np.array(X), np.array(y), label_name_dict
  23. # 图像大小
  24. image_size = (64, 64)
  25. # 加载人脸数据集
  26. X, y, label_name_dict = load_dataset("C:\\Users\\86188\\Desktop\\face", image_size)

        进行PCA计算:代码计算数据集的平均脸mean_face,并将每个样本减去平均脸得到居中的数据集X_centered。接着,计算居中的数据集的协方差矩阵cov_matrix,并使用np.linalg.eig()函数计算协方差矩阵的特征值eigenvalues和特征向量eigenvectors。之后,按特征值从大到小对特征向量进行排序,以便选择前2个主成分。接下来,选择前2个主成分构成的矩阵pca_matrix。最后,将居中的数据集投影到主成分上,得到降维后的数据集X_pca。

  1. # 计算数据集的平均值
  2. mean_face = np.mean(X, axis=0)
  3. # 对每个样本都减去平均值
  4. X_centered = X - mean_face
  5. # 计算协方差矩阵
  6. cov_matrix = np.cov(X_centered.T)
  7. # 计算协方差矩阵的特征值和特征向量
  8. eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)
  9. # 将特征向量按照特征值从大到小排序
  10. sorted_indices = np.argsort(eigenvalues)[::-1]
  11. eigenvalues = eigenvalues[sorted_indices]
  12. eigenvectors = eigenvectors[:,sorted_indices]
  13. # 选择前2个主成分
  14. k = 2
  15. pca_matrix = eigenvectors[:,:k]
  16. # 将数据集投影到主成分上
  17. X_pca = np.dot(X_centered, pca_matrix)

        绘制散点图:代码使用Matplotlib绘制散点图,其中每个标签的数据点以蓝色表示。散点图的x轴和y轴分别表示第一主成分和第二主成分

  1. # 绘制散点图
  2. plt.figure(figsize=(8, 6))
  3. for name, label in label_name_dict.items():
  4. plt.scatter(X_pca[y == label, 0], X_pca[y == label, 1], label=name, color='blue')
  5. plt.xlabel("Principal Component 1")
  6. plt.ylabel("Principal Component 2")
  7. plt.title("PCA")
  8. plt.legend()
  9. plt.show()
        完整代码:
  1. import os
  2. import re
  3. import numpy as np
  4. import matplotlib.pyplot as plt
  5. from PIL import Image
  6. # 读取人脸数据集
  7. def load_dataset(dataset_path, image_size):
  8. X = []
  9. y = []
  10. label_name_dict = {}
  11. label = 0
  12. for root, dirs, files in os.walk(dataset_path):
  13. for file in files:
  14. if file.endswith(".jpg"):
  15. # 获取人名(去除数字)
  16. name = re.sub(r'\d+', '', file.split(".")[0])
  17. if name not in label_name_dict:
  18. label_name_dict[name] = label
  19. label += 1
  20. label = label_name_dict[name]
  21. image_path = os.path.join(root, file)
  22. image = Image.open(image_path).convert('L') # 以灰度图像方式读取
  23. image = image.resize(image_size) # 调整图像大小
  24. image_array = np.array(image)
  25. X.append(image_array.flatten()) # 将图像展平成一维向量
  26. y.append(label)
  27. return np.array(X), np.array(y), label_name_dict
  28. # 图像大小
  29. image_size = (64, 64)
  30. # 加载人脸数据集
  31. X, y, label_name_dict = load_dataset("C:\\Users\\86188\\Desktop\\face", image_size)
  32. # 计算数据集的平均值
  33. mean_face = np.mean(X, axis=0)
  34. # 对每个样本都减去平均值
  35. X_centered = X - mean_face
  36. # 计算协方差矩阵
  37. cov_matrix = np.cov(X_centered.T)
  38. # 计算协方差矩阵的特征值和特征向量
  39. eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)
  40. # 将特征向量按照特征值从大到小排序
  41. sorted_indices = np.argsort(eigenvalues)[::-1]
  42. eigenvalues = eigenvalues[sorted_indices]
  43. eigenvectors = eigenvectors[:,sorted_indices]
  44. # 选择前2个主成分
  45. k = 2
  46. pca_matrix = eigenvectors[:,:k]
  47. # 将数据集投影到主成分上
  48. X_pca = np.dot(X_centered, pca_matrix)
  49. # 绘制散点图
  50. plt.figure(figsize=(8, 6))
  51. for name, label in label_name_dict.items():
  52. plt.scatter(X_pca[y == label, 0], X_pca[y == label, 1], label=name, color='blue')
  53. plt.xlabel("Principal Component 1")
  54. plt.ylabel("Principal Component 2")
  55. plt.title("PCA")
  56. plt.legend()
  57. plt.show()
        运行结果:

  • 总结

        主成分分析(PCA)是一种常用的数据降维和特征提取方法,用于从高维数据中提取最重要的特征。在实现PCA的过程中,我们需要先对数据进行标准化,使得每个特征具有相同的尺度;对标准化后的数据计算协方差矩阵,该矩阵反映了数据中各个特征之间的相关性;对协方差矩阵进行特征值分解,得到特征值和对应的特征向量。特征向量表示了数据中的主要方向,而特征值表示了数据在每个主要方向上的方差;按照特征值的大小对特征向量进行排序,通常选择前k个特征值较大的特征向量作为主成分;选取前k个特征向量构成的矩阵作为主成分,这些主成分对应了数据中的最重要的特征;将原始数据投影到选定的主成分上,得到降维后的数据。PCA的优点有可以去除冗余信息,减少数据的维度,提高计算效率;发现数据中的主要特征,帮助理解数据和挖掘潜在模式;减少噪音的影响,提高后续机器学习算法的性能等。其广泛应用于数据压缩、数据可视化、特征提取和模式识别等领域。它是一种简单而有效的降维技术,可以通过保留数据中最重要的信息来提高算法的表现。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/106958
推荐阅读
相关标签
  

闽ICP备14008679号