一、降维

1)首先我们可以将数据以矩阵的形式表示出来,例如Xmxn,即m个数据样本,每个数据样本有n维度的特征(这个特征就是数字,n维特征就是n个数字表示了这个样本)。降维的目的就是减小n,比如降低维度到k(k<n)。
2)在二维上举例:我们用我们常用的坐标系,即(1,0)、(0,1)为基的坐标系,选取一组数据[ (-2,-2),(-1,-1)、(0,0)、(1,1)、(2,2)],我们发现这组数据在坐标系上都处于一条直线上,就是y=x上。此时他的维度是二维的,但是我们把X、Y坐标轴逆时针旋转45度,即X轴与之前的y=x直线重合,我们得到X’、Y’,此时数据全部在X’轴上,点的y坐标全变为0,Y‘轴似乎没有什么作用,这样就把维度降低一维了。
3)我们需要明确的是,某点在不同的基下,坐标是不同的,但是该点距离原点的距离不变。这个距离通过勾股定理计算得来,因此在X轴上的投影越大,那么相应在Y轴上的投影就会变小,极端情况下,全部分配给了X轴,y=0,这就舍弃了Y轴,达到了降维的目的。
4)如下图,当点集中在Y轴分布的范围很广,在X轴分布的范围很小,因此我们可以认为用X轴描述数据集的特征必要不大,因此我们可以舍弃X轴的维度,从而达到降维的目的。这就提醒我们应该把数据集投影到范围比较广的范围里,比如下图中的Y轴,即尽可能的扩大数据集的离散程度。
在这里插入图片描述

5)降维就是一种对高维度特征数据预处理方法。降维是将高维度的数据保留下最重要的一些特征,去除噪声和不重要的特征,从而实现提升数据处理速度的目的。在实际的生产和应用中,降维在一定的信息损失范围内,可以为我们节省大量的时间和成本。降维也成为应用非常广泛的数据预处理方法。
降维具有如下一些优点:

  1. 使得数据集更易使用。
  2. 降低算法的计算开销。
  3. 去除噪声。
  4. 使得结果容易理解。
    降维的算法有很多,比如奇异值分解(SVD)、主成分分析(PCA)、因子分析(FA)、独立成分分析(ICA)。

二、PCA简介

1、PCA,即主成分分析,提取数据的主要成分,剔除数据中相对次要的成分,换句话说PCA的目标是降维,就是剔除数据次要成分的维度。在很多应用领域的数据是多个变量存在的,而且要求收集数据量是很大的,这将增加数据分析工作的难度。因此,我们想能不能剔除数据中相对次要的成分,一次来压缩数据量的大小、降低数据变量的复杂度。
2、 高维数据中变量之间的关系是不可见的,因此我们应该找到一个合理的方法,在降低维度的同时,尽量的减少数据信息的损失,这样对于数据的处理是可以接受的。

三、PCA的目标

1、总结一下 PCA 的算法步骤:

设有 m 个n 维数据。

1)将原始数据按列组成 m行 n 列矩阵 X;
2)将 X 的每一行减去这一行的均值;
3)求出协方差矩阵
在这里插入图片描述
4)求出协方差矩阵的特征值及对应的特征向量;(此处求解协方差矩阵的特征值和特征向量有两种方法:特征值分解方法和SVD分解方法)
5)将特征向量按对应特征值大小从上到下按行排列成矩阵,取前 k 行组成矩阵 P;
6)Y=PX即为降维到 k 维后的数据

:A、特征值分解矩阵
在这里插入图片描述

B、SVD分解矩阵原理
在这里插入图片描述

2、基的选择标准

我们知道同样的一组数据选用不同的基,其表示也会不同。基的数量也就是维的数量,当基的数量小于数据的数据的维数,就是降维。假如我们从n维降到k维,那么这k个基怎么选择呢?也就是说怎么选择k个基才能使得降维的效果最好,保存原始信息最多。
这里给出两种理解,均是PCA最大方差理论(就是数据投影到特定基后的方差越大,降维的效果越好)
1)在信号处理中认为信号具有较大的方差,噪声有较小的方差。如果样本在X上的投影方差较大,在Y上的投影方差较小,那么可认为Y上的投影是由噪声引起的。
2)方差越大,数据越分散,也就意味着信息量越多,信号越强,也可以说熵越大,该特征越有区分度。协方差代表维度x和维度y之间的相关程度,协方差越大,也就意味着噪声越大,信息的冗余程度越高。
因此n维的数据降低到k维,在k维上的每一维的样本方差都很大。
注:数据投影到基上的分散程度越大,越好。因此衡量标准可以变为所有点的投影绝对值之和最大。下图是计算投影的方法,即某一点到原点的向量与基的内积。

(图片来自其他人的博客)

3、多维

在一维空间中我们可以用方差来表示数据的分散程度。而对于高维数据,我们用协方差进行约束,协方差可以表示两个变量的相关性。为了让两个变量尽可能表示更多的原始信息,我们希望它们之间不存在线性相关性,因为相关性意味着两个变量不是完全独立,必然存在重复表示的信息。
因此问题转化为:将一组 N 维向量降为 K 维,其目标是选择 K 个单位正交基,使得原始数据变换到这组基上后,各变量两两间协方差为 0,而变量方差则尽可能大(在正交的约束下,取最大的 K 个方差)。

四、实现PCA的Python代码

在这里插入代码片##Python实现PCA
import numpy as np


def pca(X, k):  # k is the components you want
    # mean of each feature
    n_samples, n_features = X.shape
    mean = np.array([np.mean(X[:, i]) for i in range(n_features)])
    # normalization
    # 去平均值,即每一位特征减去各自的平均值。
    norm_X = X - mean
    # scatter matrix
    # 计算协方差矩阵
    scatter_matrix = np.dot(np.transpose(norm_X), norm_X)
    # Calculate the eigenvectors and eigenvalues
    # 求特征值和特征向量
    eig_val, eig_vec = np.linalg.eig(scatter_matrix)
    eig_pairs = [(np.abs(eig_val[i]), eig_vec[:, i]) for i in range(n_features)]
    # sort eig_vec based on eig_val from highest to lowest
    # 对特征值从大到小排序,
    eig_pairs.sort(reverse=True)
    # select the top k eig_vec
    # 选择其中最大的k个。然后将其对应的k个特征向量分别作为列向量组成特征向量矩阵。
    feature = np.array([ele[1] for ele in eig_pairs[:k]])
    # get new data
    # 将数据转换到k个特征向量构建的新空间中。
    data = np.dot(norm_X, np.transpose(feature))
    return data


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

print(pca(X, 1))

五、本文参考博客

https://www.zhihu.com/question/41120789?sort=created
https://blog.csdn.net/luoluonuoyasuolong/article/details/90711318
https://zhuanlan.zhihu.com/p/77151308
https://blog.csdn.net/program_developer/article/details/80632779
本文使用到了这些博客的图、代码等

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