维数约减是一种无监督学习,它是通过对数据降维来解决数据对硬盘、内存占用过大,以及训练速度慢的问题.
另外它也是一种强力的数据可视化工具,很多高维数据难以可视化,这时我们可以通过将他们降维至二维或三维进行可视化.
在我们的数据中有很多特征非常相似,比如说这两个特征:
现在我们来旋转一下坐标系:
这就是维数约减的原理.PAC是常见的维数约减算法.
如果我们找到了一个正确的向量来代替原来的纬度,那么原数据在这个向量上都投影的距离会很远:
如果我们找到的向量是错误的,那么原数据在这个向量上都投影的距离会很小:
根据这个原则,我们可以建立我们的优化方程.我们希望找到方向,如果,那么向量在上的投影的长度为,所以最优的u会使投影的长度最大,即:
这个公式可以整理成如下形式:
我们发现中间的式子刚好是数据的协方差矩阵:
则原式可以写为:
条件可以写为
这是一个有约束的优化问题,我们可以用拉格朗日定理求极值:
极值处导数为0,所以对拉格朗日函数求导,得:
即:
这与特征向量的定义相吻合,所以为的特征向量.
在实际运用PAC的时候,我们并不会这样去计算协方差矩阵:
如果数据的特征数非常多的话,比如说,那么协方差矩阵会非常庞大.
对奇异值分解可以轻松的得到的特征向量:
其中就是的特征向量.
现在我们计算出了新的纬度,但是这个维度和原理的纬度大小是一样的,仅仅是用这个维度相当于将原来的数据换了个坐标系,并不能做到压缩纬度的目的.我们需要取中比较重要的纬度,即奇异值比较大的k个维度:
对于向量B在向量A上的投影,计算方法为,同样的对于在上的投影为:
PCA还可以以另外一种思路来理解,我们把数据的矩阵看成是由各"分力"的叠加,"分力"的方向就是特征向量的方向,"分力"的大小就是特征值.我们可以使用奇异值分解求出的特征向量,与特征值.维度约减就是忽略"分力"较小的方向,只考虑"分力较大的方向".关于奇异值分解(SVD)的内容参考我的另一篇文章奇异值分解(SVD)的理解及其在机器学习中的应用.
编程实现:
https://www.kaggle.com/swimmingwhale/principal-component-analysis
参考:
http://cs229.stanford.edu/
https://www.coursera.org/learn/machine-learning