(sklearn学习笔记)降维算法PCA与SVD的原理及用法

听了菜菜讲的机器学习PCA及SVD所写

  • 什么是维度?
  • 什么是“降维”?
  • 为什么要“降维”?
  • PCA基本原理
  • sklearn中用于降维的类PCA
    • 参数解释
      • n_components
      • copy
      • whiten
      • svd_solver
        • 不同值的适用条件
        • PCA中的SVD
      • tol
      • iterated_power
      • random_state
    • PCA属性
      • components_
        • 应用
        • PCA与特征选择的区别:
      • explained_variance_
      • explained_variance_ratio_
      • singular_values_
      • mean_
      • n_components_
      • noise_variance_
    • PCA接口
      • fit
      • transform
      • fit_transform
      • inverse_transform
      • score
      • score_samples
      • get_convariance
      • get_precision
      • get_params
      • set_params
  • 内容总结

什么是维度?

  • 对于数组或Series来说,维度是属性shape返回的结果,返回了几个数字,该数组或Series就是几维的;
  • 对于一张表而言,数组中的每一张表都是一个特征矩阵,维度指的是样本的数量或特征的数量,一般均指特征的数量;
  • 对于图像来说,维度就是图像中特征向量的个数;
    eg.一条特征向量 一维
    一条相互垂直特征向量 二维
    三条相互垂直的特征向量 三维

    (更高维肉眼看不到)

什么是“降维”?

降维就是降低特征矩阵中特征的数量(一般指列),并且还能保留原数据的大量有效信息。
降维的实质就是将数据从一个空间转化到另一个更简单的空间中。

为什么要“降维”?

  • 让算法运算得更快,效果更好

  • 数据可视化的需要

    eg.我们如果能把一个维数大于3的特征矩阵的特征数量讲到3及以下的话,我们就可以画出一维,二维或者是三维图来直观清晰地展现出这些数据的特征,更高维是画不出来的。

PCA基本原理

  • 降维的过程中,一部分数据被删除,意味着信息量的减少,同时模型可能会受影响。
  • 高维数据中,有一些特征不携带信息量(比如说一列全为0)或者是携带的信息量很少,还有一些特征之间的有一些相关性甚至相关性很强,因此使用全部数据的话一会增加计算机的负担,使得计算机计算起来很慢,二是会重复利用一些信息,模型建立的过程中出现多重共线性的问题。
  • 由方差过滤的内容得出:如果一个特征的方差很小,则意味着这个特征上很可能有大量取值都相同(比如90%都是1,只有10%是0,甚至100%是1),那这一个特征的取值对样本而言就没有区分度,这种特征就不带有有效信息。
  • PCA中使用的信息衡量标准是:样本方差,一个特征的(样本)方差越大,说明其所携带信息量就越大。
    注:(方差公式)
    注:为什么要除以n-1,是为了样本方差S^2=()是总体方差D(x)的无偏估计。

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_components

可以填入:

  • 整数k,降维后保留的特征数量为k个;
  • [0,1]之间的浮点数k,后面同时使用svd_solver=‘full’,让降维后特征的总方差的信息含量的比例≥k;
  • None,保留特征值的数量为min(x.shape)-1;
  • 字符串"mle",后面同时使用svd_solver=‘full’,使用极大似然估计法计算并为n_components自动填充要保留的特征数量;如果svd_solver=‘auto’,也默认是svd_solver=‘full’;
  • 若不使用这个参数,则将特征数量降至min(x.shape)个,x是特征矩阵。

copy

  • 布尔值,默认为True;
  • 若copy=False,则传递给fit的数据会被覆盖,且fit(x).transform(x)不会产生预期结果,改用fit_transform(x)。

whiten

  • 布尔值,默认为False
  • 控制输入PCA矩阵的白化(白化是数据预处理的一种,目的是去掉特征之间的相关性,并将所有特征的方差都归一化)
  • 当为True时,components_(奇异值分解出来的矩阵V)中的向量会被乘以样本数量的平方根再除以奇异值(奇异矩阵上的对角线元素),以确保特征向量之间不相关并且每个特征都有单位方差。
  • 白化将从变换后的信号中删除一些信息,(比如特征之间的相对方差量纲),有时可以通过是数据遵循一些硬连线假设来提高下游估计器的预测精度。

svd_solver

控制svd奇异值分解的分解模式,可输入字符串:

  • “auto”,默认,基于n_components的默认策略来选择分解器:若输入矩阵的尺寸大于500×500,且要提取的特征数量小于min(x.shape)的80%,就启用效率更高的“随机化”方法,否则就会进行精确的svd计算,截断在矩阵被分解完成后有选择地发生
  • “full”,运行精确完整的svd,从scipy.linalg.svd中调用标准LAPACK分解器,通过后处理选择特征,完整svd的结构是:U(m,m),S(m,n),V(n,n)
  • “arpack”,从scipy.linalg.svd中调用标准LAPACK分解来运行截断奇异值分解,再分解时将特征数量降到n_components中的数,n_components的取值在[0,min(x.shape)]之间;截断后的svd分解结构为:U(m,n_components),S(n_components,n_components),V(n,n)
  • “randomized”,随机法,分解器生成多个随机向量,然后一一检测是否符合所要寻找的新特征向量的条件,若符合,保留该随机向量并基于这个向量构建后续的特征空间;该方法已被Halko等人证明有效。

