PCA(主成分分析)

一、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

主成分为2

 

五、参阅

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

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

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

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>