详解主成分分析PCA

    xiaoxiao2021-03-25  155

    PCA是一种无监督学习方式(不需要label)。

    直观理解PCA

    PCA是最常用的一种降维方法。以下图为例,我们的目标是要把二维点降到一维。

    为了达到这个目标,我们要找到一个投影平面(该例是一条蓝色直线),使投影误差(红色线段)最小。找到这条投影直线后,就可以用投影到直线上的点(一维),来表示二维数据了。

    所以,推广到高维,PCA的原理就是,为了将数据从n维降低到k维,需要找到k个向量,用于投影原始数据,是投影误差(投影距离)最小。

    这样看,PCA最终会找到一个投影平面,而线性回归的目的也是要找到一个平面,那PCA岂不是有点类似线性回归?

    PCA与线性回归的区别

    下图是PCA与线性回归的示意图。

    从图中可以看到它们有以下几点区别

    PCA属于无监督学习,其过程中没有label(y轴信息);线性回归属于有监督学习,有labelPCA的误差是用投影误差表示,而线性回归的误差是真实值(叉叉)与预测值(圈圈)之间的距离PCA的最终结果是投影点,而线性回归的最终结果是预测的直线

    PCA的实现过程

    举例:假设有4个样本及他们的特征如下

    样本特征1特征2特征3110001255216020411312008633413131822

    PCA主要是对数据做如下四步操作

    (1) 特征归一化(2) 计算协方差矩阵(协方差矩阵满足对称正定)(3) 对协方差矩阵做奇异值分解,得到U(4) 从U中取出k列(Ur),得到降维后的Z=X*Ur

    下面详细说明将该例样本特征从3维降到2维的过程。

    特征归一化

    StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。

    from sklearn.preprocessing import StandardScaler x=np.array([[10001,2,55], [16020,4,11], [12008,6,33], [13131,8,22]]) X_scaler = StandardScaler() x = X_scaler.fit_transform(x)

    归一化后的x为

    样本特征1特征2特征31-1.2817325-1.341640791.5212776621.48440157-0.4472136-1.183215963-0.359381430.44721360.1690308540.156712361.34164079-0.50709255

    计算协方差矩阵

    对特征归一化后的矩阵计算协方差矩阵。计算协方差矩阵,既可以根据协方差矩阵的定义,用下面的代码来实现

    m = 4 # sample number cov_mat = np.dot(x.transpose(),x)/(m-1) # 协方差矩阵

    也可以直接用numpy中的协方差矩阵计算方法来实现

    cov_mat = np.cov(x, rowvar = 0)

    对协方差矩阵做奇异值分解

    numpy中直接提供了奇异值分解的计算函数svd。

    [U,S,V] = np.linalg.svd(cov_mat) # 奇异值分解

    这里得到了三个矩阵:U,S,V

    这些矩阵的维数如下

    x: n x m (n表示样本个数(行),m表示特征个数(列))cov_mat: m x mU: m x mS: m x mV: m x m

    降维

    降维就是从U中取出k列(这里去2列),并与特征归一化后的矩阵x相乘。

    Ur = U[:,0:2] Z = np.dot(x, Ur)

    对x降维后的结果Z为

    样本特征1特征212.368633190.382980872-1.509527341.2348178930.14360068-0.580409174-1.00270653-1.03738959

    这就是PCA的最终结果。

    几个矩阵的维数如下

    x: n x mU: m x mUr: m x k (k表示降维维度,这里为2。表示从3维(m)降到2维)Z: n x k

    用sklearn做PCA

    from sklearn.decomposition import PCA import numpy as np from sklearn.preprocessing import StandardScaler x=np.array([[10001,2,55], [16020,4,11], [12008,6,33], [13131,8,22]]) X_scaler = StandardScaler() x = X_scaler.fit_transform(x) pca = PCA(n_components=2) pca.fit(x) Z=pca.transform(x)

    降维的结果Z为

    样本特征1特征212.368633190.382980871-1.509527341.2348178910.14360068-0.580409171-1.00270653-1.03738959

    (这个结果与上面实现的PCA结果一致)

    数据复原

    PCA是数据压缩的过程

    Z=X*Ur

    其中各个矩阵的维度是 * x: n x m * U: m x m * Ur: m x k * Z: n x k

    数据复原的计算如下

    X=Z*UrT

    UrT是Ur的转置,UrT的维度是k x m

    np.dot(z, Ur.transpose())# 数据复原,即x 样本特征1特征2特征31-1.28505803-1.342715091.5175109821.48450422-0.44718044-1.183099693-0.349555520.450387820.1801602240.150109341.3395077-0.51457151

    可见复原后的x,与“特征归一化”一节中,归一化后的x一致。

    参考

    Andrew NG在coursera的机器学习课程PCA的完整实现过程代码详解
    转载请注明原文地址: https://ju.6miu.com/read-7541.html

    最新回复(0)