不同值的适用条件

  • “auto”:--------------------------------------
  • “full”:适合数据量比较适中,计算时
    间充足的情况
  • “arpack”:可以加快运算速度,适合特征矩阵很大的时候,但一般用于特征矩阵为稀疏矩阵的情况,此过程包含一定的随机性
  • “randomized”:比"full"模式下计算快很多,并且还能够保证模型运行效果。适合特征矩阵巨大,计算量庞大的情况。

PCA中的SVD

  • PCA中的SVD体现在参数svd_solver中;

  • 不计算协方差矩阵,直接找出一个新特征向量组成的n维空间,即矩阵V(转置),且右奇异矩阵V(转置)有着如下性质:x_dr=x*V(转置)[:,k],可用于从原始空间向新特征空间的映射;

  • 虽然SVD的矩阵分解过程比PCA快,但是SVD的信息衡量指标比较复杂,不如使用“可解释性方法”来得容易,因此sklearn中的PCA类将降维过程拆成了两部分:1.计算奇异值矩阵V(转置),使用SVD;2.数据映射及求新特征矩阵,使用PCA;减少了计算量,且评估衡量标准仍然是方差。
    (sklearn学习笔记)降维算法PCA与SVD的原理及用法_第1张图片

  • U和Σ在fit后就被舍弃,V在求出V[:,k]后也被舍弃,V[:,k]会被保留在components_中,可调用查看。

tol

  • 浮点数(≥0),默认为.0
  • svd_solver="arpack"时,计算器奇异值所需要的容差。

iterated_power

  • 整数(≥0)/“auto”(默认)
  • svd_solver="randomized"时,计算器的幂方法的迭代次数。

random_state

svd_solver="randomized"或"arpack"时才有效。
可输入:

  • 整数,random_state是由随机数生成器生成的随机数种子;
  • RandomState实例,random_state是一个随机数生成器;
  • None(默认),随机数生成器是np.random模块中的一个RandomState实例。

PCA属性

components_

  • 数组,结构为(n_components,n_features)即V(k,n),是新特征向量构成的特征空间;
  • 新特征空间中特征向量的方向,按explained_variance_的大小排序;
  • 当V(k,n)表现为一堆数字时,很难看出新特征空间和原特征空间之间的联系和区别;如果能把它转化为图像就清晰多了,我们可以将两张图片进行对比,看出它在原特征空间中提取除了什么重要信息。

应用

人脸识别等…

PCA与特征选择的区别:

  • 特征选择后,特征矩阵可解读,特征标签不变;
  • PCA使用后,特征矩阵不可解读,因为新生成的特征是原特征的一个组合,特征标签未知。(因此,建模时如果使用了PCA,降维后必须对新特征进行解释,否则PCA使用是失败的)

explained_variance_

  • 数组,结构为(n_components,)
  • 所保留特征的可解释性方差
  • 等于协方差矩阵前n_components个最大的特征值(=可解释性方差)
pca.explained_variance_

explained_variance_ratio_

  • 数组,结构为(n_components,)
  • 等于协方差矩阵前n_components个最大的特征值所占的百分比,比率综合为1
pca.explained_variance_ratio_

singular_values_

  • 数组,结构为(n_components,)
  • 返回每个所选特征的奇异值(等于低维空间中 n_components的2范式)

mean_

  • 数组,结构为(n_features,)
  • 从训练集中估计每个特征的均值,在数值上等于x.mean(axis=0)

n_components_

返回估计后的特征数量,整数

  • 若n_components被设置为额"mle"或是[0,1]之间的数字,则会返回降维估计后的特征个数;
  • 若n_components是一个整数,则会返回n_components;
  • 若n_components设置为None,则会返回min(x.shape);

noise_variance_

  • 浮点数,根据Probabilistic PCA模型估计的噪声协方差,等于特征矩阵协方差的(min(x.shape)-n_components)的最小特征值的平均值。

PCA接口

fit

  • 使用特征矩阵X拟合模型
  • 返回:拟合好的模型
pca = PCA(n_components=...) #实例化
pca = pca.fit(X) #拟合模型

transform

  • 将降维运用到特征矩阵X
  • 返回:降维后的特征矩阵
X_dr = pca.transform(X)

fit_transform

  • 相当于是fit和transform的合操作,前面提到:如果若PCA参数copy=False,则传递给fit的数据会被覆盖,fit(x).transform(x)不会产生预期结果,必须改用fit_transform(x)。
  • 返回:降维后的特征矩阵
pca = PCA(n_components=...)
X_dr = pca.fit_transform(X)

inverse_transform

  • 将降维后的特征空间转化为原特征空间,因为降维过程中会舍去一部分数据,所以并不能完全地转化为原特征空间,即降维过程不可逆。
  • 返回:原始空间的矩阵,与原始特征矩阵结构相同但数据不同
X_inverse = pca.inverse_transform(X_dr)

score

  • 返回:所有样本的平均对数似然

score_samples

  • 返回:每个样本的对数似然

get_convariance

  • 在生成的模型上计算数据的协方差矩阵
  • 返回:数据的协方差

get_precision

  • 在生成的模型上计算数据的精度矩阵
  • 返回:估计数据的精确度,等于协方差的倒数,用矩阵求逆引理来提升计算效率

get_params

  • 获取次评估器的参数
  • 返回:模型的参数

set_params

  • 在建立好的模型上,重新设置此评估器的参数
  • 返回:用新参数组合重新实例化合训练的模型

内容总结

(sklearn学习笔记)降维算法PCA与SVD的原理及用法_第2张图片

你可能感兴趣的:(python机器学习)