Python PCA降维的两种实现方法

目录
  • 前言
  • PCA降维的一般步骤为:
  • 实现PCA降维,一般有两种方法:
  • 总结

前言

PCA降维,一般是用于数据分析和机器学习。它的作用是把一个高维的数据在保留最大信息量的前提下降低到一个低维的空间,从而使我们能够提取数据的主要特征分量,从而得到对数据影响最大的主成分,便于我们对数据进行分析等后续操作。

例如,在机器学习中,当你想跟据一个数据集来进行预测工作时,往往要采用特征构建、不同特征相乘、相加等操作,来扩建特征,所以,当数据处理完毕后,每个样本往往会有很多个特征,但是,如果把所有数据全部喂入模型,可能会导致糟糕的结果。在高维数据集中,往往只有部分特征有良好的预测能力,很多特征纯粹是噪音(没有预测能力),很多特征彼此之间也可能高度相关,这些因素会降低模型的预测精度,训练模型的时间也更长。降低数据集的维度在某种程度上能解决这些问题,这时候就用到了PCA降维。

假设原始数据集的特征有500个,通过PCA降维,降到了400,那么我们就可以用降维后得到的这400个特征代替原始数据集的那500个,此时再喂给模型,那么模型的预测能力相比之前会有所提升。但要明白一点的是,降维后得到的这400个特征是新的特征,是原始数据集在高维空间某一平面上的投影,能够反映原特征提供的大部分信息,并不是指在原来的500个中筛选400个特征。

PCA降维的一般步骤为:

1.将原始数据进行标准化(一般是去均值,如果特征在不同的数量级上,则还要将其除以标准差)

2.计算标准化数据集的协方差矩阵

3.计算协方差矩阵的特征值和特征向量

4.保留最重要(特征值最大)的前k个特征(k就表示降维后的维度)

5.找到这k个特征值对应的特征向量

6.将标准化数据集乘以该k个特征向量,得到降维后的结果

实现PCA降维,一般有两种方法:

首先先来解释一下代码中用到的数据集:

在这两个代码中,用的是sklean库中自带的iris(鸢尾花)数据集。iris数据集包含150个样本,每个样本包含四个属性特征(花萼长度、花萼宽度、花瓣长度、花瓣宽度)和一个类别标签(分别用0、1、2表示山鸢尾、变色鸢尾和维吉尼亚鸢尾)。

data = load_iris()
y = data.target
x = data.data

y就表示数据集中的类别标签,x表示数据集中的属性数据。因为鸢尾花类别分为三类,所以我们降维后,要跟据y的值,分别对这三类数据点进行绘图。

第一种,就是依照上面PCA的步骤,通过矩阵运算,最终得到降维后的结果

import numpy as np
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt

def pca(dataMat, topNfeat):
    meanVals = np.mean(dataMat, axis=0)
    meanRemoved = dataMat - meanVals  # 标准化(去均值)
    covMat = np.cov(meanRemoved, rowvar=False)
    eigVals, eigVets = np.linalg.eig(np.mat(covMat))  # 计算矩阵的特征值和特征向量
    eigValInd = np.argsort(eigVals)  # 将特征值从小到大排序,返回的是特征值对应的数组里的下标
    eigValInd = eigValInd[:-(topNfeat + 1):-1]  # 保留最大的前K个特征值
    redEigVects = eigVets[:, eigValInd]  # 对应的特征向量
    lowDDatMat = meanRemoved * redEigVects  # 将数据转换到低维新空间
    # reconMat = (lowDDatMat * redEigVects.T) + meanVals  # 还原原始数据
    return lowDDatMat

def plotPCA(lowMat):
    reconArr = np.array(lowMat)
    red_x, red_y = [], []
    blue_x, blue_y = [], []
    green_x, green_y = [], []
    for i in range(len(reconArr)):
        if y[i] == 0:
            red_x.append(reconArr[i][0])
            red_y.append(reconArr[i][1])
        elif y[i] == 1:
            blue_x.append(reconArr[i][0])
            blue_y.append(reconArr[i][1])
        else:
            green_x.append(reconArr[i][0])
            green_y.append(reconArr[i][1])
    plt.scatter(red_x, red_y, c='r', marker='x')
    plt.scatter(blue_x, blue_y, c='b', marker='D')
    plt.scatter(green_x, green_y, c='g', marker='.')
    plt.show()

if __name__ == '__main__':
    data = load_iris()
    y = data.target
    x = data.data
    matx = np.mat(x)
    lowDMat = pca(matx, 2)
    plotPCA(lowDMat)

第二种,是在sklearn库中调用PCA算法来实现:

import matplotlib.pyplot as plt
from sklearn.decomposition import PCA  # 加载PCA算法包
from sklearn.datasets import load_iris
import numpy as np

