主成分分析PCA与奇异值分解SVD

学习地址

课件


关于维度

对于数组和Series来说,维度就是功能shape返回的结果,shape中返回了几个数字,就是几维。对于numpy类型数据来说,可以使用numpy.ndim接口来查看维度。
数组中的每一张表,都可以是一个特征矩阵或一个DataFrame,这些结构永远只有一张表,所以一定有行列,其中行是样本,列是特征。针对每一张表,维度指的是样本的数量或特征的数量,一般无特别说明,指的都是特征的数量
对图像来说,维度就是图像中特征向量的数量

降维算法中的”降维“,指的是降低特征矩阵中特征的数量,降维的目的是为了让算法运算更快,效果更好,但其实还有另一种需求:数据可视化。三维以上特征矩阵的则不能被可视化,数据的性质也就比较难理解。

降维能够即减少特征的数量,又保留大部分有效信息——将那些带有重复信息的特征合并,并删除那些带无效信息的特征等等——逐渐创造出能够代表原特征矩阵大部分信息的,特征更少的,新特征矩阵

sklearn中的降维算法

sklearn中降维算法都被包括在模块decomposition中,这个模块本质是一个矩阵分解模块。

sklearn中的降维算法

PCA

一种重要的特征选择方法:方差过滤

  • 如果一个特征的方差很小,则意味着这个特征上很可能有大量取值都相同,那这一个特征的取值对样本而言就没有区分度,这种特征就不带有有效信息。从方差的这种应用就可以推断出,如果一个特征的方差很大,则说明这个特征上带有大量的信息。

在降维中,PCA使用的信息量衡量指标,就是样本方差,又称可解释性方差,方差越大,特征所带的信息量越多
方差
Var代表一个特征的方差,n代表样本量,xi代表一个特征中的每个样本取值,xhat代表这一列样本的均值。

面试高危问题:方差计算公式中为什么除数是n-1? 这是为了得到样本方差的无偏估计

降维过程中,几个重要的步骤

过程 二维特征矩阵 n维特征矩阵
1 输入原数据,结构为 (3,2) 找出原本的2个特征对应的直角坐标系,本质 是找出这2个特征构成的2维平面 输入原数据,结构为 (m,n) 找出原本的n个特征向量构成的n维空间
2 2 决定降维后的特征数量:1 决定降维后的特征数量:k
3 旋转,找出一个新坐标系本质是找出2个新的特征向量,以及它们构成的新2维平面新特征向量让数据能够被压缩到少数特征上,并且总信息量不损失太多 通过某种变化,找出n个新的特征向量,以及它们构成的新n维空间
4 找出数据点在新坐标系上,2个新坐标轴上的坐标 找出原始数据在新特征空间V中的n个新特征向量上对应的值,即“将数据映射到新空间中”
5 选取第1个方差最大的特征向量,删掉没有被选中的特征,成功将2维平面降为1维 选取前k个信息量最大的特征,删掉没有被选中的特征,成功将n维空间V降为k维
  • 在步骤3当中,我们用来找出n个新特征向量,让数据能够被压缩到少数特征上并且总信息量不损失太多的技术就是矩阵分解。PCA和SVD是两种不同的降维算法,但他们都遵从上面的过程来实现降维,只是两种算法中矩阵分解的方法不同,信息量的衡量指标不同罢了。PCA使用方差作为信息量的衡量指标,并且用特征值分解来找出空间V。

降维完成之后,PCA找到的每个新特征向量就叫做“主成分”,而被丢弃的特征向量被认为信息量很少,这些信息很可能就是噪音。
PCA矩阵分解
而SVD使用奇异值分解来找出空间V,其中Σ也是一个对角矩阵,不过它对角线上的元素是奇异值,这也是SVD中用来衡量特征上的信息量的指标
奇异值分解
以上两种分解一种称为特征矩阵分解,一种为奇异值分解,在线性代数与矩阵论中会有详细讲解。
其中涉及的矩阵运算无论使用任何语言都不可避免的需要庞大的计算过程,因此算法运行较缓慢。但目前它的功能暂时无法替代,依然是机器学习领域的宠儿。

