原文发于个人博客
前言
说好的要做个有逼格的技术博客,虽然这篇依然没什么水平,但总算走出了第一步,希望以后每天都能进步一点点吧!
接触机器学习也一年多了,也学了很多算法,而PCA是数据预处理中一个很重要的算法,当时学习的时候也在网上看了很多资料,没想到一个简单的PCA也有着严密的数学推导,终于知道当年研究生考试为什么数学要考这么难了。
这篇文章主要是对PCA算法的一个总结,数学原理部分主要来自PCA的数学原理,并对其进行了总结(其实人家已经总结的很棒了),然后通过Scikit-learn中的一个例子讲解PCA的使用,最后用Python编写一个简单的PCA算法。
正文
数学概念介绍
方差:用来衡量随机变量与其数学期望(均值)之间的偏离程度。统计中的方差(样本方差)是各个数据分别与其平均数之差的平方的和的平均数。
协方差:度量两个随机变量关系的统计量,协方差为0的两个随机变量是不相关的。
协方差矩阵:在统计学与概率论中,协方差矩阵的每个元素是各个向量元素之间的协方差。特殊的,矩阵对角线上的元素分别是向量的方差。
—— 摘自百度百科
特别是协方差矩阵的概念非常重要。
PCA介绍
主成分分析(Principal Component Analysis),是一种用于探索高维数据的技术。PCA通常用于高维数据集的探索与可视化。还可以用于数据压缩,数据预处理等。PCA可以把可能具有线性相关性的高维变量合成为线性无关的低维变量,称为主成分(principal components),新的低维数据集会尽可能的保留原始数据的变量,可以将高维数据集映射到低维空间的同时,尽可能的保留更多变量。
注意:降维就意味着信息的丢失,这一点一定要明确,如果用原始数据在模型上没有效果,期望通过降维来进行改善这是不现实的,不过鉴于实际数据本身常常存在的相关性,我们可以想办法在降维的同时将信息的损失尽量降低。当你在原数据上跑了一个比较好的结果,又嫌它太慢模型太复杂时候才可以采取PCA降维。
PCA数学理论
基
二维空间默认(1,0)和(0,1)为一组基。
其实任何两个线性无关的二维向量都可以成为一组基。因为正交基有较好的性质,所以一般使用的基都是正交的。
例如:只有一个(3,2)本身是不能够精确表示一个向量的。这里的3实际表示的是向量在x轴上的投影值是3,在y轴上的投影值是2。也就是说我们其实隐式引入了一个定义:以x轴和y轴上正方向长度为1的向量为标准,默认选择(1,0)和(0,1)为基。
内积
向量A和B的内积公式为:
我们希望基的模是1,因为从内积的意义可以看到,如果基的模是1,那么就可以方便的用向量点乘基而直接获得其在新基上的坐标了,即 向量在基上的投影=向量与基的内积=坐标。
基变换的矩阵表示
将一组向量的基变换表示为矩阵的相乘。一般的,如果我们有M个N维向量,想将其变换为由R个N维向量(R个基)表示的新空间中,那么首先将R个基按行组成矩阵P,然后将待变换向量按列组成矩阵X,那么两矩阵的乘积就是变换结果。R可以小于N,而R决定了变换后数据的维数。也就是说,我们可以将一N维数据变换到更低维度的空间中去,变换后的维度取决于基的数量。
因此这种矩阵相乘可以表示降维变换: