数据降维:PCA主成分分析降维示例及函数参数解释

文章目录

  • 主成分分析(PCA)介绍
  • PCA转化步骤
  • PCA示例
    • sklearn中的PCA
  • PCA优缺点
    • 优点
    • 缺点

主成分分析(PCA)介绍

PCA也被叫做卡尔胡宁-勒夫转换(KLT),是一种用户在高维空间发现模式的技术。PCA常被用于探索和可视化高纬度数据集。PCA可以压缩数据,也就是所谓的数据降维。数据降维是指在保留重要信息的同时消除那些“无用信息量的信息”。PCA关注的是线性相关性,如果一个数据矩阵的列空间的秩小于特征总数,那么多数特征就是几个关键的特征的线性组合,这些多数的特征是对空间以及计算能力的浪费,因为它们包含的信息可以从关键的特征推导出来,所以为了避免这种情况,PCA就是试图将这些数据挤压到一个维度大大小于原空间的线性子空间。
PCA的核心思想是:使用一些新的特征代替冗余特征,这些新特征能恰当地总结初始空间中包含的信息。

关于矩阵列空间以及秩可以看这篇文章
https://www.jianshu.com/p/15572fa072cf

数据降维:PCA主成分分析降维示例及函数参数解释_第1张图片
如图a,数据点均匀的分布在两个特征上,在这个例子,列空间是满秩的。而有些特征是其他特征的线性组合,如图b,特征f1可以由f2得到,它是f2和一个标量的乘积。在这里我们称点团的本征维数为1,因为一个特征可以得到另一个特征。
但是实际上,完全相关的特征是很少见的,几乎不会出现,更多的情况是像图C一样,特征之间非常接近但是又不完全相同,这时如果想要削减传递给模型的特征的数量,就得需要一个全新的特征,一个由f1和f2得到的特征,可以称之为f1.5。

PCA转化步骤

  • 数据矩阵中心化
  • 计算SVD
  • 找出主成分
  • 转化数据
    数据降维:PCA主成分分析降维示例及函数参数解释_第2张图片
    如图所示,是PCA的整个过程,它将数据线性投影到一个新的特征上,并且保持最大化数据的方差。具体的推导可以看这篇文章 PCA推导

PCA示例

import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris    # 导入数据集 

data = load_iris()
y = data.target  #  数据集为字典形式,这里将y分离出来
x = data.data
pca = PCA(n_components=2)   # 降维为2维
reduce_x = pca.fit_transform(x)

red_x,red_y = [],[]
blue_x,blue_y = [],[]
green_x,green_y = [],[]
for i in range(len(reduce_x)):
    if y[i] == 0:
        red_x.append(reduce_x[i][0])
        red_y.append(reduce_x[i][1])
    elif y[i] == 1:
        blue_x.append(reduce_x[i][0])
        blue_y.append(reduce_x[i][1])
    else:
        green_x.append(reduce_x[i][0])
        green_y.append(reduce_x[i][1])
plt.scatter(red_x,red_y,c='r',marker='*')
plt.scatter(blue_x,blue_y,c='b',marker='x')
plt.scatter(green_x,green_y,c='g',marker='.')
plt.show()

运行结果
数据降维:PCA主成分分析降维示例及函数参数解释_第3张图片
鸢尾花数据集是一个拥有50个样本,每个样本有4个解释变量的数据集,根据这4个变量推断出鸢尾花的品种,这里使用PCA将数据集的4个特征降维到两个维度,这样子就可以在二维上观察到数据,这样子可以更直观的观察到数据,方便后续的分类模型选择。

sklearn中的PCA

class sklearn.decomposition.PCA(n_components=None, copy=True, whiten=False, svd_solver=’auto’, tol=0.0, iterated_power=’auto’, random_state=None)

n_component: 指定降维后的特征数量,

  • 可以直接指定降维后特征数量。
  • 可以指定等于‘mle(极大似然估计)’,算法根据MLE算法以及特征的方差来决定维数。使用mle需要另一个参数svd_solver == ‘full’
  • 我们也可以指定主成分的方差和所占的最小比例阈值,让PCA类自己去根据样本特征方差来决定降维到的维度数,此时n_components是一个(0,1]之间的数。这个也需要svd_solver == ‘full’
  • 不输入值,此时n_components = (样本数,特征数) - 1。

copy: 是否复制原数据

whiten: 白化,白化是PCA转化乘以奇异值的倒数,白化后数据特征之间方差为1,通常不白化,除非后续有特殊处理。

svd_solver: 有四种选择{‘auto’,‘full’,‘arpack’,‘randomized’}

  • auto:默认值,PCA会自动选择合适的模式去计算
  • full:通过scipy.linalg.svd运行完全的SVD算法
  • arpack:调用scipy.sparse.linalg.svds,要求保留成分小于原始特征数,适用于数据量大,数据维度多同时主成分数目比例又较低的PCA降维
  • randomized:与arpack的适用场景类似,但它使用了一些加快SVD的随机算法。

tol: 可选{float,0}默认0,当svd_solver == ‘arpack’奇异值的公差

iterated_power: 可选{int,auto}默认auto,当svd_solver == ‘randomized’时幂方法的迭代次数

random_state: 可选{int,None},默认None,当svd_solver == ‘randomized’或svd_solver == ‘arpack’时,如果为None,随机数生成是用numpy.random生成。如果输入int数据,则生成的随机数是输入的数

通常只需要n_component这个数据。

PCA优缺点

优点

  • 减少特征空间维度,降低了数据复杂度
  • 方便模型拟合

缺点

  • 计算成本高
  • 可能会降低模型精度,因为会丢弃一些信息
  • 转换过程复杂,结果难以解释
  • 对异常值敏感

你可能感兴趣的:(分析,机器学习)