8.1PCA概述
PCA(Principal Component Analysis) 是一种常见的数据分析方式,常用于高维数据的降维,可用于提取数据的主要特征分量。
PCA 的数学推导可以从最大可分型和最大重构性两方面进行,前者的优化条件为划分后方差最大,后者的优化条件为点到划分平面距离最小。
8.1.1PCA原理
PCA的主要思想是将n维特征映射到k维上,这k维是全新的正交特征也被称为主成分,是在原有n维特征的基础上重新构造出来的k维特征。
先假设用数据的两个特征画出散点图:
只保留特征一和特征二其中一个
通过上面对两个特征的映射结果可以发现保留特征1(右面)比较好,因为保留特征1,当把所有的点映射到x轴上以后,点和点之间的距离相对较大,也就是说,拥有更高的可区分度,同时还保留着部分映射之前的空间信息。
那么如果把点都映射到y轴上,发现点与点距离更近了,这不符合数据原来的空间分布。所以保留特征1相比保留特征2更加合适,但是这是最好的方案吗?
将所有的点都映射到一根拟合的斜线上,从二维降到一维,整体和原样本的分布并没有多大的差距,点和点之间的距离更大了,区分度也更加明显。
通过方差定义样本间的距离
8.1.2协方差矩阵
标准化后的数据用于计算协方差矩阵。协方差矩阵反映了数据集中各特征之间的线性关系。对于一个具有 ( n ) 个变量的样本集,协方差矩阵是一个 ( n \times n ) 的矩阵,其中每个元素表示两个变量之间的协方差。
在统计学中,方差是用来度量单个随机变量的离散程度,而协方差则一般用来刻画两个随机变量的相似程度
协方差:
详细为:
假设我们只有 a 和 b 两个变量,那么我们将它们按行组成矩阵 X:
然后
我们可以看到这个矩阵对角线上的分别是两个变量的方差,而其它元素是 a 和 b 的协方差。两者被统一到了一个矩阵里。
8.1.3特征维度约减
特征约减的目的是将高维特征向量映射到低维子空间中
给定n个样本(每个样本维度为p维)
通过特征变换/投影矩阵实现特征空间的压缩:
大多数机器学习算法在高维空间中表现不够鲁棒,查询速度与精度随着维度增加而降低.有价值的维度往往很少
8.2实现——PCA实现噪音过滤
降维的目的之一就是希望抛弃掉对模型带来负面影响的特征,而我们相信,带有效信息的特征的方差应该是远大于噪音的,所以相比噪音,有效的特征所带的信息应该不会在PCA过程中被大量抛弃。
inverse_transform能够在不恢复原始数据的情况下,将降维后的数据返回到原本的高维空间,即是说能够实现”保证维度,但去掉方差很小特征所带的信息“。利用inverse_transform的这个性质,我们能够实现噪音过滤
8.2.1数据集介绍
8.2.2代码实现
from sklearn.datasets import load_digits
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
import numpy as np
导入所需要的包
digits = load_digits()
获取数据集,手动添加噪声点
def plot_digits(data) :
"""
画手写数字的图
:param data: data.shape 必须为 (m,64),m表示手写数字图的个数
"""
fig , axes = plt.subplots(4,10
, figsize=(10,4)
, subplot_kw={"xticks" : [] , "yticks" : []}
)
for i , ax in enumerate(axes.flat) :
ax.imshow(data[i].reshape(8,8) , cmap="binary")
plt.show()
是画出手写数字的图像
x = digits.data
plot_digits(x)
画出未添加噪音的原始数据集
rng = np.random.RandomState(42) #规定np中的随机模式
#从原数据集digits.data中随机抽取的,符合正态分布的数据集,返回的noisy即为加了噪声后的数据集,第二个参数为方差的大小
noisy = rng.normal(digits.data , 2)
plot_digits(noisy)
从原始数据集 digits.data
中随机抽取符合正态分布的噪声数据集,并调用 plot_digits
函数将加了噪声后的手写数字图像显示出来
pca = PCA(n_components=0.5 , svd_solver="full")
x_new = pca.fit_transform(noisy) #x_new.shape:(1797,6)原本64个特征,若只需要保留一半的信息量的话,只需要生成6个新特征就好了,就把维度从64降到了6
对带有噪声的手写数字数据进行降维处理,以保留原始数据中一半的信息量。
without_noisy = pca.inverse_transform(x_new)
plot_digits(without_noisy)
将降维后的数据再映射回原始高维特征空间,并且展示了去除噪音后的手写数字图像。
8.2.3运行结果
8.3总结
8.3.1PCA优点
- 降维效果显著: PCA通过找到数据中方差最大的方向,能够在保留大部分信息的同时实现数据的降维,去除冗余信息,提高了计算效率。
- 去相关性: PCA通过选择特征值较大的特征向量,实现了数据的去相关性,新的特征之间尽可能地不相关,有助于减少多重共线性对模型的影响。
- 可解释性: PCA的结果是一组相互正交的主成分,这些主成分能够更好地反映数据的主要结构,具有较好的可解释性。
- 适用性广泛: PCA不仅可以用于降维,还可以用于特征提取、数据可视化等多个领域,是一种通用的数据分析工具。
8.3.2PCA缺点
- 线性关系假设: PCA基于线性变换,假设数据是线性相关的。对于非线性关系较强的数据,PCA可能不够有效,需要使用非线性降维方法。
- 计算复杂度: 在计算协方差矩阵和特征值分解时,PCA的计算复杂度较高,特别是对于大规模数据集。近年来有一些基于随机采样的PCA方法用于加速计算。
- 特征值分解有局限性,比如变换的矩阵必须是方阵。
- 在非高斯分布情况下,PCA方法得出的主元可能并不是最优的。
- 如果用户对观测对象有一定的先验知识,掌握了数据的一些特征,却无法通过参数化等方法对处理过程进行干预,可能会得不到预期的效果,效率也不高。
8.3.3PCA算法功能
- 降维:PCA可以将高维数据集降到更低的维度,减少数据存储和处理的开销。
- 压缩:PCA可以将数据集表示为比原始数据集更紧凑的形式,可以用于数据压缩。
- 特征提取:PCA可以从原始数据集中提取最重要的特征,这些特征可以用于构建更好的 模型。
- 去噪:PCA可以帮助我们去除噪声,并且使数据集更具可分性。