大家好,欢迎来到IT知识分享网。
一、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算法 – 知乎 (zhihu.com)
【数据处理方法】主成分分析(PCA)原理分析_主成分分析原理-CSDN博客
主成分分析(PCA)详解-CSDN博客
机器学习——主成分分析法(PCA)概念公式及应用python实现_主成分分析(pca)在手写数字识别中的应用-CSDN博客
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/129673.html