维度降低,PCA介绍

158 阅读8分钟

降维,PCA介绍

我们将介绍一种名为PCA(主成分分析)的降维算法,并将展示它如何帮助理解你所拥有的数据。

神经网络215.00

2019年9月29日

Article

作为一个数据科学家,你总是会遇到这样的情况,当你有大量的数据,有大量的特征。你甚至不知道你是否会全部使用它们。这些数据的结构是否足够,哪些特征对我的问题有价值。

因此,一般来说,你从一个工程团队获得数据集,之后,你会添加另一个团队的数据,以此类推。结果,你得到了一个有很多特征的数据集,这些特征也可能没有用,因为你是从工程团队那里得到的,他们可以给你一切。

试图用给定的数据集来拟合你的模型可能会很慢,会占用大量的内存,甚至可能是有害的,并且会影响你的学习过程。因此,你需要从你的数据中去掉不常用的和无价值的特征,换句话说,你要降低数据的维度。

让我们看一下这个例子。我们假设你有一个具有大量特征的数据集

你可以意识到要取哪些列以及它们的价值如何。你需要获取最有价值的列,并删除其他字段。

让我们来看看我们能做什么。

降低维度

现在我们要看一下简单的例子来了解我们如何降低维度。

我们在平面上有二维 的点,我们想得到一维的 点。

如果我们在这些点之间画一条线,并将所有的点投射在这条线上,我们会得到一个很好的点的近似值,但只是在这条线上,我们已经发现。这意味着我们将在这条线上有新的点,这将只是一个维度。

我们将有这样的东西

在绿线上的所有投影(位置),我们将有一维 的新点。

用同样的方法,我们可以通过为这些三维点找到最佳的平面,将点从三维近似到二维。我们所需要的就是找到这个平面,将所有的点投射到这个平面上,对它们进行总结并取其平均值。最好的近似将是具有最小平均投影误差的平面

这看起来很好,但我们要怎么做呢?

PCA(主成分分析)

现在让我们来制定这个方法,让我们看看PCA是如何工作的,以及我们将如何找到这些平面,成分。

试图从n维减少到k维,意味着要在适当的方向上找到k个向量,在这个方向上的平均投影误差要小。在引入PCA算法之前,我们需要对数据进行一些预处理

让我们假设我们有一个有m个例子的训练数据集
首先,我们将这个例子归一化,所以它们的平均值为0。同时,我们将计算出各点的方差。

接下来,我们将需要计算该输入矩阵的**"协方差**"矩阵。换句话说,我们将计算每个例子的协方差 矩阵,之后,我们将取它们的平均值

现在我们需要找到向量,这将代表我们给定数据集的新轴或维度。为了找到它们,我们将使用SVD(奇异值分解),这是线性代数中的一种已知方法,在许多语言和库中都可以实现。你可以在这里阅读更多关于SVD的信息。通过使用这个方法,我们将得到3个新矩阵

矩阵U 包含我们要找的所有必要的向量。如果我们的X 矩阵是p乘p,那么U也将是p乘p。这些向量是我们新维度的代表向量。通过选择前k列,我们将得到我们需要的向量。有了一个新的矩阵来转换我们的X点,我们将在这两个矩阵之间做点 即可。

矩阵Z 将是我们的新点的k维。U减少将是一个矩阵,它包含所有必要的向量。这就是PCA的工作方式。

PCA(主成分分析)的原理

现在让我们来了解一下这个算法的直觉,以及它实际上要做什么。我们已经得到了我们的数据集X,它有n列和m行。让我们把每一列都定义为一个新的X

当我们试图找到一个新的维度时,我们基本上是试图找到一些参数,也就是均值化的参数。 在我们的数据集中,每一个特征都与其他特征有一些关联,对于每一个新的维度向量,我们想找到一些其他的东西,这些东西与之前的特征没有关联。这意味着什么。

这意味着第一轴上Z 数学期望值将与X 的数学期望值几乎相同。通过收集这些Z向量,我们将得到一个矩阵,每一列将代表一个新的维度。我们已经说过,X矩阵和u向量是均值化的,我们要使新向量的方差最大化。

