python实现PCA

article/2025/10/13 18:14:05

★ PCA个人理解:

    PCA降维是通过变换坐标系,来尽可能的减少信息损失。

★ PCA思路:

    我们的初始矩阵为X,它是m×n维的矩阵,其中:m是该数据集有m条记录,n是每条记录中有n个特征,X的基本格式为:

                                              X=\begin{bmatrix} a_{11} &a_{12} &... &a_{1n} \\ a_{21}&a_{22} &... &a_{2n} \\ ...& ...& ...& ...\\ a_{m1}& a_{m2} &... &a_{mn} \end{bmatrix}_{m\times n}

我们看出矩阵X每一行就是一条记录,每一列就是特征,我们想要对它降维,也就是想让它从m×n维降到m×r维(n>r),那到底删除哪几列损失信息才最少?或者通过乘以一个满秩矩阵映射到其他坐标系让它特征变少?其实无论你是直接在原数据上删除某几列还是想通过坐标变换映射到其他基坐标系,都可以通过让X右乘一个满秩矩阵的形式来实现。

      设变换矩阵为P,P为n×r的满秩矩阵,原始数据集X经过P变换,成为Y(m×r维),即:Y=X•P,我们知道右乘一个满秩矩阵来进行坐标变换,其实就是数据向这些新的基向量上投影,而这个满秩矩阵P就是新的基向量组成的矩阵:

                       P = [ P1, P2,...Pr ]    其中Pi为一个列向量,也就是一个基向量

                      Y=X\cdot P=[b_{1},b_{2},...b_{r}]=\begin{bmatrix} b_{11}& b_{12}& ... &b_{1r} \\ b_{21} &b_{22}& ... &b_{2r}\\ ...& ...& ...&... \\ b_{m1}& b_{m2}& ... & b_{mr} \end{bmatrix}_{m\times r}

       原始数据集X我们是以单位矩阵E(n×n维)的每一列为基向量的,而Y我们是以{ P1,P2,...Pr }为基的。其实任何一个m×r维的满秩矩阵,都可以使原始矩阵X降维成m×r维,但是我们对降维后的数据有两个要求。

      (1.) 第一个要求:

     我们要求这变换后的矩阵Y,让它损失的信息最少,因为Y比原始矩阵X维数低,肯定在变换的过程中损失了一些信息,现在我们要求损失的信息最少,怎么衡量损失信息最少呢?我们想到:让变换后的数据散度最大。

      上图中是二维数据降维到一维:左图是选x轴为基向量降到一维,可以看到四个点投影到x轴,因为重合还剩两个点了,大量信息丢失了;左图还画出了以y轴为基向量,四个点往y轴上投影,因为重合所以还剩3个点了,也是丢失了一部分信息。而右图,我们往该基向量上投影,发现四个点的散度比左图的大(虽然不是最大),点没有重合,保留了4个点,因此,我们希望降维后的数据能够散度最大,才能尽量的减少信息损失。

      在数学中,我们描述分散程度用方差来表示,在变换后的数据集矩阵Y(m×r维)中,一个字段的方差可以看做是每个元素与字段均值的差的平方和的均值,把数据集Y按列表示:Y=[ b1, b2,...br]  其中 b_{i} (1≤i≤r)是一个列向量。

       再求出Y的每一列的均值为:(u1, u2, ...un),故根据公式,每一列的方差为(注意i和j的标识):

                            Var(b_{i}) = \frac{1}{m}\sum_{j=1}^{m}(b_{ji}-u_{i})^{2}\; \; \; \; 1\leq i\leq r

      我们看到上述公式不是很简洁,因为还有个均值ui这一项,这是因为我们没对原数据集X的每一列进行0均值化处理,假如对原数据X进行了0均值化处理了,那么经过P变换(Y=X•P)形成的Y矩阵的每一列也会0均值化(这个不信的话大家可以举个例子看看),即Y的每一列的均值就为0了,上述公式也就没有ui这一项了,因此我们需要先对原数据集X进行0均值化,0均值化大家都熟悉,就是每个数据减去它所在列的均值:

                               X=\begin{bmatrix} a_{11}-u_1 & a_{12}-u_{2}& ... &a_{1n}-u_{n} \\ a_{21}-u_{1} &a_{22}-u_{2} & ... &a_{2n}-u_{n} \\ ...& ...& ...&... \\ a_{mn}-u_{1} & a_{m2}-u_{2} & ... & a_{mn}-u_{n} \end{bmatrix}_{m\times n}

       而Y为:

                              Y=X\cdot P=[b_{1},b_{2},...b_{r}]=\begin{bmatrix} b_{11}& b_{12}& ... &b_{1r} \\ b_{21} &b_{22}& ... &b_{2r}\\ ...& ...& ...&... \\ b_{m1}& b_{m2}& ... & b_{mr} \end{bmatrix}_{m\times r}

      X零均值化后,经过P变换(Y=X•P)后的Y也是零均值化了,现在Y矩阵的每一列的方差公式就可以去掉均值(因为均值为0),Y每一列的方差为:

                          Var(b_{i}) = \frac{1}{m-1}\sum_{j=1}^{m}(b_{ji})^{2}\; \; \; \; 1\leq i\leq r

       Y均值化后,上述公式可写为矩阵形式:

                          Var (b_{i})= \frac{1}{m-1}(bi^{T}\cdot b_{i})

     (2.)  第二个要求:

     我们要求变换后的Y矩阵每一列(一列就是一个字段)之间都是不相关的,在数学中,描述变量之间的相关性可用协方差来描述,只要让协方差为0,就说明这两个变量(字段)线性无关,其实这个要求也好理解,假如降维后的Y矩阵,有某两列线性相关,那么其中一列肯定可以用令一列表示出来,那么给人的感觉就是这两列表达的信息重复了,既然是重复的列完全可以删除,所以才要求任意两列都是线性无关的,即任意两列协方差为0,比如Y中的任意两个字段(列)bp、bq,这两个字段的协方差为:

                         Cov(b_{p},b_{q})=\frac{1}{m-1}\sum_{j=1}^{m}b_{jp}\cdot b_{jq}\; \; \; \; \; \; p,q\in (1,r)

      ✿ 注意:因为Y已经被我们零均值化了,因此协方差公式中的均值是0,我们就不必要写出了,所以上述公式才会变得如此简洁,这就是零均值化的好处。

      上式可以写为矩阵形式:

                       Cov(b_{p},b_{q})=\frac{1}{m-1}(b_{p}^{T}\cdot b_{q})\; \; \; \; \; \; p,q\in (1,r)

      如果p,q你看不习惯,你可以换成i,j,只是表示符号不同而已:

                       Cov(b_{i},b_{j})=\frac{1}{m-1}(b_{i}^{T}\cdot b_{j})\; \; \; \; \; \; i,j\in (1,r)

     现在我们来综合一下对降维后的矩阵Y的两个要求:一是、让Y每一列的自身方差最大;二是、让Y任意两列的协方差为0。

     我们正好想到,Y的协方差矩阵,不正好就是这两个要求吗?因为Y被我们零均值化,所以,它的协方差矩阵,我们可以写为矩阵形式:

                          Cov(Y) = \frac{1}{m-1}Y^{T}\cdot Y=\frac{1}{m-1}\begin{bmatrix} b_{11}& b_{12}& ... &b_{1r} \\ b_{21} &b_{22}& ... &b_{2r}\\ ...& ...& ...&... \\ b_{m1}& b_{m2}& ... & b_{mr} \end{bmatrix}^{T}\cdot \begin{bmatrix} b_{11}& b_{12}& ... &b_{1r} \\ b_{21} &b_{22}& ... &b_{2r}\\ ...& ...& ...&... \\ b_{m1}& b_{m2}& ... & b_{mr} \end{bmatrix}

                                          =\frac{1}{m-1}\begin{bmatrix} b_{11}& b_{21}& ... &b_{m1} \\ b_{12} &b_{22}& ... &b_{m2}\\ ...& ...& ...&... \\ b_{1r}& b_{2r}& ... & b_{mr} \end{bmatrix}\cdot \begin{bmatrix} b_{11}& b_{12}& ... &b_{1r} \\ b_{21} &b_{22}& ... &b_{2r}\\ ...& ...& ...&... \\ b_{m1}& b_{m2}& ... & b_{mr} \end{bmatrix}

                                         =\begin{bmatrix} Var(b_{1}) & Cov(b_{1},b_{2})& ... &Cov(b_{b1},b_{r}) \\ Cov(b_{2},b_{1})& Var(b_{2}) & ... & Cov(b_{2},b_{r})\\ ...&... & ... &... \\ Cov(b_{m,}b_{1})& Cov(b_{m},b_{2}) &... &Var(b_{r},b_{r}) \end{bmatrix}_{m\times r}

     我们的要求是让Y每一列自身方差最大,任意两列协方差为0,正好不就是让Y的协方差矩阵Cov(Y)的对角线元素最大,让非对角元素为0,就是让 Y^{T}\cdot Y 是对角阵,且让这个矩阵的对角元素最大。也就是我们期望Cov(Y)是这个形式:

                         Cov(Y)=\frac{1}{m-1}Y^{T}\cdot Y=P^{T}(\frac{1}{m-1}X^{T}X)P=\begin{bmatrix} \lambda _{1} & 0 & ... & 0\\ 0& \lambda _{2} & ... &0 \\ ...&... &... &... \\ 0 & 0& ...& \lambda _{r} \end{bmatrix}_{r\times r}

     我们回想一下,P是n×r的满秩矩阵,我们的目的是找到这么一个矩阵P,使得Y^{T}\cdot Y满足上述要求,而上述公式根据大学学的线性代数,这个问题非常类似实矩阵对角化问题。

     因为\frac{1}{m-1}X^{T}\cdot X是实对称矩阵,所以一定可以相似对角化,且特征值\lambda _{i}\geq 0\; \; \; \; i\in (0,r),即存在满秩矩阵Q(n×n维)使得:

                                 Q^{-1}(\frac{1}{m-1}X^{T}X)Q=Q^{T}(\frac{1}{m-1}X^{T}X)Q=\Lambda =\begin{bmatrix} \lambda _{1} & 0 & 0 & 0\\ 0& \lambda _{2}& 0&0 \\ ...& ...& ... &... \\ 0& 0 & 0 & \lambda _{n} \end{bmatrix}_{n\times n}

      而这个正交矩阵Q是由特征向量组成的矩阵[ Q1, Q2,...Qn ],且Qi是与\lambda _{i}的顺序对应的,我们假设对角阵中的\lambda _{i}从大到小排列起来了,即\lambda _{1}\geq \lambda _{2}\geq ...\lambda _{n},那么对应的特征向量Qi也要根据\lambda _{i} 的顺序排列好,我们观察目标矩阵Cov(Y)和对角化矩阵\Lambda,发现Cov(Y)矩阵是\Lambda的一部分,我们需要Cov(Y)的对角元素最大,也就是要取\Lambda中的\lambda _{i}最大的几个,而P也是根据选取的\lambda _{i}而从Q中选取。比如我们要降维到m×r维,只需取\Lambda中前r个特征值,然后从Q中找到这r个特征值对应的特征向量[ Q1,Q2,...Qr ],这些特征向量组成的矩阵就是我们要找的P矩阵。

