机器学习算法——主成分分析(PCA)

一、主成分分析介绍

        1、主成分分析概念:

         主成分分析(Principal Component Analysis, PCA)是一种常用的数据降维方法,它可以将高维数据转化为低维数据,同时尽量保留原有数据的信息。

        2、主成分分析原理:

        主成分分析是利用降维的思想,在损失很少信息的前提下把多个指标转化为几个综合指标的多元统计方法。通常把转化生成的综合指标称之为主成分,其中每个主成分都是原始变量的线性组合,且各个主成分之间互不相关,这就使得主成分比原始变量具有某些更优越的性能。这样在研究复杂问题时就可以只考虑少数几个主成分而不至于损失太多信息,从而更容易抓住主要矛盾,揭示事物内部变量之间的规律性,同时使问题得到简化,提高分析效率。

        3、主成分分析步骤:

       在主成分分析中,首先需要对原始数据进行标准化处理,然后计算出数据的协方差矩阵。接着,通过对协方差矩阵进行特征值分解,可以得到其特征值和特征向量。特征向量表示了数据在不同方向上的变化程度,而特征值则表示了每个方向上的变化程度的大小。在保留数据所包含信息的前提下,我们可以选择保留最大的特征值所对应的特征向量,这些特征向量组成的新的坐标系就称为主成分。我们可以利用主成分来描述原始数据,将其投影到主成分上,从而实现数据的降维。

        4、主成分分析基本思路:

  • 通过协方差分析,建立高维空间到低维空间的线性映射/矩阵
  • 保留尽可能多的样本信息
  • 压缩后的数据对分类、聚类尽量不产生影响,甚至有所提升

二、主成分分析算法代数推导

        现在我们假设给定n个样本(每个样本维度为p维):

        定义z_{1j}为样本x_{j}在第一主成分/主方向a_{1}上的投影:

        

        其中:

        我们的目标是找到a_{1}, 使z_{1}的方差最大

        首先我们先根据z_{1}的方差定义,推导得出:

        

        其中:

        可以看出,S是维度之间的协方差矩阵,是样本均值;

        在实际计算中,可以先将样本减去均值使得 \overline{x}=0

        根据样本组成的矩阵

        有协方差矩阵

        接下来我们再回到我们的目标当中:

        目标是找到主方向a_{1} ,使得z_{1}的方差 a_{1}^{T}Sa_{1}最大化,且满足a_{1}^{T}a_{1}=1

        令 \lambda为一个 Lagrange 乘子,则有:

        

        得出a_{1}是协方差矩阵 S 的特征向量。可验证a_{1}对应的特征 值,是S的最大特征值;

        在a_{1}的基础上,要计算下一个主成分a_{2},使得z_{2}方差最大化,则有:

        

        且有:a_{2}^{T}a_{2}=1

        根据协方差定义,有:

        分别令 \lambda\phi 为 Lagrange 乘子,问题变成最大化:

                

        实际上可以求证a_{2}也是协方差矩阵 S 的特征向量,且a_{2}S的第二大的特征向量。

        以此类推, 可以验证:

  • 协方差矩阵S的第k大特征向量对应数据的第k主成分 
  • 第k大特征向量对应的特征值,为投影到该主成分的方差

三、主成分分析算法实现

        1、主成分分析算法流程:

  • 计算数据集\left \{ x_{i}\right \}的均值\bar{x}
  • 计算协方差矩阵
  • 计算S的特征向量:\left \{ a_{i} \right \}^{_{i=1}^{p}}
  • 根据特定准则(如压缩到d维,或保留特定能量比例)选择d个特征向量\left \{ a_{i} \right \}^{_{i=1}^{d}},并组成变换矩阵:

        2、主成分分析实现:

        在本次实验中,我们计划将200个人的人脸照片,通过pca降维成二维向量并散点显示

        导入所需要的库:

import os
import cv2
import numpy as np
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt

        读取图片:

def read_images(directory):
    images = []
    for filename in os.listdir(directory):
        if filename.endswith(".tif"):
            img = cv2.imread(os.path.join(directory, filename), cv2.IMREAD_GRAYSCALE)
            img = cv2.resize(img, (64, 64))  # 调整图像大小为64x64
            img_vector = img.flatten()  # 将图像拉平为一维向量
            images.append(img_vector)
    return np.array(images)
feature_vectors = []
for i in range(1, 201):
    directory = f"Face/FERET_Face/FERET-{str(i).zfill(3)}"
    images = read_images(directory)
    feature_vectors.extend(images)
feature_vectors = np.array(feature_vectors)

        pca降维:

pca = PCA(n_components=2)  # 设置降维后的维度为2
reduced_feature_vectors = pca.fit_transform(feature_vectors)

        可视化:

plt.scatter(reduced_feature_vectors[:, 0], reduced_feature_vectors[:, 1])
plt.xlabel("Principal Component 1")
plt.ylabel("Principal Component 2")
plt.title("Visualization of Face Images")
plt.show()

        运行结果:

        3、实验小结:

        主成分分析(PCA)是一种常用的机器学习算法,用于数据降维和特征提取。它的目的是将高维数据集映射到低维空间,同时最大程度地保留原始数据中的信息。因此,PCA可以用来减少数据维度、去除噪声、发现数据中的模式和结构等。

        在PCA中,第一步是计算数据的协方差矩阵,然后通过对协方差矩阵进行特征值分解,得到特征值和特征向量。然后,将特征向量按特征值大小排序,选取前面几个特征向量作为新的主成分,并将原始数据投影到这些主成分上,得到降维后的数据。

        PCA在图像处理和人脸识别等领域有广泛的应用。在人脸识别中,我们可以将人脸图像转化为灰度图像,并将其展平成一个一维向量。然后将多张人脸图像的向量进行PCA降维操作,以得到新的主成分。在测试时,将待识别的人脸图像也转化为向量,并将其投影到新的主成分上。最后,计算输入图像与训练数据的欧氏距离,找到距离最小的图像,即为匹配的人脸。

        总之,PCA是一种重要的机器学习算法,它可以用于数据降维、特征提取和图像处理等领域。熟练掌握PCA算法,对于理解和应用机器学习具有重要的意义。

  • 17
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿K还阔以

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值