一、SVD概念
利用SVD实现,我们能够用小得多的数据集来表示原始数据集。这样做,实际上是去除了噪声和冗余数据。
当我们试图节省空间时,去除信息就是很有用了。但是在这里我们则是从数据中抽取信息。基于这个视角,我们就可以把SVD看成是从噪声数据中抽取相关特征。
二、SVD能够进行数据约减的原因
1、在很多情况下,数据中的一小段携带了数据集中的大部分信息,其他信息则要么是噪声,要么是毫不相关的信息。
2、SVD是一种常见的矩阵分解技术,SVD将原始的数据集矩阵Data分解成三个矩阵,如下公式所示:
由公式可以看出如果原始矩阵Data是m行n列,那么分解成的三个矩阵U, ,V依次是m行m列,m行n列,n行n列。
矩阵的对角元素是从大到小排列的。这些对角元素成为奇异值(SingularValue),他们对应了原始数据集矩阵Data的奇异值。奇异值和特征值是有关系的,这里的奇异值就是矩阵Data*(Data的转置)特征值的平方根。
因为 矩阵的对角元素是从大到小排列的,在科学和工程中,一直存在这样一个普遍事实:在某个奇异值的数目(r个)之后,其他的奇异值都置为0。这就意味着数据集中仅有r个重要特征,而其余特征则都是噪声或者冗余特征。
上面可以看到:Simga只有一行,这是因为,由于矩阵除了对角元素其他均为0,因此这种仅返回对角元素的方式能够节省空间,这就是由Numpy的内部机制产生的。我们所要记住的就是:一旦看到Sigma就知道他是一个矩阵。
上面可以看到:Simga中前三个数值比其他的值大多了,所以我们的原始数据集Data可以用如下结果近似:
问题:我们是如何知道保留前三个奇异值的呢?
策略1:确保要保留的奇异值的数目有很多启发式的策略,其中一个典型的做法就是保留矩阵中90%的能量信息。为了计算总能量信息,我们将所有的奇异值求其平方和。于是可以将奇异值的平方和累加到总值的90%为止。
策略2:当数据有上万的奇异值时,那么就保留前面的2000或3000