精华内容
下载资源
问答
  • 降维

    2020-04-01 09:22:03
    一、降维方法介绍 降维方法 -简直太全!- 附Python代码(Random Forest、Factor Analysis、corr、PCA、ICA、IOSMA 1.1、PCA 1.2、因子分析( Factor Analysis ) 1.3、独立成分分析( Independent Component Analysis, ...

    一、降维方法介绍

    降维方法 -简直太全!- 附Python代码(Random Forest、Factor Analysis、corr、PCA、ICA、IOSMA

    1.1、PCA

    1.2、因子分析( Factor Analysis )

    1.3、独立成分分析( Independent Component Analysis, ICA )

    1.5、SVD

    展开全文
  • 通俗理解PCA降维作用

    万次阅读 多人点赞 2017-08-13 16:37:05
    本文主要介绍一种降维方法,PCA(Principal Component Analysis,主成分分析)。降维致力于解决三类问题。 1. 降维可以缓解维度灾难问题; 2. 降维可以在压缩数据的同时让信息损失最小化; 3. 理解几百个维度的数据...

    概述

    本文主要介绍一种降维方法,PCA(Principal Component Analysis,主成分分析)。降维致力于解决三类问题:

    1. 降维可以缓解维度灾难问题;
    2. 降维可以在压缩数据的同时让信息损失最小化;
    3. 理解几百个维度的数据结构很困难,两三个维度的数据通过可视化更容易理解。

    下面,将从简介、计算步骤、应用三方面进行理解PCA的降维作用。

    PCA简介

    在理解特征提取与处理时,涉及高维特征向量的问题往往容易陷入维度灾难。随着数据集维度的增加,算法学习需要的样本数量呈指数级增加。有些应用中,遇到这样的大数据是非常不利的,而且从大数据集中学习需要更多的内存和处理能力。另外,随着维度的增加,数据的稀疏性会越来越高。在高维向量空间中探索同样的数据集比在同样稀疏的数据集中探索更加困难。

    主成分分析 也称为 卡尔胡宁-勒夫变换(Karhunen-Loeve Transform),是一种用于探索高维数据结构的技术。PCA通常用于高维数据集的探索与可视化;还可以用于数据压缩,数据预处理等。PCA可以把可能具有相关性的高维变量合成线性无关的低维变量,称为主成分( principal components)。新的低维数据集会尽可能的保留原始数据的变量。

    PCA将数据投射到一个低维子空间实现降维。例如,二维数据集降维就是把点投射成一条线,数据集的每个样本都可以用一个值表示,不需要两个值。三维数据集可以降成二维,就是把变量映射成一个平面。一般情况下,nn维数据集可以通过映射降成kk维子空间,其中knk{\le}n

    假如你是一本养花工具宣传册的摄影师,你正在拍摄一个水壶。水壶是三维的,但是照片是二维的,为了更全面的把水壶展示给客户,你需要从不同角度拍几张图片。下图是你从四个方向拍的照片:
    wateringcan.png
    第一张图里水壶的背面可以看到,但是看不到前面。第二张图是拍前面,可以看到壶嘴,这张图可以提供了第一张图缺失的信息,但是壶把看不到了。从第三张俯视图里无法看出壶的高度。第四张图是你真正想要的,水壶的高度,顶部,壶嘴和壶把都清晰可见。

    PCA的设计理念与此类似,它可以将高维数据集映射到低维空间的同时,尽可能的保留更多变量。PCA旋转数据集与其主成分对齐,将最多的变量保留到第一主成分中。假设我们有下图所示的数据集:dataset.png
    数据集看起来像一个从原点到右上角延伸的细长扁平的椭圆。要降低整个数据集的维度,我们必须把点映射成一条线。下图中的两条线都是数据集可以映射的,映射到哪条线样本变化最大?datasetline.png
    显然,样本映射到黑色虚线的变化比映射到红色点线的变化要大的多。实际上,这条黑色虚线就是第一主成分。第二主成分必须与第一主成分正交,也就是说第二主成分必须是在统计学上独立的,会出现在与第一主成分垂直的方向,如下图所示:orthogonal.png
    后面的每个主成分也会尽量多的保留剩下的变量,唯一的要求就是每一个主成分需要和前面的主成分正交。

    现在假设数据集是三维的,散点图看起来像是沿着一个轴旋转的圆盘。threedimensional.png
    这些点可以通过旋转和变换使圆盘完全变成二维的。现在这些点看着像一个椭圆,第三维上基本没有变量,可以被忽略。

    当数据集不同维度上的方差分布不均匀的时候,PCA最有用。(如果是一个球壳形数据集,PCA不能有效的发挥作用,因为各个方向上的方差都相等;没有丢失大量的信息维度一个都不能忽略)。

    PCA的计算步骤

    在介绍PCA的运行步骤之前,有一些术语需要说明一下。

    方差,协方差和协方差矩阵

    (对此概念不是很理解可以参考附录链接。)如何通俗易懂地解释「协方差」与「相关系数」的概念?中“GRAYLAMB”的回答。

    方差(Variance) 是度量一组数据的分散程度。方差是各个样本与样本均值的差的平方和的均值:
    s2=i=1n(XiXˉ)2n1s^2 = \frac {\sum_{i=1}^n {{(X_i-\bar X)}^2}} {n-1}
    协方差(Covariance) 是度量两个变量的变动的同步程度,也就是度量两个变量线性相关性程度。如果两个变量的协方差为00,则统计学上认为二者线性无关。注意两个无关的变量并非完全独立,只是没有线性相关性而已。计算公式如下:
    cov(X,Y)=i=1n(XiXˉ)(YiYˉ)n1cov(X,Y)=\frac {\sum_{i=1}^n {(X_i-\bar X)(Y_i-\bar Y)}} {n-1}
    如果协方差大于0表示一个变量增大是另一个变量也会增大,即正相关,协方差小于0表示一个变量增大是另一个变量会减小,即负相关。

    协方差矩阵(Covariance matrix) 由数据集中两两变量的协方差组成。矩阵的第(i,j)(i,j)个元素是数据集中第ii和第jj个元素的协方差。例如,三维数据的协方差矩阵如下所示:
    C=[cov(x1,x1)cov(x1,x2)cov(x1,x3)cov(x2,x1)cov(x2,x2)cov(x2,x3)cov(x3,x1)cov(x3,x2)cov(x3,x3)]C= \begin{bmatrix} cov(x_1,x_1) & cov(x_1,x_2) & cov(x_1,x_3)\\ cov(x_2,x_1) & cov(x_2,x_2) & cov(x_2,x_3)\\ cov(x_3,x_1) & cov(x_3,x_2) & cov(x_3,x_3)\\ \end{bmatrix}
    让我们计算下表数据的协方差矩阵:
    x1x2x3201.42.20.21.52.40.111.901.2\begin{array} {ccc} x_1 && x_2 && x_3\\ \hline 2 && 0 && -1.4 \\ 2.2 && 0.2 && -1.5 \\ 2.4 && 0.1 && -1 \\ 1.9 && 0 && -1.2 \\ \end{array}
    可以由python中的numpy包计算均值和协方差:

    import numpy as np
    X = [[2, 0, -1.4],
    	[2.2, 0.2, -1.5],
    	[2.4, 0.1, -1],
    	[1.9, 0, -1.2]]
    print(np.mean(X,axis=0))
    print(np.cov(np.array(X).T))
    

    得到三个变量的样本均值分别是2.125,0.075和-1.275;协方差矩阵为:
    [0.049166670.014166670.019166670.014166670.009166670.005833330.019166670.005833330.04916667]\begin{bmatrix} 0.04916667 & 0.01416667 & 0.01916667 \\ 0.01416667 & 0.00916667 & -0.00583333 \\ 0.01916667 & -0.00583333 & 0.04916667 \\ \end{bmatrix}

    特征向量和特征值

    (可以直观的理解:“特征向量是坐标轴,特征值是坐标”)
    向量是具有 大小(magnitude)方向(direction) 的几何概念。
    特征向量(eigenvector) 是由满足如下公式的矩阵得到的一个非零向量:Aν=λνA \vec \nu = \lambda \vec \nu其中,ν\vec \nu是特征向量,AA是方阵,λ\lambda是特征值。经过AA变换之后,特征向量的方向保持不变,只是其大小发生了特征值倍数的变化。也就是说,一个特征向量左乘一个矩阵之后等于等比例放缩(scaling)特征向量。德语单词eigen的意思是:“属于…或…专有( belonging to or peculiar to)”;矩阵的特征向量是属于并描述数据集结构的向量。

    特征向量和特征值只能由方阵得出,且并非所有方阵都有特征向量和特征值。如果一个矩阵有特征向量和特征值,那么它的每个维度都有一对特征向量和特征值。矩阵的主成分是由其协方差矩阵的特征向量,按照对应的特征值大小排序得到的。最大的特征值就是第一主成分,第二大的特征值就是第二主成分,以此类推。

    让我们来计算下面矩阵的特征向量和特征值:
    A=[1223]A=\begin{bmatrix}1 & -2 \\2 & -3 \\\end{bmatrix}
    根据前面的公式AA乘以特征向量,必然等于特征值乘以特征向量。我们建立特征方程求解:
    (AλI)ν=0(A- \lambda I) \vec \nu=0
    AλI=[1223][λ00λ]=0 |A-\lambda * I| = \begin{vmatrix}\begin{bmatrix}1 & -2 \\2 & -3 \\\end{bmatrix}-\begin{bmatrix}\lambda & 0 \\0 & \lambda \\\end{bmatrix}\end{vmatrix}= 0
    从特征方程可以看出,矩阵与单位矩阵和特征值乘积的矩阵行列式为0,即:[1λ223λ]=(λ+1)(λ+1)=0\begin{vmatrix}\begin{bmatrix}1-\lambda & -2 \\2 & -3-\lambda\\\end{bmatrix}\end{vmatrix}=(\lambda+1)(\lambda+1)= 0
    矩阵的两个特征值都等于-1。现在再用特征值来解特征向量。
    λ=1\lambda=-1代入:
    (Aλ)ν=0(A- \lambda ) \vec \nu=0
    得:
    ([1223][λ00λ])ν=[1λ223λ]ν=[1λ223λ][ν1,1ν1,2]=[1(1)223(1)][ν1,1ν1,2]=[2222][ν1,1ν1,2]=0 \begin{aligned} \begin{pmatrix} \begin{bmatrix}1 & -2 \\ 2 & -3 \end{bmatrix} - \begin{bmatrix} \lambda & 0 \\ 0 & \lambda \end{bmatrix} \end{pmatrix}\vec\nu & = \begin{bmatrix} 1-\lambda & -2 \\ 2 & -3-\lambda \end{bmatrix}\vec\nu \\ & = \begin{bmatrix}1-\lambda & -2 \\2 & -3-\lambda \end{bmatrix} \begin{bmatrix}\nu_{1,1} \\ \nu_{1,2} \end{bmatrix} \\ & = \begin{bmatrix}1-(-1) & -2 \\ 2 & -3-(-1) \end{bmatrix} \begin{bmatrix}\nu_{1,1} \\ \nu_{1,2} \end{bmatrix} \\ & = \begin{bmatrix} 2 & -2 \\ 2 & -2 \end{bmatrix} \begin{bmatrix} \nu_{1,1} \\ \nu_{1,2} \end{bmatrix} \\ & = 0 \end{aligned}
    所以有:
    {2ν1,1(2ν1,2)=02ν1,1(2ν1,2)=0\begin{cases} 2\nu_{1,1} - (2\nu_{1,2})=0 \\ 2\nu_{1,1}-(2\nu_{1,2})=0 \end{cases}
    任何满足方程Aν=λν(A \vec \nu = \lambda \vec \nu)的非零向量(取ν=[1 1]\vec\nu=\begin{bmatrix}1\\\ 1\end{bmatrix})都可以作为特征向量:
    [1223][11]=[11]=1×[11] \begin{bmatrix} 1 & -2 \\ 2 & -3 \end{bmatrix} \begin{bmatrix}1\\1\end{bmatrix}= \begin{bmatrix}-1\\-1\end{bmatrix}= -1×\begin{bmatrix}1\\ 1\end{bmatrix}
    PCA需要单位特征向量,也就是L2L_2范数x=x12+x22++xn2\begin{Vmatrix}x \\\end{Vmatrix}=\sqrt {x_1^2 + x_2^2 + \dots + x_n^2}等于1的特征向量。

    于是有:[11]=12+12=2\begin{Vmatrix}\begin{bmatrix}1 \\1 \\\end{bmatrix}\end{Vmatrix}=\sqrt {1^2+1^2}=\sqrt 2

    对应的单位特征向量是:[11]/2=[0.707106780.70710678]\begin{bmatrix} 1 \\ 1 \\ \end{bmatrix} / {\sqrt 2}=\begin{bmatrix}0.70710678 \\0.70710678 \\\end{bmatrix}
    这里可以通过 numpy 检验手算的特征向量是否正确。eig 函数返回特征值和特征向量的元组:

    import numpy as np
    w, v = np.linalg.eig(np.array([[1, -2], [2, -3]]))
    print('特征值:{}\n特征向量:{}'.format(w,v))
    

    输出(这里特征值不同为1,是由于python编译器对浮点数据精度要求所致):

    特征值: [-0.99999998 -1.00000002]
    特征向量: 	[[ 0.70710678  0.70710678]
    			[ 0.70710678  0.70710678]]
    
    用PCA降维

    让我们用PCA方法把下表二维数据降成一维:
    x1x20.912.42.61.21.70.50.70.30.71.81.40.50.60.30.62.52.61.31.1 \begin{array} {cc} x_1 && x_2 \\ \hline 0.9 && 1 \\ 2.4 && 2.6\\ 1.2 && 1.7\\ 0.5 && 0.7\\ 0.3 && 0.7\\ 1.8 && 1.4\\ 0.5 && 0.6\\ 0.3 && 0.6\\ 2.5 && 2.6\\ 1.3 && 1.1\\ \end{array}
    PCA第一步是用样本数据减去样本均值:
    x1x20.91.17=0.2711.3=0.32.41.17=1.232.61.3=1.31.21.17=0.031.71.3=0.40.51.17=0.670.71.3=0.60.31.17=0.870.71.3=0.61.81.17=0.631.41.3=0.10.51.17=0.670.61.3=0.70.31.17=0.870.61.3=0.72.51.17=1.332.61.3=1.31.31.17=0.131.11.3=0.2 \begin{array}{cc} x_1 && x_2 \\ \hline 0.9-1.17=-0.27 && 1-1.3=-0.3 \\ 2.4-1.17=1.23 && 2.6-1.3=1.3 \\ 1.2-1.17=0.03 && 1.7-1.3=0.4 \\ 0.5-1.17=-0.67 && 0.7-1.3=-0.6 \\ 0.3-1.17=-0.87 && 0.7-1.3=-0.6 \\ 1.8-1.17=0.63 && 1.4-1.3=0.1 \\ 0.5-1.17=-0.67 && 0.6-1.3=-0.7 \\ 0.3-1.17=-0.87 && 0.6-1.3=-0.7 \\ 2.5-1.17=1.33 && 2.6-1.3=1.3 \\ 1.3-1.17=0.13 && 1.1-1.3=-0.2 \\ \end{array}
    然后,我们计算数据的主成分。前面介绍过,矩阵的主成分是其协方差矩阵的特征向量按照对应的特征值大小排序得到的。主成分可以通过两种方法计算:第一种方法是计算数据协方差矩阵。因为协方差矩阵是方阵,所以我们可以用前面的方法计算特征值和特征向量。第二种方法是用数据矩阵的奇异值分解(singular value decomposition)来找协方差矩阵的特征向量和特征值的平方根。我们先介绍第一种方法,然后介绍scikit-learn的PCA实现,也就是第二种方法。上述数据集的解释变量协方差矩阵如下:
    C=[0.68677777780.60666666670.60666666670.5977777778]C=\begin{bmatrix} 0.6867777778 & 0.6066666667 \\0.6066666667 & 0.5977777778\\\end{bmatrix}
    用前面介绍过的方法,特征值是1.25057433和0.03398123,单位特征向量是:
    [0.732514540.680751380.680751380.73251454]\begin{bmatrix}0.73251454 & 0.68075138 \\0.68075138 & 0.73251454 \\\end{bmatrix}
    下面我们把数据映射到主成分上。第一主成分是最大特征值对应的特征向量,因此我们要建一个转换矩阵,它的每一列都是主成分的特征向量。如果我们要把5维数据降成3维,那么我们就要用一个3维矩阵做转换矩阵。在本例中,我们将把我们的二维数据映射成一维,因此我们只需要用特征向量中的第一主成分作为转换矩阵。最后,我们用数据矩阵右乘转换矩阵。下面就是第一主成分映射的结果:
    [0.270.31.231.30.030.40.670.60.870.60.630.10.670.70.870.71.331.30.130.2][0.732514540.68075138]=[0.402004341.785969680.294275990.082333910.228836820.52955930.967310711.113813621.859221130.04092339] \begin{bmatrix}-0.27 & -0.3 \\1.23 & 1.3 \\0.03 & 0.4 \\-0.67 & 0.6 \\-0.87 & 0.6 \\0.63 & 0.1 \\-0.67 & -0.7 \\-0.87 & -0.7 \\1.33 & 1.3 \\0.13 & -0.2\\\end{bmatrix} \begin{bmatrix}0.73251454\\0.68075138\\\end{bmatrix}= \begin{bmatrix}-0.40200434 \\ 1.78596968 \\ 0.29427599 \\-0.08233391 \\-0.22883682 \\ 0.5295593 \\-0.96731071 \\-1.11381362 \\ 1.85922113 \\-0.04092339 \\\end{bmatrix}
    通过numpy包中的矩阵调用实现过程如下:

    import numpy as np
    x = np.mat([[ 0.9, 2.4, 1.2, 0.5, 0.3, 1.8, 0.5, 0.3, 2.5, 1.3],
    			[ 1, 2.6, 1.7, 0.7, 0.7, 1.4, 0.6, 0.6, 2.6, 1.1]])
    x = x.T
    T = x - x.mean(axis=0)
    C = np.cov(x.T)
    w,v = np.linalg.eig(C)
    v_ = np.mat(v[:,0])		#每个特征值对应的是特征矩阵的每个列向量
    v_ = v_.T		#默认以行向量保存,转换成公式中的列向量形式
    y = T * v_
    print(y)
    

    其实到这可以结束了…

    = = = = = = = = = = = = = = = =无耻分割线= = = = = = = = = = = = = = = = = =

    PCA的运用

    高维数据可视化

    二维或三维数据更容易通过可视化发现模式。一个高维数据集是无法用图形表示的,但是我们可以通过降维方法把它降成二维或三维数据来可视化。

    Fisher1936年收集了三种鸢尾花分别50个样本数据(Iris Data):Setosa、Virginica、Versicolour。解释变量是花瓣(petals)和萼片(sepals)长度和宽度的测量值,响应变量是花的种类。鸢尾花数据集经常用于分类模型测试,scikit-learn中也有。让我们把iris数据集降成方便可视化的二维数据:

    %matplotlib inline
    import matplotlib.pyplot as plt
    from sklearn.decomposition import PCA
    from sklearn.datasets import load_iris
    

    首先,我们导入鸢尾花数据集和PCA估计器。PCA类把主成分的数量作为超参数,和其他估计器一样,PCA也用fit_transform()返回降维的数据矩阵:

    data = load_iris()
    y = data.target
    X = data.data
    pca = PCA(n_components=2)
    reduced_X = pca.fit_transform(X)
    

    最后,我们把图形画出来:

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

    这里写图片描述
    降维的数据如上图所示。每个数据集中三个类都用不同的符号标记。从这个二维数据图中可以明显看出,有一个类与其他两个重叠的类完全分离。这个结果可以帮助我们选择分类模型。

    脸部识别

    现在让我们用PCA来解决一个脸部识别问题。脸部识别是一个监督分类任务,用于从照片中认出某个人。本例中,我们用剑桥大学AT&T实验室的 Faces数据集,这个数据集包含40个人每个人10张照片。这些照片是在不同的光照条件下拍摄的,每张照片的表情也不同。照片都是黑白的,尺寸为92 x 112像素。虽然这些图片都不大,但是每张图片的按像素强度排列的特征向量也有(92 x 112=)10304维。这些高维数据的训练可能需要很多样本才能避免拟合过度。而我们样本量并不大,所有我们用PCA计算一些主成分来表示这些照片。

    我们可以把照片的像素强度矩阵转换成向量,然后用所有的训练照片的向量建一个矩阵。每个照片都是数据集主成分的线性组合。在脸部识别理论中,这些主成分称为特征脸(eigenfaces)。特征脸可以看成是脸部的标准化组成部分。数据集中的每张脸都可以通过一些标准脸的组合生成出来,或者说是最重要的特征脸线性组合的近似值。

    from os import walk, path
    import numpy as np
    import mahotas as mh
    from sklearn.cross_validation import train_test_split
    from sklearn.cross_validation import cross_val_score
    from sklearn.preprocessing import scale
    from sklearn.decomposition import PCA
    from sklearn.linear_model import LogisticRegression
    from sklearn.metrics import classification_report
    X = []
    y = []
    

    下面我们把照片导入Numpy数组,然后把它们的像素矩阵转换成向量:

    for dir_path, dir_names, file_names in walk('C:/Users/HLB/Desktop/first blog/att_faces/'):
       #walk() 函数内存放的是数据的绝对路径,同时注意斜杠的方向。
       for fn in file_names:
            if fn[-3:] == 'pgm':
                image_filename = path.join(dir_path, fn)
                X.append(scale(mh.imread(image_filename, as_grey=True).reshape(10304).astype('float32')))
                y.append(dir_path)
    X = np.array(X)
    

    然后,我们用交叉检验建立训练集和测试集,在训练集上用PCA

    X_train, X_test, y_train, y_test = train_test_split(X, y)
    pca = PCA(n_components=150)
    

    我们把所有样本降到150维,然后训练一个逻辑回归分类器。数据集包括40个类;scikit-learn底层会自动用one versus all策略创建二元分类器:

    X_train_reduced = pca.fit_transform(X_train)
    X_test_reduced = pca.transform(X_test)
    print('训练集数据的原始维度是:{}'.format(X_train.shape))
    print('PCA降维后训练集数据是:{}'.format(X_train_reduced.shape))
    classifier = LogisticRegression()
    accuracies = cross_val_score(classifier, X_train_reduced, y_train)
    

    训练集数据的原始维度是:(300, 10304)
    PCA降维后训练集数据是:(300, 150)

    最后,我们用交叉验证和测试集评估分类器的性能。分类器的平均综合评价指标(F1 score)是0.88,但是需要花费更多的时间训练,在更多训练实例的应用中可能会更慢。

    print('交叉验证准确率是:{}\n{}'.format(np.mean(accuracies), accuracies))
    classifier.fit(X_train_reduced, y_train)
    predictions = classifier.predict(X_test_reduced)
    print(classification_report(y_test, predictions))
    

    最终的分析结果:

    交叉验证准确率是:0.829757290513
    [ 0.83035714  0.83333333  0.8255814 ]
                                                   precision    recall  f1-score   support
    C:/Users/HLB/Desktop/first blog/att_faces/s1		1.00      1.00      1.00         1
    C:/Users/HLB/Desktop/first blog/att_faces/s10       1.00      1.00      1.00         2
    C:/Users/HLB/Desktop/first blog/att_faces/s11       1.00      1.00      1.00         2
    C:/Users/HLB/Desktop/first blog/att_faces/s12       1.00      1.00      1.00         2
    C:/Users/HLB/Desktop/first blog/att_faces/s13       1.00      1.00      1.00         4
    C:/Users/HLB/Desktop/first blog/att_faces/s14       1.00      1.00      1.00         3
    C:/Users/HLB/Desktop/first blog/att_faces/s15       1.00      1.00      1.00         2
    C:/Users/HLB/Desktop/first blog/att_faces/s16       1.00      0.75      0.86         4
    C:/Users/HLB/Desktop/first blog/att_faces/s17       1.00      1.00      1.00         4
    C:/Users/HLB/Desktop/first blog/att_faces/s18       1.00      1.00      1.00         3
    C:/Users/HLB/Desktop/first blog/att_faces/s19       1.00      1.00      1.00         3
    C:/Users/HLB/Desktop/first blog/att_faces/s2       	1.00      1.00      1.00         2
    C:/Users/HLB/Desktop/first blog/att_faces/s20       1.00      1.00      1.00         2
    C:/Users/HLB/Desktop/first blog/att_faces/s21       1.00      1.00      1.00         2
    C:/Users/HLB/Desktop/first blog/att_faces/s22       1.00      1.00      1.00         2
    C:/Users/HLB/Desktop/first blog/att_faces/s23       1.00      1.00      1.00         4
    C:/Users/HLB/Desktop/first blog/att_faces/s24       1.00      1.00      1.00         2
    C:/Users/HLB/Desktop/first blog/att_faces/s25       1.00      1.00      1.00         4
    C:/Users/HLB/Desktop/first blog/att_faces/s26       1.00      1.00      1.00         5
    C:/Users/HLB/Desktop/first blog/att_faces/s27       0.50      1.00      0.67         1
    C:/Users/HLB/Desktop/first blog/att_faces/s28       1.00      0.67      0.80         3
    C:/Users/HLB/Desktop/first blog/att_faces/s29       1.00      1.00      1.00         2
    C:/Users/HLB/Desktop/first blog/att_faces/s3      	1.00      1.00      1.00         1
    C:/Users/HLB/Desktop/first blog/att_faces/s30       1.00      1.00      1.00         3
    C:/Users/HLB/Desktop/first blog/att_faces/s31       1.00      1.00      1.00         3
    C:/Users/HLB/Desktop/first blog/att_faces/s32       1.00      1.00      1.00         1
    C:/Users/HLB/Desktop/first blog/att_faces/s33       1.00      1.00      1.00         1
    C:/Users/HLB/Desktop/first blog/att_faces/s34       1.00      1.00      1.00         3
    C:/Users/HLB/Desktop/first blog/att_faces/s35       1.00      1.00      1.00         2
    C:/Users/HLB/Desktop/first blog/att_faces/s36       0.67      1.00      0.80         2
    C:/Users/HLB/Desktop/first blog/att_faces/s37       0.50      1.00      0.67         1
    C:/Users/HLB/Desktop/first blog/att_faces/s38       1.00      1.00      1.00         5
    C:/Users/HLB/Desktop/first blog/att_faces/s39       1.00      1.00      1.00         3
    C:/Users/HLB/Desktop/first blog/att_faces/s4      	1.00      1.00      1.00         1
    C:/Users/HLB/Desktop/first blog/att_faces/s40       1.00      1.00      1.00         1
    C:/Users/HLB/Desktop/first blog/att_faces/s5       	1.00      0.83      0.91         6
    C:/Users/HLB/Desktop/first blog/att_faces/s6       	1.00      1.00      1.00         3
    C:/Users/HLB/Desktop/first blog/att_faces/s7       	1.00      1.00      1.00         2
    C:/Users/HLB/Desktop/first blog/att_faces/s8       	1.00      1.00      1.00         2
    C:/Users/HLB/Desktop/first blog/att_faces/s9       	1.00      1.00      1.00         1
    								  avg / total       0.98      0.97      0.97       100
    

    总结

    本文主要介绍PCA降维问题。高维数据不能轻易可视化。估计器训练高维数据集时,也可能出现维度灾难。通过主成分分析法缓解这些问题,将可能解释变量具有相关性的高维数据集,通过将数据映射到一个低维子空间,降维成一个线性无关的低维数据集。最后拓展用PCA将四维的鸢尾花数据集降成二维数据进行可视化;并将PCA用在一个脸部识别系统。

    扩展阅读

    1. 如何通俗易懂地解释「协方差」与「相关系数」的概念?
    2. 线性代数中,特征值与特征向量在代数和几何层面的实际意义是什么?
    3. 7-dimensionality-reduction-with-pca
    4. 机器学习/周志华著.–北京:清华大学出版署,2016(2017.2重印)ISBN 978-302-42328-7
    展开全文
  • ISOMAP降维

    2018-01-19 16:34:39
    流形学习非线性降维 ISOMAP降维 matlab代码 matlab降维 完整版
  • #逐维 降维 torch.Tensor([[[1,3],[2,3]],[[1,3],[2,3]]]).mean(2).mean(1).mean(0)
  • 机器学习四大数据降维的方法,有详细讲解推导的过程。
  • ==========欢迎关注文章首发公众号:早起python本文为早起的统计工具箱第二期==========前言为什么要进行数据降维?直观地好处是维度降低了,便于计算和可视化,其深层次的意义在于有效信息的提取综合及无用信息的...

    ==========

    欢迎关注文章首发公众号:早起python

    本文为早起的统计工具箱第二期

    ==========

    前言

    为什么要进行数据降维?直观地好处是维度降低了,便于计算和可视化,其深层次的意义在于有效信息的提取综合及无用信息的摈弃,并且数据降维保留了原始数据的信息,我们就可以用降维的数据进行机器学习模型的训练和预测,但将有效提高训练和预测的时间与效率。

    降维方法分为线性和非线性降维,非线性降维又分为基于核函数和基于特征值的方法(流形学习),代表算法有线性降维方法:PCA ICA LDA LFA

    基于核的非线性降维方法KPCA KFDA

    流形学习:ISOMAP LLE LE LPP

    本文主要对线性降维方法中的PCA、ICA、LDA的Python实现进行讲解。

    请注意本文将不对各种数据降维方法的原理与理论推导过程做过多的讲解,旨在用尽可能少的语言说清楚以及如何用Python实现,先实现再理解,并在读完代码之后自行查阅相关文献理解其不同的思想。但读者应具有一定的统计学、代数学、机器学习的基础。

    主成分分析PCA

    主成分分析(Principal Component Analysis),是一种常用的数据降维方法。通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量,转换后的这组变量就叫主成分。关于主成分分析的思想与理论推导过程在互联网上很容易找到完美的证明,用人话说来就是找到一个轴,将你的数据映射到这个轴上之后所计算的方差最大,再换句人话说就是从原始数据的一堆变量中提取出一部分变量,而这部分变量能完美解释原始数据中包含的信息(或保留原始的数据特性)

    注意:进行主成分分析前需对数据进行归一化处理

    PCA流程:对数据行归一化处理

    计算归一化后的数据集的协方差矩阵与其特征值、特征向量

    对特征值从大到小排序并保留最大的个特征向量

    将数据转换到个特征向量构建的新空间中

    优点:无参数限制

    提取了主要信息并且结果容易理解

    缺点:方差小的主成分可能含有对样本差异的重要信息

    在某些情况下,PCA方法得出的主元可能并不是最优的

    相关Python代码

    sklearn.decomposition.PCA

    Python实现示例(已注释)

    #来看个官网最简单的例子

    >>> import numpy as np

    >>> from sklearn.decomposition import PCA

    #创建数据 矩阵形式

    >>> X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])

    #设定两个主成分

    >>> pca = PCA(n_components=2)

    #用X训练

    >>> pca.fit(X)

    PCA(n_components=2)

    #查看每个主成分解释程度

    >>> print(pca.explained_variance_ratio_)

    [0.9924... 0.0075...]

    >>> print(pca.singular_values_)

    [6.30061... 0.54980...]

    #降维

    >>> pca = PCA(n_components=1, svd_solver='arpack')

    >>> pca.fit(X)

    PCA(n_components=1, svd_solver='arpack')

    >>> print(pca.explained_variance_ratio_)

    [0.99244...]

    >>> print(pca.singular_values_)

    [6.30061...]

    线性判别分析LDA

    线性判别分析(Linear Discriminant Analysis)是一种有监督的(supervised)线性降维算法。与PCA保持数据信息不同,LDA的核心思想:往线性判别超平面的法向量上投影,使得区分度最大(高内聚,低耦合)。LDA是为了使得降维后的数据点尽可能地容易被区分!

    与PCA比较PCA为无监督降维,LDA为有监督降维

    LDA降维最多降到类别数K-1的维数,PCA没有这个限制。

    PCA希望投影后的数据方差尽可能的大(最大可分性),而LDA则希望投影后相同类别的组内方差小,而组间方差大。

    相关Python代码

    sklearn.discriminant_analysis.LinearDiscriminantAnalysis

    Python实现示例(已注释)

    import numpy as np

    import matplotlib.pyplot as plt

    from mpl_toolkits.mplot3d import Axes3D

    %matplotlib inline

    from sklearn.datasets.samples_generator import make_classification

    #生成数据

    X, y = make_classification(n_samples=1000, n_features=3, n_redundant=0, n_classes=3, n_informative=2,

    n_clusters_per_class=1,class_sep =0.5, random_state =10)

    #LDA降维

    from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

    lda = LinearDiscriminantAnalysis(n_components=2)

    lda.fit(X,y)

    X_new = lda.transform(X)

    plt.scatter(X_new[:, 0], X_new[:, 1],marker='o',c=y)

    plt.show()

    独立成分分析ICA

    独立成分分析(Independent component analysis)是一种利用统计原理进行计算的方法,它是一个线性变换,这个变换把数据或信号分离成统计独立的非高斯的信号源的线性组合。之前介绍的PCA、LDA都是以观测数据点呈高斯分布模型为基本假设前提的,而ICA将适用于非高斯分析数据集,是PCA的一种有效扩展。

    与PCA比较ICA寻找的是最能使数据的相互独立的方向,而PCA仅要求方向是不相关的

    PCA认为主元之间彼此正交,样本呈高斯分布;ICA则不要求样本呈高斯分布

    相关Python代码

    sklearn.decomposition.FastICA

    Python实现示例(已注释)

    import numpy as np

    import matplotlib.pyplot as plt

    from scipy import signal

    from sklearn.decomposition import FastICA, PCA

    # 生成观测模拟数据

    np.random.seed(0)

    n_samples = 2000

    time = np.linspace(0, 8, n_samples)

    s1 = np.sin(2 * time) # 信号源 1 : 正弦信号

    s2 = np.sign(np.sin(3 * time)) # 信号源 2 : 方形信号

    s3 = signal.sawtooth(2 * np.pi * time) # 信号源 3: 锯齿波信号

    S = np.c_[s1, s2, s3]

    S += 0.2 * np.random.normal(size=S.shape) # 增加噪音数据

    S /= S.std(axis=0) # 标准化

    # 混合数据

    A = np.array([[1, 1, 1], [0.5, 2, 1.0], [1.5, 1.0, 2.0]]) # 混合矩阵

    X = np.dot(S, A.T) # 生成观测信号源

    # ICA模型

    ica = FastICA(n_components=3)

    S_ = ica.fit_transform(X) # 重构信号

    A_ = ica.mixing_ # 获得估计混合后的矩阵

    # PCA模型

    pca = PCA(n_components=3)

    H = pca.fit_transform(X) # 基于PCA的成分正交重构信号源

    # 图形展示

    plt.figure()

    models = [X, S, S_, H]

    names = ['Observations (mixed signal)',

    'True Sources',

    'ICA recovered signals',

    'PCA recovered signals']

    colors = ['red', 'steelblue', 'orange']

    for ii, (model, name) in enumerate(zip(models, names), 1):

    plt.subplot(4, 1, ii)

    plt.title(name)

    for sig, color in zip(model.T, colors):

    plt.plot(sig, color=color)

    plt.subplots_adjust(0.09, 0.04, 0.94, 0.94, 0.26, 0.46)

    plt.show()

    以上就是早起的统计工具箱第二期的内容,当然想要完全学会还需要自行查阅更多文献,而更多的数据降维方法、还有上一期未介绍完的python统计检验我们之后再聊。

    我的公众号:早起python

    展开全文
  • ==========欢迎关注文章首发公众号:早起python本文为早起的统计工具箱第二期==========前言为什么要进行数据降维?直观地好处是维度降低了,便于计算和可视化,其深层次的意义在于有效信息的提取综合及无用信息的...

    ==========

    欢迎关注文章首发公众号:早起python

    本文为早起的统计工具箱第二期

    ==========

    前言

    为什么要进行数据降维?直观地好处是维度降低了,便于计算和可视化,其深层次的意义在于有效信息的提取综合及无用信息的摈弃,并且数据降维保留了原始数据的信息,我们就可以用降维的数据进行机器学习模型的训练和预测,但将有效提高训练和预测的时间与效率。

    降维方法分为线性和非线性降维,非线性降维又分为基于核函数和基于特征值的方法(流形学习),代表算法有线性降维方法:PCA ICA LDA LFA

    基于核的非线性降维方法KPCA KFDA

    流形学习:ISOMAP LLE LE LPP

    本文主要对线性降维方法中的PCA、ICA、LDA的Python实现进行讲解。

    请注意本文将不对各种数据降维方法的原理与理论推导过程做过多的讲解,旨在用尽可能少的语言说清楚以及如何用Python实现,先实现再理解,并在读完代码之后自行查阅相关文献理解其不同的思想。但读者应具有一定的统计学、代数学、机器学习的基础。

    主成分分析PCA

    主成分分析(Principal Component Analysis),是一种常用的数据降维方法。通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量,转换后的这组变量就叫主成分。关于主成分分析的思想与理论推导过程在互联网上很容易找到完美的证明,用人话说来就是找到一个轴,将你的数据映射到这个轴上之后所计算的方差最大,再换句人话说就是从原始数据的一堆变量中提取出一部分变量,而这部分变量能完美解释原始数据中包含的信息(或保留原始的数据特性)

    注意:进行主成分分析前需对数据进行归一化处理

    PCA流程:对数据行归一化处理

    计算归一化后的数据集的协方差矩阵与其特征值、特征向量

    对特征值从大到小排序并保留最大的个特征向量

    将数据转换到个特征向量构建的新空间中

    优点:无参数限制

    提取了主要信息并且结果容易理解

    缺点:方差小的主成分可能含有对样本差异的重要信息

    在某些情况下,PCA方法得出的主元可能并不是最优的

    相关Python代码

    sklearn.decomposition.PCA

    Python实现示例(已注释)

    #来看个官网最简单的例子

    >>> import numpy as np

    >>> from sklearn.decomposition import PCA

    #创建数据 矩阵形式

    >>> X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])

    #设定两个主成分

    >>> pca = PCA(n_components=2)

    #用X训练

    >>> pca.fit(X)

    PCA(n_components=2)

    #查看每个主成分解释程度

    >>> print(pca.explained_variance_ratio_)

    [0.9924... 0.0075...]

    >>> print(pca.singular_values_)

    [6.30061... 0.54980...]

    #降维

    >>> pca = PCA(n_components=1, svd_solver='arpack')

    >>> pca.fit(X)

    PCA(n_components=1, svd_solver='arpack')

    >>> print(pca.explained_variance_ratio_)

    [0.99244...]

    >>> print(pca.singular_values_)

    [6.30061...]

    线性判别分析LDA

    线性判别分析(Linear Discriminant Analysis)是一种有监督的(supervised)线性降维算法。与PCA保持数据信息不同,LDA的核心思想:往线性判别超平面的法向量上投影,使得区分度最大(高内聚,低耦合)。LDA是为了使得降维后的数据点尽可能地容易被区分!

    与PCA比较PCA为无监督降维,LDA为有监督降维

    LDA降维最多降到类别数K-1的维数,PCA没有这个限制。

    PCA希望投影后的数据方差尽可能的大(最大可分性),而LDA则希望投影后相同类别的组内方差小,而组间方差大。

    相关Python代码

    sklearn.discriminant_analysis.LinearDiscriminantAnalysis

    Python实现示例(已注释)

    import numpy as np

    import matplotlib.pyplot as plt

    from mpl_toolkits.mplot3d import Axes3D

    %matplotlib inline

    from sklearn.datasets.samples_generator import make_classification

    #生成数据

    X, y = make_classification(n_samples=1000, n_features=3, n_redundant=0, n_classes=3, n_informative=2,

    n_clusters_per_class=1,class_sep =0.5, random_state =10)

    #LDA降维

    from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

    lda = LinearDiscriminantAnalysis(n_components=2)

    lda.fit(X,y)

    X_new = lda.transform(X)

    plt.scatter(X_new[:, 0], X_new[:, 1],marker='o',c=y)

    plt.show()

    独立成分分析ICA

    独立成分分析(Independent component analysis)是一种利用统计原理进行计算的方法,它是一个线性变换,这个变换把数据或信号分离成统计独立的非高斯的信号源的线性组合。之前介绍的PCA、LDA都是以观测数据点呈高斯分布模型为基本假设前提的,而ICA将适用于非高斯分析数据集,是PCA的一种有效扩展。

    与PCA比较ICA寻找的是最能使数据的相互独立的方向,而PCA仅要求方向是不相关的

    PCA认为主元之间彼此正交,样本呈高斯分布;ICA则不要求样本呈高斯分布

    相关Python代码

    sklearn.decomposition.FastICA

    Python实现示例(已注释)

    import numpy as np

    import matplotlib.pyplot as plt

    from scipy import signal

    from sklearn.decomposition import FastICA, PCA

    # 生成观测模拟数据

    np.random.seed(0)

    n_samples = 2000

    time = np.linspace(0, 8, n_samples)

    s1 = np.sin(2 * time) # 信号源 1 : 正弦信号

    s2 = np.sign(np.sin(3 * time)) # 信号源 2 : 方形信号

    s3 = signal.sawtooth(2 * np.pi * time) # 信号源 3: 锯齿波信号

    S = np.c_[s1, s2, s3]

    S += 0.2 * np.random.normal(size=S.shape) # 增加噪音数据

    S /= S.std(axis=0) # 标准化

    # 混合数据

    A = np.array([[1, 1, 1], [0.5, 2, 1.0], [1.5, 1.0, 2.0]]) # 混合矩阵

    X = np.dot(S, A.T) # 生成观测信号源

    # ICA模型

    ica = FastICA(n_components=3)

    S_ = ica.fit_transform(X) # 重构信号

    A_ = ica.mixing_ # 获得估计混合后的矩阵

    # PCA模型

    pca = PCA(n_components=3)

    H = pca.fit_transform(X) # 基于PCA的成分正交重构信号源

    # 图形展示

    plt.figure()

    models = [X, S, S_, H]

    names = ['Observations (mixed signal)',

    'True Sources',

    'ICA recovered signals',

    'PCA recovered signals']

    colors = ['red', 'steelblue', 'orange']

    for ii, (model, name) in enumerate(zip(models, names), 1):

    plt.subplot(4, 1, ii)

    plt.title(name)

    for sig, color in zip(model.T, colors):

    plt.plot(sig, color=color)

    plt.subplots_adjust(0.09, 0.04, 0.94, 0.94, 0.26, 0.46)

    plt.show()

    以上就是早起的统计工具箱第二期的内容,当然想要完全学会还需要自行查阅更多文献,而更多的数据降维方法、还有上一期未介绍完的python统计检验我们之后再聊。

    我的公众号:早起python

    展开全文
  • 利用PCA对半导体制造数据(1567 X 590)进行降维
  • 数据降维

    2021-04-10 17:23:51
    SVD PCA 直观的观测数据降维
  • 数据降维PPT

    2018-03-12 11:06:11
    数据降维PPT,了解什么是机器学习(数据挖掘)中数据降维,以及常见的降维方法及其实现。
  • TSNE 降维方法

    2019-03-18 14:47:51
    TSNE 降维方法,常见机器学习降维方法之一,代码中脚本可以直接生成可视化图标,供学习用
  • 降维详解

    2020-08-07 09:16:56
    降维 降维是解决维度灾难和过拟合的重要⽅法,除了直接的特征选择外,我们还可以采⽤算法的途径对特征进⾏筛选,线性的降维⽅法以 PCA 为代表,在 PCA 中,我们只要直接对数据矩阵进⾏中⼼化然后求奇异值分解或者对...
  • MNIST数字图片降维

    2021-04-09 10:18:37
    MNIST数字图片降维
  • 自适应半监督降维

    2021-03-11 23:28:52
    自适应半监督降维

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,860
精华内容 7,944
关键字:

降维