data = load_iris()
y = data.target
x = data.data
pca = PCA(n_components=2)  # 加载PCA算法,设置降维后主成分数目为2
reduced_x = pca.fit_transform(x)  # 对样本进行降维
# reduced_x = np.dot(reduced_x, pca.components_) + pca.mean_  # 还原数据

red_x, red_y = [], []
blue_x, blue_y = [], []
green_x, green_y = [], []
# print(reduced_x)
for i in range(len(reduced_x)):
    if y[i] == 0:
        red_x.append(reduced_x[i][0])
        red_y.append(reduced_x[i][1])
    elif y[i] == 1:
        blue_x.append(reduced_x[i][0])
        blue_y.append(reduced_x[i][1])
    else:
        green_x.append(reduced_x[i][0])
        green_y.append(reduced_x[i][1])
plt.scatter(red_x, red_y, c='r', marker='x')
plt.scatter(blue_x, blue_y, c='b', marker='D')
plt.scatter(green_x, green_y, c='g', marker='.')
plt.show()

在第二个代码中,值得一说的是fit_transform()这个函数,它其实就是fit()和transform()这两个函数的结合,相当于先调用fit()再调用transform()。fit()和transform()这两个函数在sklearn库中经常出现,fit()函数可以理解为求传入的数据集的一些固有的属性(如方差、均值等等),相当于一个训练过程,而transform()函数,可以理解为对训练后的数据集进行相应的操作(如归一化、降维等等)。在不同的模块中,这两个函数的具体实现也不一样,比如在PCA模块里,fit()相当于去均值,transform()则相当于降维。

这两种代码运行后,生成的图像如下(图一为第一种代码,图二为第二种代码):

图一

图二

可以看到,第一种代码画出的图像与第二种代码画出的图像关于y=0这条直线对称,虽然不清楚这是什么原因(后续有空的话我会去找找原因),但是这并不影响降维的结果。

降维前的数据(部分)

降维后的数据(部分)

所以,此时我们使用降维后的二维数据集就可以用来表示降维前四维数据集的大部分信息。

降维后得到的数据可以通过逆操作来进行数据集的还原,具体原理就不过多解释,具体操作代码的话我已在代码的注释里面写出,但是重建出来的数据会和原始数据有一定的误差(如下图)

原因的话你可以这样理解:我们的原始数据为四维空间,现在用PCA降维到二维空间,则保留数据投影方差最大的两个轴向,因此舍弃掉了另外两个相对不重要的特征轴,从而造成了一定的信息丢失,所以会产生重构误差。

总结

到此这篇关于Python PCA降维的两种实现方法的文章就介绍到这了,更多相关Python PCA降维内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2022-01-14

python实现PCA降维的示例详解

概述 本文主要介绍一种降维方法,PCA(Principal Component Analysis,主成分分析).降维致力于解决三类问题. 1. 降维可以缓解维度灾难问题: 2. 降维可以在压缩数据的同时让信息损失最小化: 3. 理解几百个维度的数据结构很困难,两三个维度的数据通过可视化更容易理解. PCA简介 在理解特征提取与处理时,涉及高维特征向量的问题往往容易陷入维度灾难.随着数据集维度的增加,算法学习需要的样本数量呈指数级增加.有些应用中,遇到这样的大数据是非常不利的,而且从大数据集中学习

Python机器学习之PCA降维算法详解

一.算法概述 主成分分析 (Principal ComponentAnalysis,PCA)是一种掌握事物主要矛盾的统计分析方法,它可以从多元事物中解析出主要影响因素,揭示事物的本质,简化复杂的问题. PCA 是最常用的一种降维方法,它的目标是通过某种线性投影,将高维的数据映射到低维的空间中,并期望在所投影的维度上数据的方差最大,以此使用较少的维度,同时保留较多原数据的维度. PCA 算法目标是求出样本数据协方差矩阵的特征值和特征向量,而协方差矩阵的特征向量的方向就是PCA需要投影的方向.使样本

Python机器学习之K-Means聚类实现详解

本文为大家分享了Python机器学习之K-Means聚类的实现代码,供大家参考,具体内容如下 1.K-Means聚类原理 K-means算法是很典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大.其基本思想是:以空间中k个点为中心进行聚类,对最靠近他们的对象归类.通过迭代的方法,逐次更新各聚类中心的值,直至得到最好的聚类结果.各聚类本身尽可能的紧凑,而各聚类之间尽可能的分开. 算法大致流程为:(1)随机选取k个点作为种子点(这k个点不一定属于数据集)

python实现决策树C4.5算法详解(在ID3基础上改进)

一.概论 C4.5主要是在ID3的基础上改进,ID3选择(属性)树节点是选择信息增益值最大的属性作为节点.而C4.5引入了新概念"信息增益率",C4.5是选择信息增益率最大的属性作为树节点. 二.信息增益 以上公式是求信息增益率(ID3的知识点) 三.信息增益率 信息增益率是在求出信息增益值在除以. 例如下面公式为求属性为"outlook"的值: 四.C4.5的完整代码 from numpy import * from scipy import * from mat