特征工程中的降维和特征选择

特征工程中有三种方式:特征提取特征创造特征选择

  • 特征选择是从已存在的特征中选取携带信息最多的,选完之后的特征依然具有可解释性,我们依然知道这个特征在原数据的哪个位置,代表着原数据上的什么含义
  • 而降维算法,是将已存在的特征进行压缩,降维完毕后的特征不是原本的特征矩阵中的任何一个特征,而是通过某些方式组合起来的新特征。通常来说,在新的特征矩阵生成之前,我们无法知晓降维算法们都建立了怎样的新特征向量,新特征矩阵生成之后也不具有可读性,我们无法判断新特征矩阵的特征是从原数据中的什么特征组合而来,新特征虽然带有原始数据的信息,却已经不是原数据上代表着的含义了。降维算法因此是特征创造(feature creation,或feature construction)的一种

PCA重要参数

  • n_components
    n_components是我们降维后需要的维度,即降维后需要保留的特征数量,降维流程中第二步里需要确认的k值,一般输入[0, min(X.shape)]范围中的整数。不过,为了方便可视化,一般将数据维度降到3维以下
案例
  • 实例化

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    import numpy as np
    import pandas as pd
    from sklearn.datasets import load_iris
    from sklearn.decomposition import PCA

    iris=load_iris()
    X=iris.data
    y=iris.target
    print(X.shape,y.shape) # (150, 4) (150,)
    print(iris.target_names) # ['setosa' 'versicolor' 'virginica']
    # .target_names属性分别对应iris.target中的数字
    print(set(y)) # {0, 1, 2}
    # .target_names[i]就表示i对应的花的名称

    pca=PCA(n_components=2) # 实例化
    X_=pca.fit_transform(X) # 一步实现,同之前的预处理类似也可以拆分成.fit和.transform
    print(X_.shape) # (150, 2)
  • 可视化

    1
    2
    3
    4
    5
    6
    7
    8
    import matplotlib.pyplot as plt

    plt.scatter(X_[y==0,0],X_[y==0,1],c='red',label=iris.target_names[0]) # 对应布尔索引
    plt.scatter(X_[y==1,0],X_[y==1,1],c='black',label=iris.target_names[1])
    plt.scatter(X_[y==2,0],X_[y==2,1],c='orange',label=iris.target_names[2])
    plt.legend(loc="best")
    plt.title('PCA of IRIS dataset')
    plt.show()

PCA of IRIS dataset

降维后的信息属性
  • 属性explained_variance_,查看降维后每个新特征向量上所带的信息量大小(可解释性方差的大小)
    ·pca.explained_variance_·

  • 属性explained_variance_ratio_,查看降维后每个新特征向量所占的信息量占原始数据总信息量的百分比,又叫做可解释方差贡献率
    pca.explained_variance_ratio_ ,大部分信息都被有效地集中在了第一个特征上

  • pca.explained_variance_ratio_.sum(),表示explained_variance_ratio_的数字之和,即降维后保留的数据信息占总信息的百分比

如何选择n_components
  • 当参数components中不填写任何值,则默认返回min(X.shape)个特征,一般来说,样本量都会大于特征数目,所以什么都不填就相当于转换了新特征空间,但没有减少特征的个数。但我们可以使用这个计算出累计方差贡献率曲线。
    1
    2
    3
    4
    5
    6
    7
    8
    pca_line=PCA() # 默认选择min(X.shape),虽然维度不变但还是会改变特征维度空间
    pca_line=pca_line.fit(X) # 这里就把特征的信息量占比区分并排序出来了
    # 通过累计图查找总信息量突然变平滑的点就是我们要的最佳维度
    plt.plot([1,2,3,4],np.cumsum(pca_line.explained_variance_ratio_))
    plt.xticks([1,2,3,4])
    plt.xlabel("number of components after dimension reduction")
    plt.ylabel("cumulative explained variance")
    plt.show()

累计方差贡献率

  • 最大似然估计自动选择超参数
    极大似然估计 : 也叫最大似然估计(maximum likelihoodestimation)
    在实例化时输入mle作为n_components的参数即可。