降维算法实现原理

0. 前言

上篇博客对于维度以及降维相关概念进行了说明,下面将对降维的实现过程进行说明。

1. 概述

前面也提到了,降维就是要减少特征的数目,也就是说会删除一部分数据,而在训练模型的时候,数据减少可能会影响模型的最终表现。除此之外,高维数据中,有一些特征是无效的,还有些特征可能是线性相关的。如果能有一种算法可以衡量特征上的信息,使得在降维的过程中,在减少特征数量的同时又能保留更多的有效的信息(想兼得鱼和熊掌)。也就是说,将那些重复的信息(线性相关的)合并一下,把无效的特征删除掉,得到一个保留原来特征矩阵大部分信息且特征数目比原来少的新的特征矩阵。

在特征选择方法中,有一种方法是:方差过滤法,即如果一个特征的方差很小,则表明这个特征很大可能大量取值相同(即90%为1, 10%为0,甚至是100%都为1;也就是说这个特征对于分类没啥影响,属于无效的信息)。

1.1 降维实现过程

PCA使用的信息衡量指标——样本方差(可解释性方差),方差越大,特征所带的信息量越大。

样本方差公式:

V a r = 1 n − 1 ∑ i = 1 n ( x i − x ˉ ) 2 Var=\frac{1}{n-1} \sum_{i=1}^{n}\left(x_{i}-\bar{x}\right)^{2} Var=n11i=1n(xixˉ)2

其中,Var表示某个特征的方差;n表示样本的数目; x i x_i xi表示某个特征下,每个样本的取值; x ˉ \bar x xˉ表示某个特征下这些样本的均值。

补充:
此时,对这个公式的分母存在疑问,为什么是n-1而不是n呢?
为了得到样本方差的无偏估计,所以是n-1。

关于降维是怎么实现的,先通过一个例子来进行说明。下面表格是一组简单的数据,有两个特征 x 1 x_1 x1 x 2 x_2 x2

X1 X2
1 1
2 2
3 3
x ˉ 1 \bar x_1 xˉ1 = 2 x ˉ 2 \bar x_2 xˉ2 = 2

x 1 x_1 x1 x 2 x_2 x2的方差为:

x 1 x_1 x1_ v a r var var = ( 1 − 2 ) 2 + ( 2 − 2 ) 2 + ( 3 − 2 ) 2 3 − 1 (1-2)^2+(2-2)^2+(3-2)^2\over3-1 31(12)2+(22)2+(32)2 = 1

x 2 x_2 x2_ v a r var var = ( 1 − 2 ) 2 + ( 2 − 2 ) 2 + ( 3 − 2 ) 2 3 − 1 (1-2)^2+(2-2)^2+(3-2)^2\over3-1 31(12)2+(22)2+(32)2 = 1

方差和 V a r = 1 + 1 = 2 Var = 1+1=2 Var=1+1=2

因为是二维的,所以可以将其看成坐标点(1, 1),(2, 2),(3, 3),在坐标轴有如下表示:

import numpy as np
import matplotlib.pyplot as plt
data = np.array([[1, 1], [2, 2], [3, 3]])
plt.scatter(data[:, 0], data[:, 1], c="red", s=50)
# 设置x和y轴的长度,都为[0, 4]
plt.axis([0, 4, 0, 4])
plt.show()

在这里插入图片描述

现在,想将上面的二维数据降维,降成一维数据,用一个特征向量来表示这组数据,还要让数据总方差尽可能接近原来的值2。

先将直角坐标系逆时针旋转 4 5 o 45^o 45o,即如下图:
在这里插入图片描述
此时,这三个点在X1’上,其坐标可以有如下表示:
( 1 2 + 1 2 ) = 2 \sqrt{(1^2+1^2)} = \sqrt2 (12+12) =2
( 2 2 + 2 2 ) = 2 2 \sqrt{(2^2+2^2)} = 2\sqrt2 (22+22) =22
( 3 2 + 3 2 ) = 3 2 \sqrt{(3^2+3^2)} = 3\sqrt2 (32+32) =32

X1’ X2’
2 \sqrt2 2 0
2 2 2\sqrt2 22 0
3 2 3\sqrt2 32 0
x ˉ 1 = 2 2 \bar x_1 = 2\sqrt 2 xˉ1=22 x ˉ 2 = 0 \bar x_2 = 0 xˉ2=0

此时,X2’上的值都为0了,即这就不代表有效信息了,此时方差计算如下:

x 1 ′ x_1' x1_ v a r var var = ( 2 − 2 2 ) 2 + ( 2 2 − 2 2 ) 2 + ( 3 2 − 2 2 ) 2 3 − 1 (\sqrt2-2\sqrt2)^2+(2\sqrt2-2\sqrt2)^2+(3\sqrt2-2\sqrt2)^2\over3-1 31(2 22 )2+(22 22 )2+(32 22 )2 = 2

x 2 ′ x_2' x2_ v a r var var = 0

故总的方差为Var = 2+0 = 2
因为 X 2 ′ X_2' X2已经没有有效信息了,所以可以将其删除了,即上图中的 X 2 ′ X_2' X2特征向量也可以删除,所以这就成功将之前的二维降成了一维,用 X 1 ′ X_1' X1就可以表示之前用两个特征表示的三个样本点。

X1’
2 \sqrt2 2
2 2 2\sqrt2 22
3 2 3\sqrt2 32

上面是通过旋转原有的特征向量组成的坐标轴形成新的特征向量和坐标平面,将3个样本的信息压缩到一个特征向量上,实现了将二维降到一维。

1.2 降维重要步骤

上面通过一个简单的例子对怎么降维的过程进行了说明,下面通过2维推广至n维:

1.2.1 二维特征矩阵
  1. 输入数据,例如(3, 2)表示3个样本,2维特征;找到这2个特征构成的二维平面(对应的坐标系);
  2. 确定降维后的特征数量:1
  3. 旋转坐标轴,找2个新的特征向量(新的坐标系)以及构成的新的2维平面;
  4. 找样本点在新的坐标系上的坐标;
  5. 选择1个方差最大的特征向量,删掉没选的特征,将2维降成1维。
1.2.2 n维特征矩阵
  1. 输入数据,例如(m, n)表示m个样本,n维特征;找到这n个特征构成的n维空间;
  2. 确定降维后的特征数量:k
  3. 通过变换,找n个新的特征向量(新的坐标系)以及构成的新的n维空间;
  4. 找样本点在新的特征空间上n个新特征向量上对应的值(将原始数据映射到新的空间中);
  5. 选择前k个方差最大的特征,删掉没选的特征,将n维降成k维。

在上面的步骤3中,找n个新的特征向量,此时让数据压缩到少数特征且总的信息还不能损失太多的技术就是矩阵分解

PCA和SVD是2种比较常见的降维算法,其实现降维的过程都同上面的步骤,区别在于它们矩阵分解的方法不同,信息量衡量的指标不一样。

猜你喜欢

转载自blog.csdn.net/weixin_41857483/article/details/109598395