主成分分析
前言 近年来,随着互联网和信息行业的发展,数据已经渗透到各行各业,成为重要的生产因素如数据记录和属性规模的急剧增长。社会已经进入大数据时代,数据越多越好似乎已经成为公理。然而,数据量并不是越大越好,有时过犹不及,在数据分析应用中大量的数据反而会产生更坏的性能。这些海量数据可能含有噪声或冗余信息,当数据集包含过多的数据噪声时,会导致算法的性能达不到预期的效果。移除信息量较少甚至无效信息可能会帮助用户构建更具扩展性、通用性的数据模型。对这些海量数据进行挖掘与运用,也推动了数据降维的应用,大数据处理平台和并行数据分析算法也随之出现。数据降维 数据降维,一方面可以解决“维数灾难”,缓解“信息丰富、只是贫乏”的现状,降低复杂度;另一方面,可以更好地认识和理解数据。数据降维,也称为维数约简(Dimensionality Reduction),即降低数据的维数,将原始高维特征空间的点向一个低维空间投影,新的空间维度低于原特征空间,所以维数减少了。在这个过程中,特征发生了根本性的变化,原始的特征消失了(虽然新的特征保持了原特征的一些性质)。时至今日,数据降维的方法有很多。不同的角度有不同的分类。 根据数据特性分为以下几种。 线性降维 主成分分析(PCA),线性辨别分析(LDA)等。 非线性降维 核方法(核主成分分析KPCA,KFDA),二维化和张量化(常见算法有二维主分量分析、二维线性判别分析、二维典型相关分析),流形学习(ISOMap等距映射、LE拉普拉斯特征映射、LLE局部线性嵌入等)。 根据是否考虑和利用数据的监督信息分为以下几种。 无监督降维(PCA等)有监督降维(LDA等)半监督降维(半监督概率PCA、半监督判别分析SDA等) 此外,在数据处理中,经常会遇到特征维度比样本数量多得多的情况,如果直接运用模型,效果不一定好,一是因为冗余的特征会带来一些噪声,影响计算的结果;二是因为无关的特征会加大计算量,耗费时间和资源。所以通常会对数据重新变换一下,再运用模型处理。数据变换的目的不只是降维,还可以消除特征之间的相关性,并发现一些潜在的特征变量。 图像压缩 图像压缩是数据压缩技术在数字图像上的应用,它的目的是减少图像数据中的冗余信息从而用更加高效的格式存储和传输数据。数据降维的思想也可以应用到图像压缩上,图像数据之所以能被压缩,就是因为数据间存在冗余。图像数据的冗余主要表现在以下几个方面。 图像中相邻像素之间的相关性引起的空间冗余。图像序列中不同帧之间存在相关性引起的时间冗余。不同彩色平面或频谱带的相关性引起的频谱冗余。 数据压缩的目的就是通过去除这些数据冗余来减少表示数据所需的比特数。由于图像数据量庞大,在存储、传输、处理时非常困难,因此图像数据的压缩就显得非常重要。 信息时代带来了“信息爆炸”,数据量大增,因此,无论传输或存储都需要对数据进行有效的压缩。在遥感技术中,各种航天探测器采用压缩编码技术,将获取的巨大信息送回地面。 原理 主成分分析(PCA)是一种常见的数据降维方法,其目的是在“信息”损失较小的前提下,将高维的数据转换到低维。PCA的本质就是发现一些投影方向,使得数据在这些投影方向上的方差最大,而且这些投影方向彼此之间是相互正交的,即寻找新的正交基,然后计算原始数据在这些正交基上的方差。方差越大,说明在对应正交基上包含了更多的信息量。输入空间经过旋转投影后,输出集合的第一个向量包含了信号的大部分能量(即方差)。第二个向量与第一个向量正交,它包含了剩余能量的大部分;第三个向量又与前两个向量正交,并包含剩余能量的大部分,以此类推。假设在N维空间中,可以找到N个这样的相互正交的投影方向(坐标轴),取前r个去近似原先的数据空间,这样就从一个N维的空间压缩到了r维空间。那么,数据降维到什么程度呢?如何找到新的投影方向使得原始数据的“信息量”损失最少?样本的“信息量”指的就是样本在特征方向上投影的方差。方差越大,则样本在该特征上的差异就越大,因此该特征越重要。原始数据协方差矩阵的特征值越大,对应的方差越大,在对应的特征向量上投影的信息量就越大。反之,如果特征值较小,则说明数据在这些特征向量上投影的信息量很小,可以将小特征值对应方向的数据删除,从而达到了降维的目的。在原始数据很多维的情况下,先得到一个数据变换后方差最大的方向,然后选择与第一个方向正交的方向,该方向是方差次大的方向,如此下去,直到变换出与原特征个数相同的新特征或变换出前N个特征(这前N个特征包含了数据绝大部分信息),简言之,PCA是一个降维的过程,将数据映射到新的特征,新特征是原始特征的线性组合。数学推导不介绍了,看一下基本步骤。 计算平均值,所有样本减去对应平均值。计算整个样本的协方差矩阵。计算协方差的特征值和特征向量。将特征值按照从大到小的顺序排列,选择其中较大的k个,然后将其对应的k个特征向量分别作为列向量组成特征向量矩阵。将样本点投影到选取的特征向量上。 实战sklearn已经封装了PCA,具体参数名称自行查看源码使用PCA降维随机数据代码# -*-coding:utf-8-*-import matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3Dfrom sklearn.datasets.samples_generator import make_blobsfrom sklearn.decomposition import PCAX, y = make_blobs(n_samples=10000, n_features=3, centers=[[3, 3, 3], [0, 0, 0], [1, 1, 1], [2, 2, 2]],cluster_std=[0.2, 0.1, 0.2, 0.2], random_state=9)# 显示数据fig = plt.figure()ax = Axes3D(fig, rect=[0, 0, 1, 1], elev=30, azim=10)plt.scatter(X[:, 0], X[:, 1], X[:, 2], marker='o')plt.show()# 进行主成分分析pca = PCA(n_components=3)pca.fit(X)print(pca.explained_variance_ratio_)print(pca.explained_variance_)# 降维pca = PCA(n_components=2)pca.fit(X)X_new = pca.transform(X)plt.scatter(X_new[:, 0], X_new[:, 1], marker='o')plt.show()
运行效果 补充说明 参考书为《Python3数据分析与机器学习实战》,对部分错误修改具体数据集和代码见我的Github,欢迎Star或者Fork