★ 代码:

    (1). 数据集:https://github.com/zhangqingfeng0105/Machine-Learn/blob/master/PCA_data_set/pca_data_set1.txt

                           https://github.com/zhangqingfeng0105/Machine-Learn/blob/master/PCA_data_set/pca_data_set2.txt

    (2.) 算法流程:

     ① 对原数据集零均值化。代码是:meanRemoved = dataMat - mean(dataMat,axis=0)

     ② 求出均值化X的协方差矩阵:公式是:Cov(X)=\frac{1}{m-1}X^{T}X,代码是:covMat = cov(meanRemoved,rowvar=0)

     ③ 求这个协方差矩阵的特征值,特征向量,代码是:eigVals, eigVects = linalg.eig(mat(covMat))

     ④ 把这些特征值按从大到小排列,返回特征值的下标,代码是:eigValInd = argsort(-eigVals)

     ⑤ 选出前topNfeat个特征值,返回这些选中的特征值的下标,并根据下标从特征向量矩阵eigVects中取出这些选中的特征向量组成矩阵P,这就是我们要找的变换矩阵P,代码是:redEigVects = eigVects[:,eigValInd[:topNfeat] ]

     ⑥ 返回降维后的数据,公式是:Y=X•P,代码是:lowDDataMat = meanRemoved * redEigVects

     ⑦ 原数据映射到新的空间中。公式是:X^{'}=Y\cdot P^{T}+mean,代码是:reconMat = (lowDDataMat * redEigVects.T) + meanValues

from numpy import *
import matplotlib.pyplot as pltdef loadDataSet(fileName):dataSetList = []fr = open(fileName)for row in fr.readlines():cur_line = row.strip().split('\t')proce_line = list(map(float,cur_line))dataSetList.append(proce_line)dataSetList = array(dataSetList)return dataSetListdef pca(dataMat, topNfeat = 999999):meanValues = mean(dataMat,axis=0) # 竖着求平均值,数据格式是m×nmeanRemoved = dataMat - meanValues  # 0均值化  m×n维covMat = cov(meanRemoved,rowvar=0)  # 每一列作为一个独立变量求协方差  n×n维eigVals, eigVects = linalg.eig(mat(covMat)) # 求特征值和特征向量  eigVects是n×n维eigValInd = argsort(-eigVals)  # 特征值由大到小排序,eigValInd十个arrary数组 1×n维eigValInd = eigValInd[:topNfeat]  # 选取前topNfeat个特征值的序号  1×r维redEigVects = eigVects[:,eigValInd] # 把符合条件的几列特征筛选出来组成P  n×r维lowDDataMat = meanRemoved * redEigVects  # 矩阵点乘筛选的特征向量矩阵  m×r维 公式Y=X*PreconMat = (lowDDataMat * redEigVects.T) + meanValues  # 转换新空间的数据  m×n维return lowDDataMat, reconMatdef drawPoints(dataset1,dataset2):  # 画图,dataset1是没降维的数据,dataset2是数据映射到新空间的数据fig = plt.figure()ax1 = fig.add_subplot(211)ax2 = fig.add_subplot(212)ax1.scatter(dataset1[:,0],dataset1[:,1],marker='s',s=40,color='red')dataset2 = array(dataset2)ax2.scatter(dataset2[:,0],dataset2[:,1],s=40,color='blue')plt.show()if __name__ == '__main__':data = loadDataSet('/home/zhangqingfeng/test/PCA_data_set/pca_data_set1.txt')proccess_data, reconMat = pca(data,1)drawPoints(data,reconMat)

★ 运行结果:

   (1.) 测试集pca_data_set1.txt

    (2.) 测试集pca_data_set2.txt

 


http://chatgpt.dhexx.cn/article/iGFbav3p.shtml

相关文章

PCA降维算法

目录 1.维度1.1数据维度1.2特征维度 2.sklearn中的降维算法2.1PCA与SVD2.2降维的实现2.3重要参数n_components2.3.1最大似然估计自选超参数2.3.2 按信息量占比选超参数 3.PCA中的SVD3.1重要参数svd_solver 与 random_state3.2重要属性components_3.3重要接口inverse_transform …

PCA降维

一、主成分分析 1、动机:多个变量之间往往存在一定的相关性,可以通过线性组合的方式从中提取信息。 2、主成分分析:将原始的n维数据投影到低维空间,并尽可能的保留更多的信息。 ---投影后方差最大 ---最小化重构误差 从而达到…

pca绘图

pca 1 PCAtools 1.1 加载R包 library(PCAtools) library(tidyverse)1.2 加载数据&#xff0c;构建表达矩阵和分组信息&#xff08;以iris为例&#xff09; iris <- as.data.frame(iris) iris <- iris %>% mutate(class str_c("a",1:dim(iris)[1],sep …

PCA算法详解

文章出处&#xff1a;http://blog.csdn.net/zhongkelee/article/details/44064401 一、PCA简介 1. 相关背景 上完陈恩红老师的《机器学习与知识发现》和季海波老师的《矩阵代数》两门课之后&#xff0c;颇有体会。最近在做主成分分析和奇异值分解方面的项目&#xff0c;所以记…

PCA 算法详解

PCA算法步骤&#xff1a; 设有m条n维数据。 1&#xff09;将原始数据按列组成n行m列矩阵X 2&#xff09;将X的每一行&#xff08;代表一个属性字段&#xff09;进行零均值化&#xff0c;即减去这一行的均值 3&#xff09;求出协方差矩阵 4&#xff09;求出协方差矩阵的特征值及…

PCA原理

PCA 各位&#xff0c;久违了&#xff5e; 什么是PCA&#xff1f; 什么是PCA呢&#xff1f;这是一个问题&#xff0c;什么样的问题&#xff1f;简单而又复杂的问题&#xff0c;简单是因为百度一下就会出现一大堆的解释&#xff0c;复杂是因为它里面蕴含的内容还是很多的&…

python实现PCA降维

本文包括两部分&#xff0c;使用python实现PCA代码及使用sklearn库实现PCA降维&#xff0c;不涉及原理。 总的来说&#xff0c;对n维的数据进行PCA降维达到k维就是&#xff1a; 对原始数据减均值进行归一化处理&#xff1b;求协方差矩阵&#xff1b;求协方差矩阵的特征值和对…

PCA算法

主成分分析&#xff08;Principal components analysis&#xff0c;以下简称PCA&#xff09;是最重要的降维方法之一。 参考&#xff1a;http://www.cnblogs.com/pinard/p/6239403.html PCA的思想 PCA顾名思义&#xff0c;就是找出数据里最主要的方面&#xff0c;用数据里最…

PCA

R语言实现PCA 一次来自男神MR.来的作业PCA读取数据PCA主体部分输出PCA的主要结果&#xff0c;列出主成分分析分析结果利用碎石图来展示PCA结果对component进行一些解释 简略分析利用PCA结果来进行一个排序下面进行聚类分析 一次来自男神MR.来的作业 PCA 读取数据 #读取数据&…

主成分分析(PCA)原理详解

转载请声明出处&#xff1a;http://blog.csdn.net/zhongkelee/article/details/44064401 一、PCA简介 1. 相关背景 上完陈恩红老师的《机器学习与知识发现》和季海波老师的《矩阵代数》两门课之后&#xff0c;颇有体会。最近在做主成分分析和奇异值分解方面的项目&#xff0c…

PCA详解

本文目录 一、来源及作用存在问题基本作用 二、 基本原理及求解步骤核心思想如何选择投影方向 三、原理分析最大投影方差最小重构代价 四、SVD与PCA的关系 一、来源及作用 存在问题 在我们训练模型的过程中&#xff0c;有时会出现在训练集上误差较小&#xff0c;但到了测试集误…

主成分分析法(PCA)

主成分分析&#xff08;Principal components analysis&#xff0c;以下简称PCA&#xff09;是最重要的降维方法之一。在数据压缩消除冗余和数据噪音消除等领域都有广泛的应用。一般我们提到降维最容易想到的算法就是PCA&#xff0c;下面我们就对PCA的原理做一个总结。 目录 …

主成分分析(PCA)方法步骤以及代码详解

主成分分析&#xff08;PCA&#xff09;方法步骤以及代码详解 前言 上一节我们了解到在构建神经网络模型&#xff0c;除了掌握如何搭建神经网络架构&#xff0c;了解参数具体含义&#xff0c;规避风险等方法。第一步是要对采用数据集的详细了解&#xff0c;无需接触任何神经网…

机器学习——PCA降维(我至今为止遇见的最好的博文)

参考文章&#xff1a;https://zhuanlan.zhihu.com/p/77151308 PCA&#xff08;Principal Component Analysis&#xff09; 是一种常见的数据分析方式&#xff0c;常用于高维数据的降维&#xff0c;可用于提取数据的主要特征分量。 PCA 的数学推导可以从最大可分型和最大重构性…

通达OA工作流数据报表二次开发版

此模块除具备工作流——数据报表所有功能外&#xff0c;新加入的功能包括&#xff1a; 1&#xff1a;查询条件自带可查询未完成的流程&#xff1b; 2&#xff1a;查询条件可设置查询所有子流程的字段&#xff1b; 3&#xff1a;报表可显示流程当前处理人&#xff0c;并且点击每…

开发通达OA工作流接口从ERP自动生成OA请款单(图文)

ERP系统很多不带审批系统&#xff0c;即使有审批系统的话应用起来也不那么容易&#xff0c;因为领导一般都是不使用ERP系统的&#xff0c;那么我就用通达OA来完成ERP的单据审批吧&#xff0c;是不是很酷呢&#xff0c;而且还支持移动端app和微信审批。 ERP端的数据发起由ERP方…

OA工作流引擎:作为组织血脉支撑的重要性解析

前面提到协同OA管理平台是以“人和事”为管理对象&#xff0c;但如何把“人和事”通过一定的方法能全部贯通起来呢。就如同一个人&#xff0c;有手、脚、嘴、头脑等各种器官&#xff0c;但如何能把这些器官充分的调动起来&#xff0c;里面最核心的还是人的血液&#xff0c;OA系…

通达OA 工作流运行异常情况的紧急处理(图文)

本文整理自通达OA技术交流群&#xff08;QQ群号&#xff1a;378591362&#xff09;群友交流内容。 一位朋友的工作流设计和运行突然出现故障&#xff0c;显示的数据部分都不正常&#xff0c;如下图&#xff1a; 经过重启所有服务&#xff08;包括缓存服务&#xff09;现象依旧。…

通达OA二次开发 小飞鱼应用OA工作流二次开发智能公文系统(三)(图文)

流程流转完毕后&#xff0c;会自动进行归档&#xff0c;默认存成10年存档目录&#xff0c;并且可以在多个存档年限中进行调整切换。点击流程文号可以直接查看具体的流程表单及执行记录。 如果不需要对部门进行管理时&#xff0c;可以直接使用ajax方式快速将存档年限进行修改切换…

通达OA 工作流流转过程中使用系统自带的提醒功能设置(图文)

在流程流转过程中&#xff0c;可以通过增加步骤的方式来提醒相关人员。其实可以使用系统自带的提醒功能&#xff0c;比如需要在某一步骤提醒流程发起人&#xff0c;就可以在提醒设置下设置提醒发起人&#xff0c;有3个选项可选&#xff0c;其中使用手机短信需要短信猫的支持&am…