python中实现k-means聚类算法详解

算法优缺点: 优点:容易实现 缺点:可能收敛到局部最小值,在大规模数据集上收敛较慢 使用数据类型:数值型数据 算法思想 k-means算法实际上就是通过计算不同样本间的距离来判断他们的相近关系的,相近的就会放到同一个类别中去. 1.首先我们需要选择一个k值,也就是我们希望把数据分成多少类,这里k值的选择对结果的影响很大,Ng的课说的选择方法有两种一种是elbow method,简单的说就是根据聚类的结果和k的函数关系判断k为多少的时候效果最好.另一种则是根据具体的需求确定,比如说进行衬衫尺寸的聚

Python编程实现蚁群算法详解

简介 蚁群算法(ant colony optimization, ACO),又称蚂蚁算法,是一种用来在图中寻找优化路径的机率型算法.它由Marco Dorigo于1992年在他的博士论文中提出,其灵感来源于蚂蚁在寻找食物过程中发现路径的行为.蚁群算法是一种模拟进化算法,初步的研究表明该算法具有许多优良的性质.针对PID控制器参数优化设计问题,将蚁群算法设计的结果与遗传算法设计的结果进行了比较,数值仿真结果表明,蚁群算法具有一种新的模拟进化优化方法的有效性和应用价值. 定义 各个蚂蚁在没有事先告诉

Python机器学习之决策树算法实例详解

本文实例讲述了Python机器学习之决策树算法.分享给大家供大家参考,具体如下: 决策树学习是应用最广泛的归纳推理算法之一,是一种逼近离散值目标函数的方法,在这种方法中学习到的函数被表示为一棵决策树.决策树可以使用不熟悉的数据集合,并从中提取出一系列规则,机器学习算法最终将使用这些从数据集中创造的规则.决策树的优点为:计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理不相关特征数据.缺点为:可能产生过度匹配的问题.决策树适于处理离散型和连续型的数据. 在决策树中最重要的就是如何选取

机器学习10大经典算法详解

本文为大家分享了机器学习10大经典算法,供大家参考,具体内容如下 1.C4.5 C4.5算法是机器学习算法中的一种分类决策树算法,其核心算法是ID3算法.  C4.5算法继承了ID3算法的优点,并在以下几方面对ID3算法进行了改进: 1)用信息增益率来选择属性,克服了用信息增益选择属性时偏向选择取值多的属性的不足: 2)在树构造过程中进行剪枝: 3)能够完成对连续属性的离散化处理: 4)能够对不完整数据进行处理. C4.5算法有如下优点:产生的分类规则易于理解,准确率较高.其缺点是:在构造树的过

python决策树之C4.5算法详解

本文为大家分享了决策树之C4.5算法,供大家参考,具体内容如下 1. C4.5算法简介   C4.5算法是用于生成决策树的一种经典算法,是ID3算法的一种延伸和优化.C4.5算法对ID3算法主要做了一下几点改进:   (1)通过信息增益率选择分裂属性,克服了ID3算法中通过信息增益倾向于选择拥有多个属性值的属性作为分裂属性的不足:   (2)能够处理离散型和连续型的属性类型,即将连续型的属性进行离散化处理:   (3)构造决策树之后进行剪枝操作:   (4)能够处理具有缺失属性值的训练数据. 2

python机器学习实战之树回归详解

本文实例为大家分享了树回归的具体代码,供大家参考,具体内容如下 #-*- coding:utf-8 -*- #!/usr/bin/python ''''' 回归树 连续值回归预测 的 回归树 ''' # 测试代码 # import regTrees as RT RT.RtTreeTest() RT.RtTreeTest('ex0.txt') RT.RtTreeTest('ex2.txt') # import regTrees as RT RT.RtTreeTest('ex2.txt',ops=(

python最小生成树kruskal与prim算法详解

kruskal算法基本思路:先对边按权重从小到大排序,先选取权重最小的一条边,如果该边的两个节点均为不同的分量,则加入到最小生成树,否则计算下一条边,直到遍历完所有的边. prim算法基本思路:所有节点分成两个group,一个为已经选取的selected_node(为list类型),一个为candidate_node,首先任取一个节点加入到selected_node,然后遍历头节点在selected_node,尾节点在candidate_node的边,选取符合这个条件的边里面权重最小的边,加入到

python算法演练_One Rule 算法(详解)

这样某一个特征只有0和1两种取值,数据集有三个类别.当取0的时候,假如类别A有20个这样的个体,类别B有60个这样的个体,类别C有20个这样的个体.所以,这个特征为0时,最有可能的是类别B,但是,还是有40个个体不在B类别中,所以,将这个特征为0分到类别B中的错误率是40%.然后,将所有的特征统计完,计算所有的特征错误率,再选择错误率最低的特征作为唯一的分类准则--这就是OneR. 现在用代码来实现算法. # OneR算法实现 import numpy as np from sklearn.da