主成分分析的详细说明

塔瓦什·阿格瓦尔

在这篇文章中,我们将研究PCA的工作原理并有助于降低尺寸。但是在此之前,让我们先了解一些了解PCA的先决条件。

先决条件

让我们了解不同类型的矩阵。下面的列表仅介绍了可用的其他类型的矩阵。

矩阵:

表示为(行x列)

  • 空矩阵:将所有元素都为0的矩阵称为空矩阵
  • 行矩阵:行矩阵是只有一行的矩阵
  • 列矩阵:列矩阵是只有一列的矩阵
  • 方阵:如果矩阵的行数与列数相同,则称其为方阵。
  • 对角矩阵:对角矩阵是一个正方形矩阵,其中除从左上角到右下角的对角线上的元素外,所有元素均为0。 
  • 矩阵的转置:通过将矩阵的行转换为列来创建矩阵的转置。也就是说,第1行成为第1列,第2行成为第2列,依此类推。
  • 单位矩阵:单位矩阵是一个正方形矩阵,其主对角线为1,其他所有条目为0。
  • 对称矩阵:转置与原始矩阵相同的矩阵称为对称矩阵。
  • 正交矩阵:如果--- = --- = I,则矩阵A是正交的。
  • 矩阵的行列式:行列式可以看作一个函数,其输入为方矩阵,输出为数字。
  • 矩阵的逆:对于平方矩阵A,逆矩阵-1是一个矩阵,当与A相乘时,将得出向量空间的恒等矩阵。 --- 1 =I。

在实际学习PCA之前,我们需要满足一些先决条件。

线性组合

向量集的线性组合是通过将这些向量集与标量/实数相乘然后相加而获得的表达式。例如:

v1 = np.array([2,3])
v2 = np.array([3,4])
m = 1
n = 2

lincom = m*v1 +  n*v2
print(lincom)

# The linear combination vector would, therefore, be shown as (2m + 3n, 3m+ 4n)

我们也可以做相反的部分。那就是找到m,n的值,对于该值,给定矢量是前两个矢量的线性组合。

lincom2  = ([8,11])
setvec = np.array([[2,3],[3,4]])
m,n = np.linalg.solve(setvec, lincom2)
m,n

我们可以尝试一下,并且可以将二维空间中的任何向量表示为向量(2,3)和(3,4)的线性组合。但这不适用于向量的任何组合,请考虑一个示例:

我们不能将任何向量表示为向量(2,0)和(3,0)的线性组合。这是因为(2,0)和(3,0)是共线向量。即一个向量可以表示为另一个向量的标量倍数(3,0)= 1.5(2,0)。

共线矢量始终具有相同的方向,并且始终可以表示为彼此的标量倍数。

基础向量

给定一组向量,无论我们选择什么其他向量,它总是可以表示为给定集合的线性组合,那么给定向量被称为该数据空间或维度的基础向量。

# Verifying (2,3) and (3,4) are basis vector
lincom2  = ([6,3])
setvec = np.array([[2,3],[3,4]])
m,n = np.linalg.solve(setvec, lincom2)
round(m),round(n)

标准基向量(i(1,0)和j(0,1))的属性很少。这些是:

  1. 它是正交的,即向量(1,0)和(0,1)彼此垂直。
    ## Dot products of perpendicular vectors are always zero
    setvec = np.array([[1,0],[0,1]])
    np.dot(setvec[0],setvec[1])
  2. 它是规范化的,即每个向量的大小为1。((sqrt(1 ^ 2 + 0 ^ 2)))
    ##This would mean that each of them would be of unit magnitude
    np.linalg.norm(setvec[0])
    np.linalg.norm(setvec[1])

线性变换

线性变换本质上是对矢量的矩阵变换,其中矢量的几何特性由于伸长,旋转,轴的移动或某些其他形式的变形而发生变化。

如果L是表示变换的矩阵,而v是在其上进行变换的向量,则所得向量由Lv给出。有不同类型的转换:

  1. 伸长
  2. 轴移位

伸长

让我们看看如何将一个向量/矩阵与另一个向量相乘来延长它。让我们考虑一个线性变换,其中原始基向量i(1,0)和j(0,1)移动到点i'(2,0)和j'(0,1)。

