PCA(主成分分析)

PCA(主成分分析)PCA 的主要思想是将 n 维特征映射到 k 维上 这 k 维是全新的正交特征也被称为主成分 是在原有 n 维特征的基础上重新构造出来的 k 维特征

大家好,欢迎来到IT知识分享网。

一、PCA的概念

        PCA(Principal Component Analysis),即主成分分析方法,是一种使用最广泛的数据降维算法。PCA的主要思想是将n维特征映射到k维上,这k维是全新的正交特征也被称为主成分,是在原有n维特征的基础上重新构造出来的k维特征。

二、怎么找到主成分方向

        通过计算数据矩阵的协方差矩阵,然后得到协方差矩阵的特征值和特征向量,选择特征值最大(即方差最大)的k个特征所对应的特征向量组成的矩阵。这样就可以将数据矩阵转换到新的空间当中,实现数据特征的降维。

 1.协方差矩阵的求解方法

1.1 特征值分解矩阵

        对于矩阵A,有一组特征向量v,将这组向量进行正交化单位化,就能得到一组正交单位向量。特征值分解,就是将矩阵A分解为如下式:

A=Q\sum Q^{-1}

        其中,Q是矩阵A的特征向量组成的矩阵,Σ则是一个对角阵,对角线上的元素就是特征值。

1.2  奇异值分解协方差矩阵

        奇异值分解是一个能适用于任意矩阵的一种分解的方法,对于任意矩阵A总是存在一个奇异值分解:

        A=U\sum V^{T}

        其中,U是一个m∗m的方阵,里面的正交向量被称为左奇异向量。∑是一个m∗n的矩阵,∑除了对角线其它元素都为0,对角线上的元素称为奇异值。VT是V的转置矩阵,是一个n∗n的矩阵,它里面的正交向量被称为右奇异值向量。

2.协方差

  样本均值:

                                        \bar{x}=\frac{1}{n}\sum_{i=1}^{N}x_{i}

样本方差:

                                        S^{2}=\frac{1}{n-1}\sum_{i=1}^{n}(x_{i}-\bar{x})^{2}

样本X和样本Y的方差:

                                                ​​​​​​​        Cov(X,Y)=E[(X-E(X))(Y-E(Y))] =\frac{1}{n-1}\sum_{i=1}^{n}(x_{i}-\bar{x})(y_{i}-\bar{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

PCA(主成分分析)

主成分为2

PCA(主成分分析) 

五、参阅

机器学习算法之PCA算法 – 知乎 (zhihu.com)

【数据处理方法】主成分分析(PCA)原理分析_主成分分析原理-CSDN博客

主成分分析(PCA)详解-CSDN博客

机器学习——主成分分析法(PCA)概念公式及应用python实现_主成分分析(pca)在手写数字识别中的应用-CSDN博客

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/129673.html

(0)
上一篇 2025-08-22 18:00
下一篇 2024-12-08 13:26

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信