换句话说,我们要使Z矩阵的每个特征的方差最大化。每个维度或主成分必须与其他维度或主成分不相关。让我们来看看这些点。

它有2个部分,绿色蓝色的线。你可以看到绿线上的点 绿色线具有高方差和高相关性,但 蓝色线与绿线的相关性不高,它代表另一个成分。这2条线是我们的点的主成分,我们可以选择其中之一,以降低维度。

如何选择PCA中的成分数

谈到PCA算法,我们意识到我们必须选择成分的数量,这是由我们自己决定的,我们不知道哪个k值是最好的选择。首先,我们要定义一个度量,它将代表我们对点的分布的改变程度。

其中X近似值是通过使用Z向量对点进行的近似。换句话说,当我们在直线上移动这些点时,通过投射它们,这就是那个新的、移动的点的新坐标。
这个量告诉我们,我们改变或移动了多少个点?我们的真实点和近似点之间的距离是多少?这就是投影距离。我们将取所有例子的平均投影误差,并将其除以我们数据集的平均向量大小。如果我们只改变了一点点,那么很好,我们只改变了1%,其他99%保持不变。

我们可以迭代进行,每次都用不同的k值运行PCA算法。首先,我们可以设定k=1

  1. 计算协方差矩阵
  2. 寻找主成分
  3. 选择前k个向量
  4. 计算移动量
  5. 如果小于0.01,就可以了,如果不是k+=1,就去找1

直到我们得到小于0.01的结果,但这在执行上看起来并不理想。在PCA中还有一种选择成分数量的方法。

我们已经谈到了SVD(单值分解),说它会返回3个矩阵。第二个矩阵S是一个对角矩阵,在许多库中,它只返回一个向量,即对角线的元素。如果以下条件为真,那么你的算法就完成了。

通过使用这个公式,你可以找到k的值,其中这个条件为真。

Python中的PCA

我们描述了一种降维的方法,并谈到了一种叫做主成分分析 的算法来实现它。现在让我们看看如何在Python中做到这一点。如果你使用Numpy, 有几个动作你必须要知道。

import numpy as np

X = load_data() # m*n matrix
Covariance_X = X.dot(X.T)  # computing covariance matrix

[U, S, V] = np.linalg.svd(Cov_X)

# U is the matrix with principal components
# S is diagonal Matrix for choosing best value for k

U_reduce = U[:, k]  # will be the matrix for k components

如果你不使用NumPy,或者你的数据集足够大,而且你想有一个更好的API,那么你将不得不使用sklearn包。它有很好的算法实现,而且功能API也比较好。

from sklearn.decomposition import PCA
k = 2

X = load_data()
pca = PCA(n_components=k)

principal_components = pca.fit_transform(X)

PCA用例

通过了解PCA并理解它的作用,一些机器学习工程师误解了PCA用例,并总是试图使用它们。

  • 不好用PCA(主成分分析)来防止过拟合。

PCA不是用来解决过拟合问题的,有一种正则化的方法,就是专门为它设计的。此外,将PCA应用于你的数据集,你会失去其中的一些信息,但试图保持方差并不会帮助你解决过拟合问题。

  • PCA的其他不良用途

当你试图为你的数据学习一个模型时,不要一开始就对它应用PCA。这不是一个好的经验。开始在你得到的数据集上拟合你的模型,然后尝试理解问题。也许你的X包含有价值的特征,你不需要把它们去掉。经过一些实验,如果你必须进行降维,那么就使用PCA。

  • 善用PCA是为了减少内存的使用

我们需要使用PCA的主要原因之一。如果你的数据在特征方面太大,而且你在内存上有问题,那么使用PCA是一个好主意。

  • PCA的另一个好用途是提高训练速度

你需要使用降维的第二个原因。如果你的学习过程需要太多的时间,那么也许使用PCA会使你的过程更快,因为计算梯度会更快,梯度下降算法的每一步也会更快。

投0票

机器学习pca