# Dataframe matrix
a = [[1,2],[-2,3],[-2,1],[3,7],[4,5],[6,4]]
b = ['X','Y']
c = pd.DataFrame(a,columns = b)

# Linear transformation matrix
L = np.array([[2,0],[0,1]])

#Let's apply the transformation now to every vector in dataframe
d  = L @ (c.values).T
print(d.T)

之所以采用(c.values).T,是因为以数据帧格式表示的原始矢量超过了行格式。但是为了使转换生效,我们需要向量沿着列。

轴移位

假设从原始基向量i(1,0)和j(0,1)开始,我们要将其移动到新的正交基向量i'(0.8,0.6)和j'(-0.6,0.8)。 

L = np.array([[0.8,-0.6],[0.6,0.8]])

#Finding the inverse and then using the transformation on the given set of points.
Ld = np.linalg.inv(L)


a = [[1,2],[-2,3],[-2,1],[3,7],[4,5],[6,4]]
b = ['X','Y']
c = pd.DataFrame(a,columns = b)

d  = Ld @ (c.values).T
d.T

基础转换

基础转换是将您的信息从一组基础转换为另一组基础的过程。或者,用不同于原始列的新列表示数据。通常是为了方便,高效或出于常识。

在空间变换中,原点和数据点不会更改其位置。它们保持固定在空间中。但是,新矢量空间上该点的表示形式发生了变化。

特征向量和特征分解

向量可能发生的一种特殊的线性变换是,将矩阵乘以向量时,它只能设法将向量拉伸一定的标量大小。这些向量被称为该特定矩阵的特征向量,标量的大小被称为对应的特征值。正式地,它们可以写成如下形式,

Av =λv,其中A是原始矩阵/线性变换,v是特征向量,而λ是相应的特征值。

考虑下面显示的示例:

A = np.array([[2,1],[1,2]])

K = np.linalg.eig(A)

#Eigenvalues
print(K[0])

#Eigenvectors
print(K[1])

# Verify the results
# Let's verify them once again. First, let's calculate Av
print(A @ (K[1].T)[0])

#Now let's calculate λv.
3*(K[1].T)[0]

# Output:
# As you can see Av = λv has been verified.

本征分解 矩阵的状态表明,如果A是对角线化的正方形矩阵,则可以始终将其分解为3个矩阵Q,S和P,其中:

  1. Q是特征向量矩阵
  2. S是一个以特征值为对角元素的对角矩阵
  3. P是矩阵Q的倒数。
# Arrange the eigenvalues along the diagonal of a square matrix.
S = np.array([[3,0], [0,1]])

# Take eigenvector
Q=K[1]

# take the inverse of eigenvector
P = np.linalg.inv(Q)

# The product of the three matrices obtained in the following order.
Q @ S @ P

PCA简介

在获得了解PCA所需的基本知识之后,让我们看看PCA背后的动机:

  1. 当您具有大量潜在相关的变量时,PCA非常有用 
  2. PCA可用于可视化复杂的数据集。

PCA是一种不受监督的技术:没有“ Y”或因变量/响应变量。

主成分分析(PCA)是获取高维数据并使用
变量之间的依赖性,以更易于处理的低维形式表示它,而不会丢失
很多信息。  

给定数据集中的p个特征/变量,PCA会发现主成分为

  • 原始特征的线性组合
  • 主成分捕获数据集中的最大方差

PCA可以定义为一种统计程序,用于将对可能相关的变量的观察结果转换为“主要成分”:

  • 彼此不相关/彼此独立
  • 构建主要组件以捕获数据中的最大信息
  • 主要成分是原始变量的线性组合

主成分分析是一项非常强大的技术,它具有多种用途:

  1. 降维
  2. 数据可视化和探索性数据分析
  3. 创建可以作为预测模型输入的不相关特征/变量
  4. 揭示潜在变量/主题/概念:潜在变量是原始属性的线性组合,在某些情况下也可以解释为有意义的潜在主题。
  5. 数据集中的降噪

PCA的三个组成部分是:

  1. “空间”的“基础”
  2. 基础转换:这是将您的信息从一组基础转换为另一组基础的过程。 
  3. 作为信息的方差:捕获数据中方差的变量是捕获数据中信息的变量。

