机器学习实战 第十三章 PCA

1.PCA算法概述

假设我们有一个二维数据集,其中包含5个样本点(n=5)。数据集可以表示为一个2x5的矩阵,如下所示

X = [[2, 4, 5, 8, 10],
     [3, 5, 1, 6, 7]]

首先,计算每个维度的均值:

mean_x1 = (2 + 4 + 5 + 8 + 10) / 5 = 5.8
mean_x2 = (3 + 5 + 1 + 6 + 7) / 5 = 4.4

然后,将每个维度减去其均值,得到中心化的数据集:

X_centered = [[-3.8, -1.8, -0.8, 2.2, 4.2],
              [-1.4, 0.6, -3.4, 1.6, 2.6]]

接下来,计算协方差矩阵,计算得到的协方差矩阵为:

cov_matrix = [[8.3, 2.2],
              [2.2, 4.7]]

然后,计算协方差矩阵的特征值和特征向量:

eigenvalues = [9.31523652, 3.68476348]
eigenvectors = [[0.92387953, -0.38268343],
                [0.38268343, 0.92387953]]

选择最大的1个特征值及对应的特征向量,也就是降到一维,得到降维后的数据集:

[[-3.93616629 -1.16138197 -2.55716464  2.71828177  4.93643112]]

降维后的数据集是一个1维数组,这就是经过PCA降维后的结果。由于PCA是基于数据的协方差矩阵计算的,每次运行结果可能会略有不同,但整体的结果都比较接近。其中在PCA中,特征向量是协方差矩阵的特征向量,而协方差矩阵描述了数据在各个特征上的方差和相关性。每个特征向量都对应着一个特征值,特征值表示了数据在该特征向量方向上的方差大小

2.降维技术

一般情况下,我们需要处理的数据都是有多个特征的,也就是多维的数据,而对于数量大维数多的数据我们会遇到很多问题,比如数据难以使用、算法开销大、噪声多、结果复杂难懂等,而为了解决上述的问题,我们就通过数据降维的方式进行处理,主要方法有以下三种:

  1. 主成分分析(Principal Component Analysis,PCA):其目标是将原始高维数据转换为低维空间,以便更好地展现数据的内在结构。PCA通过找到数据中最重要的方向(主成分),来解释数据的最大方差。第一个主成分是数据方差最大的方向,第二个主成分是与第一个主成分正交且方差次大的方向,以此类推。通过保留前k个主成分,可以将数据投影到k维空间中,实现数据的降维
  2. 因子分析(Factor Analysis):用于理解观测变量背后的潜在因子结构。它通过将多个观测变量解释为较少数量的潜在因子来简化数据分析,找到潜在因子和它们与观测变量之间的关系。这种方法常用于数据降维、特征提取和探索隐藏结构的应用领域
  3. 独立成分分析(Independent Component Analysis,ICA):一种用于盲源分离的统计方法。盲源分离是指从混合数据中恢复原始独立数据源,而在混合数据和原始数据源之间没有先验知识。ICA 假设混合数据是原始数据源的线性组合,而且原始数据源是相互独立的

本章主要说明PCA技术

3.PCA

算法原理

用一个更好概念解释PCA就是"移动坐标轴",用于说明特征向量是如何用于转换数据并进行降维。"移动坐标轴"的含义是,我们通过旋转原始坐标系,使得新的坐标轴(特征向量)与数据的主要方差方向对齐。这就意味着新的坐标轴更好地表示了数据的方差分布,因此我们可以用较少的主成分(较低维度)来描述数据,从而实现降维

通过移动坐标轴,PCA将原始数据转换为新的坐标系,其中第一个主成分描述了数据中最大的方差方向,第二个主成分描述了次大的方差方向,以此类推。这样,我们就可以保留大部分数据的方差信息,而忽略掉方差较小的方向,实现数据的降维处理

请添加图片描述

算法实现

