赞
踩
PCA(主成分分析)是一种常用的数据降维技术,用于将高维数据集转换为低维表示,同时保留原始数据中最重要的变化信息。PCA(主成分分析)的目标是通过线性变换将原始数据投影到一个新的坐标系中,使得投影后的数据在各个维度上具有最大的方差。这样做的好处是,可以减少数据的冗余信息,并捕捉到数据中最显著的结构和模式。
PCA(主成分分析)基本思路是:通过协方差分析,建立高维空间到低维空间的线性映射/矩阵;保留尽可能多的样本信息;压缩后的数据对分类、聚类尽量不产生影响,甚至有所提升。将原始高维向量通过投影矩阵,投射到低维空间,这些向量称为主成分(PCs),具有无关性、正交的特点。重要的是这些向量的数量要远小于高维空间的维度。
在执行PCA算法时,我们一般要进行以下计算流程:
准备数据集:我们将多张人脸图片汇总到一个名为face的文件夹中,直接将其放在桌面上,以方便供我们使用。
读取数据:我们定义load_dataset()函数用于读取人脸数据集。它接收数据集路径和图像大小作为输入,并返回包含图像数据、标签和标签名称字典的NumPy数组。因为我们数据集中的照片命名格式为人名+数字的格式,所以我们在进行读取名字作为标签的时候要将数字去掉。另外,数据集中的照片尺寸大小不一,我们需要调整图像大小否则会报错。
- # 读取人脸数据集
- def load_dataset(dataset_path, image_size):
- X = []
- y = []
- label_name_dict = {}
- label = 0
- for root, dirs, files in os.walk(dataset_path):
- for file in files:
- if file.endswith(".jpg"):
- # 获取人名(去除数字)
- name = re.sub(r'\d+', '', file.split(".")[0])
- if name not in label_name_dict:
- label_name_dict[name] = label
- label += 1
- label = label_name_dict[name]
-
- image_path = os.path.join(root, file)
- image = Image.open(image_path).convert('L') # 以灰度图像方式读取
- image = image.resize(image_size) # 调整图像大小
- image_array = np.array(image)
- X.append(image_array.flatten()) # 将图像展平成一维向量
- y.append(label)
- return np.array(X), np.array(y), label_name_dict
-
- # 图像大小
- image_size = (64, 64)
-
- # 加载人脸数据集
- 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。
- # 计算数据集的平均值
- mean_face = np.mean(X, axis=0)
-
- # 对每个样本都减去平均值
- X_centered = X - mean_face
-
- # 计算协方差矩阵
- cov_matrix = np.cov(X_centered.T)
-
- # 计算协方差矩阵的特征值和特征向量
- eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)
-
- # 将特征向量按照特征值从大到小排序
- sorted_indices = np.argsort(eigenvalues)[::-1]
- eigenvalues = eigenvalues[sorted_indices]
- eigenvectors = eigenvectors[:,sorted_indices]
-
- # 选择前2个主成分
- k = 2
- pca_matrix = eigenvectors[:,:k]
-
- # 将数据集投影到主成分上
- X_pca = np.dot(X_centered, pca_matrix)
绘制散点图:代码使用Matplotlib绘制散点图,其中每个标签的数据点以蓝色表示。散点图的x轴和y轴分别表示第一主成分和第二主成分
- # 绘制散点图
- plt.figure(figsize=(8, 6))
- for name, label in label_name_dict.items():
- plt.scatter(X_pca[y == label, 0], X_pca[y == label, 1], label=name, color='blue')
- plt.xlabel("Principal Component 1")
- plt.ylabel("Principal Component 2")
- plt.title("PCA")
- plt.legend()
- plt.show()
- import os
- import re
- import numpy as np
- import matplotlib.pyplot as plt
- from PIL import Image
-
- # 读取人脸数据集
- def load_dataset(dataset_path, image_size):
- X = []
- y = []
- label_name_dict = {}
- label = 0
- for root, dirs, files in os.walk(dataset_path):
- for file in files:
- if file.endswith(".jpg"):
- # 获取人名(去除数字)
- name = re.sub(r'\d+', '', file.split(".")[0])
- if name not in label_name_dict:
- label_name_dict[name] = label
- label += 1
- label = label_name_dict[name]
-
- image_path = os.path.join(root, file)
- image = Image.open(image_path).convert('L') # 以灰度图像方式读取
- image = image.resize(image_size) # 调整图像大小
- image_array = np.array(image)
- X.append(image_array.flatten()) # 将图像展平成一维向量
- y.append(label)
- return np.array(X), np.array(y), label_name_dict
-
- # 图像大小
- image_size = (64, 64)
-
- # 加载人脸数据集
- X, y, label_name_dict = load_dataset("C:\\Users\\86188\\Desktop\\face", image_size)
-
- # 计算数据集的平均值
- mean_face = np.mean(X, axis=0)
-
- # 对每个样本都减去平均值
- X_centered = X - mean_face
-
- # 计算协方差矩阵
- cov_matrix = np.cov(X_centered.T)
-
- # 计算协方差矩阵的特征值和特征向量
- eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)
-
- # 将特征向量按照特征值从大到小排序
- sorted_indices = np.argsort(eigenvalues)[::-1]
- eigenvalues = eigenvalues[sorted_indices]
- eigenvectors = eigenvectors[:,sorted_indices]
-
- # 选择前2个主成分
- k = 2
- pca_matrix = eigenvectors[:,:k]
-
- # 将数据集投影到主成分上
- X_pca = np.dot(X_centered, pca_matrix)
-
- # 绘制散点图
- plt.figure(figsize=(8, 6))
- for name, label in label_name_dict.items():
- plt.scatter(X_pca[y == label, 0], X_pca[y == label, 1], label=name, color='blue')
- plt.xlabel("Principal Component 1")
- plt.ylabel("Principal Component 2")
- plt.title("PCA")
- plt.legend()
- plt.show()
主成分分析(PCA)是一种常用的数据降维和特征提取方法,用于从高维数据中提取最重要的特征。在实现PCA的过程中,我们需要先对数据进行标准化,使得每个特征具有相同的尺度;对标准化后的数据计算协方差矩阵,该矩阵反映了数据中各个特征之间的相关性;对协方差矩阵进行特征值分解,得到特征值和对应的特征向量。特征向量表示了数据中的主要方向,而特征值表示了数据在每个主要方向上的方差;按照特征值的大小对特征向量进行排序,通常选择前k个特征值较大的特征向量作为主成分;选取前k个特征向量构成的矩阵作为主成分,这些主成分对应了数据中的最重要的特征;将原始数据投影到选定的主成分上,得到降维后的数据。PCA的优点有可以去除冗余信息,减少数据的维度,提高计算效率;发现数据中的主要特征,帮助理解数据和挖掘潜在模式;减少噪音的影响,提高后续机器学习算法的性能等。其广泛应用于数据压缩、数据可视化、特征提取和模式识别等领域。它是一种简单而有效的降维技术,可以通过保留数据中最重要的信息来提高算法的表现。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。