Python PCA(主成分分析法)降维的两种实现

这篇具有很好参考价值的文章主要介绍了Python PCA(主成分分析法)降维的两种实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

PCA降维的一般步骤为:

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

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

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

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

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

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

具体步骤如下:

1.去均值:

Python PCA(主成分分析法)降维的两种实现

        其中,Python PCA(主成分分析法)降维的两种实现为标准化后的矩阵, Python PCA(主成分分析法)降维的两种实现为矩阵A的均值。

2.求标准化数据集的协方差矩阵:

Python PCA(主成分分析法)降维的两种实现

3.计算协方差矩阵的特征值和特征向量。设数λ和n维非0列向量x满足下式:

Python PCA(主成分分析法)降维的两种实现

        则λ为C的特征值,x称为C的对应于特征值λ的特征向量。C为数据集的协方差矩阵。

4.保留最重要的前k个特征。k即为你想降维到的维数。

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

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

Python PCA(主成分分析法)降维的两种实现

        上式中,Python PCA(主成分分析法)降维的两种实现表示上述的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()则相当于降维。

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

Python PCA(主成分分析法)降维的两种实现

图一

Python PCA(主成分分析法)降维的两种实现

图二

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

降维前的数据(部分)                                                             

Python PCA(主成分分析法)降维的两种实现

降维后的数据(部分)

 Python PCA(主成分分析法)降维的两种实现

       

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

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

Python PCA(主成分分析法)降维的两种实现

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

最后,希望大家能指出我的错误或者不足,我一定及时改正。文章来源地址https://www.toymoban.com/news/detail-416693.html

到了这里,关于Python PCA(主成分分析法)降维的两种实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 主成分分析法(PCA)解析与MATLAB实践

    PCA(Principal Components Analysis)即主成分分析,也称主分量分析或主成分回归分析法,是一种无监督的数据降维方法,在机器学习中常用于特征降维提取主要特征以减少计算量。PCA主要原理是将高维原数据通过一个转换矩阵,映射到另一组低维坐标系下,从而实现数据降维。举个简

    2023年04月08日
    浏览(31)
  • 数据分析案例-基于PCA主成分分析法对葡萄酒数据进行分析

    🤵‍♂️ 个人主页:@艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏 📂加关注+ 目录 1.项目背景 2.项目简介 2.1分析目标 2.2数据集介绍 2.3技术工具 3.算法理论 4.实验过程

    2024年02月03日
    浏览(31)
  • 数学建模:主成分分析法

    🔆 文章首发于我的个人博客:欢迎大佬们来逛逛 构建原始数据矩阵 X X X ,其中矩阵的形状为 x ∗ n x * n x ∗ n ,有 m m m 个对象, n n n 个评价指标。 然后进行矩阵的 归一化处理 。 首先计算矩阵的指标之间的 相关系数矩阵 R R R 。使用matlab 的 corr 即可得到。 计算相关系数矩

    2024年02月10日
    浏览(40)
  • 结合PCA降维的DBSCAN聚类方法(附Python代码)

      目录 前言介绍: 1、PCA降维: (1)概念解释: (2)实现步骤: (3)优劣相关:  2、DBSCAN聚类: (1)概念解释: (2)算法原理: (3)优劣相关: 代码实现: 0、数据准备: 1、PCA降维: 2、DBSCAN聚类: 3、代码汇总: 实现效果: 1、降维效果: 2、聚类效果: 写在最后

    2024年02月04日
    浏览(24)
  • 多元回归预测 | Matlab主成分分析PCA降维,BP神经网络回归预测。PCA-BP回归预测模型

    效果一览 文章概述 多元回归预测 | Matlab主成分分析PCA降维,BP神经网络回归预测。PCA-BP回归预测模型 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 部分源码

    2024年02月13日
    浏览(36)
  • 【建模算法】层次分析法(Python实现)

    在很多情况下,我们对事物评价,应该要多维度评价。多维度评价之后我们要如何把它们合并成一个指标用于比较事物的好坏呢,这时候需要对各个指标赋权, 层次分析法就是用来赋权重的了。 这个方法主观性比较强,在数据集比较小,实在不好比较的时候可以用这个方法

    2024年01月22日
    浏览(30)
  • 灰色关联分析法详解及python实践

    灰色关联分析是指对一个系统发展变化态势的定量描述和比较的方法,其基本思想是通过确定参考数据列和若干个比较数据列的几何形状相似程度来判断其联系是否紧密,它反映了曲线间的关联程度。 在系统发展过程中,若两个因素变化的趋势具有一致性,即同步变化程度较

    2024年02月01日
    浏览(26)
  • 数学建模(层次分析法 python代码 案例)

    目录 介绍:  模板: 例题:从景色、花费、饮食,男女比例四个方面去选取目的地  准则重要性矩阵:  每个准则的方案矩阵:​  一致性检验:  特征值法求权值: 完整代码: 运行结果:

    2024年04月29日
    浏览(30)
  • python 算符优先分析法的设计实现 编译原理

    1、给出文法如下: G[E] E-T|E+T; T-F|T*F; F-i|(E); 可以构造算符优先表如下: + * ( ) i + * ( = ) i 2、计算机中表示上述优先关系,优先关系的机内存放方式有两种1)直接存放,2)为优先关系建立优先函数,这里由学生自己选择一种方式; 3、给出算符优先分析算法如下: k:=1;S[k]:=\\\'#\\\'; REPE

    2024年02月07日
    浏览(31)
  • 数学建模--层次分析法(AHP)的Python实现

    目录 1.算法流程简介 2.算法核心代码 3.算法效果展示 算术平均法求得的权重为: [0.07243906 0.30125047 0.62631047] 几何平均法求得的权重为: [0.7374984  0.17727613 0.08522547] 特征值权重法法求得的权重为: [0.07239208 0.30116321 0.62644471]

    2024年02月10日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包