香蕉树上第六根芭蕉——PCA算法python实现和思考-站在巨人肩膀上

 看了一些前辈关于PCA算法博客之后,心里还是有些想法,首先的是别人写的很好,自愧才疏学浅,要多向他们学习,在他们博客里,还是有些点由于鄙人才学之后才想清楚的,所以一一在此做个说明及自己练习下。

 首先说的是PCA算法到底是什么,这些可以在我前面转载的博客里说的很清楚,核心就是如何找到几个特征向量,而一个特征向量代表是一个目标基一部分,若原矩阵沿着这几个特征向量分解()这几个特征向量构成一个基)就可以使其转换后的向量可以在方差最大,也就是说在同一个特征向量下的投影差别最大。至于基转换的理论,可以看我上一篇博客转发的,说的很好,除了没图。

好了,问题提出来了,如何满足这个条件呢,看下图推导:

思考1:为什么上面推导中方差只剩下一项,原因是此时处理原数据集是一般会采用方法是中心化,所谓中心化就是会将每列值减去每列平均数,你想想如果每列都减去了自己的平均数,而这个每列就是一个完整数据个体,这样这个数据个体期望不就是变成0了嘛,这个还会在代码中体现。而现在也可以回答了,为什么要去中心化,目的就是为了简化计算嘛。

好了,有了这个公式就好办了,说来说去不就是要求样本集的协方差矩阵,然后求其特征值和特征向量就可以了。至于说协方差矩阵的特征值和特征向量和原数据集变换有啥关系,这个可就是关系大了,因为你要看到上面推导中使用了拉格朗日乘数法,而这个乘数法就是有个约束条件的,那么这个约束条件就是只有a为协方差矩阵特征向量时成立!!!如果不懂还可以具体去参考这位前辈的呢。https://www.cnblogs.com/lzllovesyl/p/5235137.html#3908833。

那么现在如何用代码实现呢,如下:

     

首先做的是读入数据值, 进行数据处理看下面程序:

以上程序是进行数据处理的,需要说明的是这个过程一定要进行 特征值所占比例计算,程序如下:

需要注意的点都在注释里,一定要亲自动手实现才是硬道理,否则一切都是空谈。还要注意的是return两个矩阵是一定要注意要用两个变量去接受,否则这是不容易发现的错误,还有就是array和mat区别就是,加array是为了获得数组,而mat仅仅是为了获得numpy计算便利。

猜你喜欢

转载自blog.csdn.net/qq_34327821/article/details/81606995
今日推荐