PCA找到主成分z1,z2,... zp,以便每个主成分彼此独立(即垂直)并捕获尽可能多的方差。主要成分是原始特征的线性组合。

$$ Z_1 = \ phi_ {11} X_1 + \ phi_ {21} X_2 +。 。 。 。 。 + \ phi_ {1n} X_n $$

注意:  PCA也可以被认为是找到最接近数据点的线/平面/面。

PCA算法

最初,PCA使用特征分解路径来找到主要成分。但是,出现了更快的算法,如SVD,如今已被广泛使用。但是,这里要注意的一件事是,SVD实际上是特征分解的通用过程。

本征分解算法涉及的步骤如下:

  1. 根据原始矩阵,计算其协方差矩阵C。
  2. 计算协方差矩阵后,进行特征分解并找到其特征值和特征向量
  3. 根据特征值对特征向量进行排序。
  4. 这些特征向量是原始矩阵的主要成分。
  5. 特征值表示特征向量解释的方差量。特征值越高,由相应特征向量解释的方差越大。
  6. 这些特征向量是正交的,即它们是单位向量,彼此垂直。

遵循协方差矩阵的本征分解过程将主成分放在盘中的原因归因于“谱定理”。

谱定理指出:

  1. 当您进行协方差矩阵的特征分解时,相应的特征向量将是原始矩阵的主要成分。
  2. 这些特征向量彼此正交,因此遵循PC需要彼此垂直的特性。
  3. 它们也将是有序的-特征值将决定由该主成分解释的方差,因此,根据特征值对矩阵进行排序将得到结果主成分矩阵。
  4. 这些特征向量也将是原始变量的线性组合。

奇异值分解

这是计算PCA的技术之一。 SVD基本上是特征分解方法的扩展。

$$ A = U \ sum V ^ T $$

哪里,  

  • U是一个m x k矩阵:“主题”行
  • Σ或S是对角k x k矩阵,具有k个正值,这是主题的优势
  • \(V ^ T \)是一个k x n矩阵:“主题”列
  • k代表主成分的数量。

碎石图

我们使用该图选择理想数量的主成分,以便捕获最大方差。在Scree图中,我们绘制了每个主成分捕获的累积方差之和。  

 蠕变图


这里的目标是选择组件,以便捕获最大方差。

要记住的PCA和SVD要点

使用PCA时要记住的一些重要要点是:

  • 大多数软件包使用SVD来计算组件,并假定数据已缩放和居中,因此进行标准化/标准化很重要。
     
  • PCA是一种线性变换方法,与线性模型(例如线性回归,逻辑回归等)配合使用时效果很好,尽管它也可以用于非线性模型的计算效率。
     
  • 请勿强行使用它以减少尺寸。 (当功能不相关时)
     
  • 尽管我们也可以使用t-SNE等非线性技术,但PCA仅限于线性。
     
  • PCA需要组件垂直,尽管在某些情况下,这可能不是最佳解决方案。另一种技术是使用独立成分分析。
     
  • PCA假定具有低方差的列无用,这在预测设置中可能不是正确的(尤其是类别不平衡的分类问题)

概要

  • PCA发现不相关的新基础/维度(主成分)。
  • 选择这些分量以捕获数据中的最大方差,即线上的数据投影应具有最大方差。
  • 依次找到组件,每次捕获增量方差。
  • 该过程可以解释为找到最接近数据的低维线/平面/表面。
    • 连同前M个主成分及其投影一起提供了得分向量和数据的最佳M维近似
    • 即如果M<p,那么我们发现了数据的低维近似

链接到笔记本: PCA说明

如果我们能够选择k<n,即k个主要成分,则基本上实现了降维,因为我们已将具有n个原始特征的m x n数据集缩减为具有k个主要成分的m x k数据集。

作者信息

塔瓦什·阿格瓦尔

网站: http://tavishaggarwal.com

塔瓦什·阿格瓦尔 是一名数据科学家 在海得拉巴工作,在解决电子商务,金融,医疗保健等不同领域的实际业务问题方面拥有丰富的经验。 他对技术充满热情,并且热爱团队合作。