根据示例我们可以知道PCA算法的基本流程:

  1. 数据预处理:确保数据已经进行了标准化,使得每个特征的均值为0,方差为1。这样可以避免在PCA过程中受到特征尺度的影响
  2. 计算协方差矩阵:对于具有n个样本和m个特征的数据集,计算m×m的协方差矩阵。协方差矩阵的元素(i, j)表示第i个特征与第j个特征之间的协方差
  3. 计算特征值与特征向量:对协方差矩阵进行特征值分解,得到m个特征值和对应的m个特征向量
  4. 选择主成分:将特征值按照从大到小的顺序排序。选择要保留的主成分数量k,通常是通过设置一个阈值或者根据应用需求来确定
  5. 构建投影矩阵:选择前k个特征向量作为投影矩阵的列,构建一个m×k的矩阵,其中每列是一个特征向量
  6. 进行降维:将原始的m维数据集X乘以投影矩阵,得到一个n×k的矩阵,其中每行是一个样本在k维空间中的投影,这就是降维后的数据

下面给出实现PCA算法的具体代码

def loadDataSet(fileName, delim='\t'):
    # 加载数据集并将数据转换为矩阵形式
    fr = open(fileName)
    stringArr = [line.strip().split(delim) for line in fr.readlines()]
    datArr = [list(map(float, line)) for line in stringArr]
    return np.mat(datArr)

def pca(dataMat, topNfeat=9999999):
    # PCA主成分分析函数
    meanVals = np.mean(dataMat, axis=0)  # 计算每个特征的均值
    meanRemoved = dataMat - meanVals  # 去除均值,使得数据以零为中心
    covMat = np.cov(meanRemoved, rowvar=0)  # 计算协方差矩阵
    eigVals, eigVects = np.linalg.eig(np.mat(covMat))  # 计算协方差矩阵的特征值和特征向量
    eigValInd = np.argsort(eigVals)  # 对特征值从小到大排序
    eigValInd = eigValInd[:-(topNfeat + 1):-1]  # 选择topNfeat个最大的特征值对应的索引
    redEigVects = eigVects[:, eigValInd]  # 选择对应的topNfeat个特征向量
    lowDDataMat = meanRemoved * redEigVects  # 将数据转换到新的低维空间中
    reconMat = (lowDDataMat * redEigVects.T) + meanVals  # 重构原始数据,用于可视化和误差分析
    return lowDDataMat, reconMat

loadDataSet函数用于加载数据集并将其转换为矩阵形式。数据集存储在名为fileName的文件中,数据之间使用delim参数指定的分隔符进行分割,默认为制表符(‘\t’)分割
pca是执行主成分分析(PCA)的函数。输入参数dataMat是一个数据矩阵,其中每行代表一个样本,每列代表一个特征。topNfeat是要保留的主成分数量,默认为9999999,即保留所有主成分。函数返回降维后的数据矩阵lowDDataMat和重构的数据矩阵reconMat

下图中蓝色部分是原数据,红色部分是降维后的数据
请添加图片描述

4.示例

下面利用PCA算法对半导体制造数据进行降维,数据包含许多的缺失值,可以先利用平均值替换NAN值

def replaceNanWithMean(): 
    # 将NaN值替换为对应特征的均值
    datMat = loadDataSet('secom.data', ' ')
    numFeat = np.shape(datMat)[1]
    for i in range(numFeat):
        meanVal = np.mean(datMat[np.nonzero(~np.isnan(datMat[:, i].A))[0], i])  # 计算该特征的均值(不包含NaN值)
        datMat[np.nonzero(np.isnan(datMat[:, i].A))[0], i] = meanVal  # 将该特征中的NaN值替换为均值
    return datMat

replaceNanWithMean函数用于将数据矩阵中的NaN值(缺失值)替换为对应特征的均值。它首先调用loadDataSet()加载数据集,然后遍历每个特征,在特征中找到NaN值,计算该特征的均值,并用均值替换NaN值

在数据预处理完成后再利用PCA进行降维处理,就可以得到如下特征值,可以看到有许多值都是0,这表明这些特征值都是其他特征值的副本,即可以用其他的特征值来表示,因此通过除去这些特征就可以进行数据降维

请添加图片描述

5. 总结

在一般的大数据中,我们很难直接进行有关数据的处理,除了一般的预处理方法之外,对数据进行PCA降维是非常有效的一步,通过“移动坐标轴”的可视化可以很好的理解PCA的原理,沿着数据最大方差方向旋转坐标轴,在对正交方向进行第二个坐标轴的选择,并以此类推,就能很好的理解这个算法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值