大家好 我是 Jay 这节课
我们要讨论的是降维
我们学习的第一个方法是随机投影
这是一个很有效的降维方法
在计算上比主成分分析更有效率
它通常应用于 当一个数据集里有太多维度
主成分分析无法直接计算的情境下
假定运行你的应用程序的系统计算资源有限
或者你发现 在你所处具体情境下 主成分分析太繁重
就像主成分分析 这需要一个数据集
假定这是我们的 d 维度数据集 设 d 为 1000
及某些样本数组成行
设其为 N 所以这些是我们的列
它需要我们的数据集 并将其转化成
数量少得多的 k 个列
此例中设为 50
样本数不变
此处的每个列
从另一处多个列中采集信息
我们来看一个简单化的例子
将一个数据集的维度从二维降至一维
主成分分析会试着将方差最大化
它寻找将方差最大化的矢量或方向
所以 当它将数据从二维投影为一维时
它损失最少的信息
那这条线就会像这样
这些就是投影
在一维里
该数据集看上去就是这样
随机投影 进行主成分分析做过的计算
尤其是存在很多维度时
它会消耗一定量的资源
随机投影只是表示
我们会选择一条线 任何一条
在那条线上进行投射 这就是我们的数据集
它在某些情境下没有太大意义
在我们简化了的从二维到一维的情境下
它其实是有作用的 在更高维度的效果更好
且工作效能很高
随机投影的基本前提是
我们可以用数据集乘以一个这样的随机矩阵
来减少其中的维度数量
我们的数据集里有 d
但是 k 要么是我们计算的
要么是我们要得出的
我们也有方法可以计算 k 的一个保守估计
或合适的估值 这就是产生的数据集
乘以一个随机矩阵
在某种程度上 这就是全部的随机投影
我们举一个具体的例子 假定这是我们的数据集
它有 12000 个维度
这是 d
它有 1500 行或样本
如果我们把它交给 Scikit-learn 问它 “Scikit-learn
你能只用默认值对这个数据及进行随机投影吗？”
它给出的是这个数据集
它有 6200 个维度 显然样本数不变
我们怎么知道它起了作用呢？
我们怎么知道 k 是怎么来的呢？
支撑随机投影的
是 Johnson-Lindenstrauss 引理
该引理认为 处于高维度空间的 有 N 个点的数据集 比如这个数据集
12000 的高维度空间端点很高
只要乘以随机矩阵
就可以被映射成很低维度的空间
即这个缩小的数据集
某种程度上这就是它的重要之处
因为它可以在很大程度上
保留点之间的距离
所以该数据集投影后
每两点之间的距离 每对之间的距离
在某种程度上可以得到保留
这很重要 因为在
大部分或许多监督学习与非监督学习中
很多算法和点之间的距离大有关联
所以我们要保证
这些距离会有些失真
但可以得到保留
那如何保留呢？
我们又如何保证呢？
我们简单举个例子来实际计算一下
假定我们取这里的头两行
这一行和这一行
我们数据集里的头两个点
这就是它们投影后的值
即 同样的样本 不同的维度水平
Johnson-Lindenstrauss 引理指出 投影后两点距离的
平方值稍有压缩
它大于原数据集里两点距离的平方值
乘以 (1-eps) 的值
Epsilon 就类似于
我们在此次投影中可接受的随机投影的误差
所以 投影后的数据集里两点距离
大于 (1-eps)
乘原数据集里两点距离的平方值
且小于 (1+eps) 乘原数据集里两点距离的平方值
我实际上算出了这些数字
这两点之间的距离为 125.6
我们放在这里
Epsilon 的默认值
我们没做任何改动
在 Scikit-learn 里的默认值就为 0.1
它可以取 0 到 1 的任何数值
如果我们像这样做
这两点之间的距离为 125.8
那么 这个距离会比该距离平方值的
0.9 倍大 且比该距离平方值的 1.1 倍小
你会发现 Epsilon 有点像一个操纵杆
它用于计算产生了多少列
并且是我们在此降维中可接受的
失真的误差水平
这就产生了保障
保持了数据集里每对点之间的距离
这不仅是关乎 1 和 2
它关乎 1 和其他任何点
关乎 2 和其他任何点
在该保障下
Epsilon 只是经我们输入到函数中
用来在此程度上保持距离