php如何做局域网的网站建设,新宫网站建设公司,网站治做啊app,c 网站开发 书众所周知#xff0c;PCA(principal component analysis)是一种数据降维的方式#xff0c;能够有效的将高维数据转换为低维数据#xff0c;进而降低模型训练所需要的计算资源。以上是比较官方的说法#xff0c;下面是人话(正常人讲的话)版。pca就是一种能够有效压缩数据的方…众所周知PCA(principal component analysis)是一种数据降维的方式能够有效的将高维数据转换为低维数据进而降低模型训练所需要的计算资源。以上是比较官方的说法下面是人话(正常人讲的话)版。pca就是一种能够有效压缩数据的方法打个不太准确的例子我们现在有一个描述人的健康状况的数据(年龄身高体重地区血压心率肺活量体温体脂)也就是说(年龄身高体重地区血压心率肺活量体温体脂)这些东西是特征而这些特征对应的标签是健康状况健康/亚健康/不健康。那么pca就是通过一些方法将这9个特征压缩到只有4个3个甚至更少的特征(暂且称之为x1, x2, x3, x4)但是我们仍能用这些特征来准确预测它们对应的健康状况。在这里补充一下在数学/机器学习中我们会把特征抽象为向量比如上面提到的健康状况的数据(年龄身高体重地区血压心率肺活量体温体脂)我们会抽象为(18, 180, 70,广东,100,80, 5000, 37, 0.1),其中地区这一项显得与众特别毕竟其他的维度都是数值就它是文字。我们把这样的维度称为类别因为它是在有限的选项中选出来的(从世界上所有的地区中取一个)在计算机中表示这样的信息我们可以有很多方式但是为了简化难度这边我就暂且不搞直接把这一列删掉。于是乎我们的数据(其实就是向量)就是(18, 180, 70, 100, 80, 5000, 37, 0.1)值得一提的是这样的一个数据是属于一个实体的(也就是说这是描述一个人的健康状况的)在机器学习中我们倾向于将一个实体的数据排成一列也就是(18, 180, 70, 100, 80, 5000, 37, 0.1)^T(转置)。本文要介绍的目录为使用PCA的必要性PCA的本质前置知识的介绍PCA的数学原理PCA的思想PCA的实现使用PCA的必要性前面说了pca就是将高维(很多列属性)数据转换为低维(较少列)数据的方法同时保留大部分信息(可以用保留的信息准确预测)。但是我们可能会想如果我不压缩的话那我不就可以有100%的数据吗我闲着没事干压缩干哈其实我一开始使用的时候也有这样的疑惑因为我一开始是用在图像上的而一个图像只有500多个维度(列)的数据使用pca压缩到100列可以保存原始数据95%的信息但是我发现我用压缩的数据和不压缩的数据对模型的训练速度并没有什么影响。。。但是后来我做其他一些有500000维度的数据的时候发现使用pca将维度降到5000就能保存接近98%的数据而且训练速度可以提升数十倍于是我就成了pca的脑残粉了。。。所以pca在应对高维度数据的时候是有奇效的它不仅可以有效减少训练时间而且还可以防止过拟合前面一点上文已给出原因防止过拟合在下文给出。PCA的本质其实pca的本质很简单上面也有说就是将高维度数据转换到低维度不过在这里为了让大家能够有所体会我使用2维数据降到1维在解释这点。如上图所示假设我们的原始数据A, B, C是在直角坐标系中的三个点它们的坐标分别为A(x_a, y_a), B(x_b, y_b), C(x_c, y_c)那么我们现在想要使用pca将这三个在平面上的点降维到直线上(也就是上图中黄色的线上)。那么现在的问题就是平面中的A, B, C点(高维数据)可以通过怎样的映射关系降维到黄线上(也就是高维的数据如何在低维中表示)。这条黄线(就是低维)怎么求/确定前置知识的介绍对于上面提到的题一个问题(如何将高维度数据映射到低维度中)我们需要先知道数据点如何被表示。这看起来似乎是一个很蠢的问题因为答案貌似很简单比如图xx中的点ABC不就是A(x1, y1), B(x2, y2), C(x3, y3)吗对滴这个答案是没有问题的但是这样的答案并不具有普遍性也就是说如果我们的坐标系发生了变化(类比直角坐标系变化到极坐标系)那就不能再用(x, y)这样的形式进行表示了那么我们这里需要更加普遍的方法。我先说答案再说为什么是这个答案。答案就是通过坐标系的基向量来表示数据(向量)。如图所示我们取i和j作为基向量(在这里i的坐标为(1,0), j的坐标为(0, 1))那么数据A(1, 2),就可以表示为(1*i, 2*j)。于是我们把这个问题拓展开来二维上的数据点可以通过(基向量i*数据点在基向量i上的投影长度基向量j*数据点在基向量j上的投影长度)表示那么三维上的数据点也可以用这样的方式于是乎n(n2)维上的点可以表示为(基向量i*数据点在基向量i上的投影长度,基向量j*数据点在基向量j上的投影长度,…,基向量n * 数据点在基向量n上的投影长度)于是乎我们这个子问题就解决了即找到了一种在不同维度坐标系下表示数据的方法。PCA的数学原理那么接下来的问题就是我们如何把一个数据点从一个维度转变到另一个维度。在解决这个问题之前我们先用矩阵描述一下上一个问题比如我们现在基向量为(0,1)和(1,0)的坐标中表示(3,2)则可以写作为假设我们现在有一个新的坐标系这个坐标系的基向量i和j在普通平面直角坐标系中的表示是(0, -1)和(1, 0)(其实就是普通直角坐标系顺时针旋转90度),如下图所示(黑色为新的坐标系):A点在普通直角坐标系中为(3, 2)在新的直角坐标系中为(-2, 3)。新的坐标(-2, 3)可以通过以下方式计算于是乎我们找到了二维空间下数据变换的方式新的基向量矩阵*原基向量矩阵的转置*原数据向量新的数据向量也就是说我们想要将高维数据转换为低维数据可以通过低维空间的基向量矩阵 * 高维空间的基向量矩阵的转置 * 高维数据向量 低维数据向量而参考上图我们可以知道‘高维空间的基向量矩阵的转置 * 高维数据向量’是等于高维数据向量本身的于是乎可以得到低维空间的基向量矩阵 * 高维数据向量 低维数据向量(此处应有数学公式)接下来我们解决第二个大问题也就是如下这条黄线(就是低维)怎么求/确定PCA的思想这样要确定低维要么就要给出标准也就是什么样的低维是好的在这里先确定两个标准稍后解释为什么确定这两标准不同特征之间的方差尽可能大。不同特征之间的协方差等于0。设立这两个标准的原因是这样的先做一个前提假设哈假设我们现在有两个样本(在这个例子中就是两个人)他们的健康状况如下好了我要来解释了。第一个标准的解释其实不算太难假设我们现在要处理上面的数据也就是要将小王和老丁的数据的进行降维而他们的健康数据包含9个特征(健康水平是算作label而不是特征X相当于yf(X)中的y),理想状态是每个特征描述的东西都是完全不同的(因为特征描述的是对象的特性如果两个特征描述的东西很类似甚至可以被代替那就浪费了大把的计算资源了。比如说现在有这样两个特征第一个特征是是否为男性第二个特征是是否为女性。如果第一个特征为真则第二个特征必定为假也就是这两个东西描述的都是同一个特性就是性别)也就是说在原始数据中不同的特征它们之间的方差应该是很大的(可以理解为方差越大这两个东西越不同)。而每个特征之间我们希望降维之后它们也和原来的数据一样不同的特征之间保持有大的方差于是乎就有了第一个标准不同特征之间的方差尽可能大。第二个标准的解释其实和第一个标准是类似的只不过形式不同。上面说过了我们是希望原数据中不同的特征降维后还是不同而希望它们不同就等价于说它们之间不相关而协方差就是用来衡量两个特征之间的相关程度的当协方差等于0的时候就说明这两个特征之间是无关的。所以就有了这个标准不同特征之间的协方差等于0。好了现在我们已经有了处理标准了接下来我们就要把这个标准给抽象化(就是写成数学公式)方便我们计算我重新上面的数据贴出来写成向量的形式让我们先写出标准1的公式吧其中X就是一个特征的数据用我们上面的例子来说假设X是身高则X为(180, 175)则/mu就是177.5m等于2于是就求得Var(X) xxx同样的道理可以用来算年龄呀血压呀心率呀啥的。这里有个技巧就是我们先对X进行处理就是将其减去它的均值X X - /mu于是乎我们的公式就变成了标准2的公式如下我们用上面的技巧于是乎我们的公式就变成了现在我们把这两个标准给写成数学的公式了这样我们就可以用计算机来算了。但是这两个公式是分开的。。(就是说他们是两个公式)这样并不太方便于我们计算我们要像个办法把他们组合起来这样优化起来才能”联动”。在这里我介绍一个矩阵叫做协方差矩阵可以发现这个矩阵的正对角线就是我们的标准1也就是方差而其他的位置则为协方差。所以我们的目的就是使得协方差的位置为0然后选取方差最大的值(选取方差最大的值可能有点疑惑是这样的我们的特征矩阵X是可以有很多特征的比如年龄血压心率肺活量等等而方程右边的a和b就是这些特征中的一个那么势必有些特征的方差比较大有些特征的方差比较小。而那些方差比较小的特征我们就觉得它们没有那么好的区分效果而那些方差大的就觉得它们有很好的区分效果于是乎就把它们选中)。于是乎我们的目标就变成了通过优化方法使得协方差矩阵对角化(就是非对角线的位置值为0)。接下来是很简单的数学推导了。假设我们最终的协方差矩阵(就是上面说的对角化后的矩阵)为DX为我们的特征矩阵C为我们特征矩阵X的协方差矩阵我们要找到一个矩阵P使得我们的X特征矩阵可以变成D矩阵。也就是说我们现在的目标就变成了找到一个矩阵P使得矩阵以上等式成立。这里需要一丢丢线性代数的知识主要是关于实对称矩阵的知识但是这里就不说啦最后我们就可以得到矩阵P这个矩阵P是由我们的特征X矩阵找到的你也可以理解为它蕴含着我们X矩阵的信息而这些信息的重要性是越往上的越重要比如则第一行中的(0.2 0.3)的重要性要高于第二行的(0.4 0.2)然后我们想将我们的数据降到一维度则其中X是原始特征newX是降维后的特征而(0.2 0.3)就是我们P矩阵的第一列。从之前的知识可以知道我们是将X矩阵降维到一维。PCA的实现import numpy as npimport pandas as pdimport matplotlib.pyplot as plt定义一个均值函数。#计算均值,要求输入数据为numpy的矩阵格式行表示样本数列表示特征def meanX(dataX):return np.mean(dataX,axis0)#axis0表示依照列来求均值。假设输入list,则axis1开始实现pca的函数def pca(XMat, k):XMat传入的是一个numpy的矩阵格式行表示样本数列表示特征k表示取前k个特征值相应的特征向量finalData指的是返回的低维矩阵reconData相应的是移动坐标轴后的矩阵average meanX(XMat)m, n np.shape(XMat)data_adjust []avgs np.tile(average, (m, 1))data_adjust XMat - avgscovX np.cov(data_adjust.T) #计算协方差矩阵featValue, featVec np.linalg.eig(covX) #求解协方差矩阵的特征值和特征向量index np.argsort(-featValue) #依照featValue进行从大到小排序finalData []if k n:print(k must lower than feature number)returnelse:#注意特征向量时列向量。而numpy的二维矩阵(数组)a[m][n]中a[1]表示第1行值selectVec np.matrix(featVec.T[index[:k]]) #所以这里须要进行转置finalData data_adjust * selectVec.TreconData (finalData * selectVec) averagereturn finalData, reconData到这里整个流程基本就结束了~