数据降维:主成分分析法(PCA) 您所在的位置:网站首页 主成分分析法stata数据要求 数据降维:主成分分析法(PCA)

数据降维:主成分分析法(PCA)

2024-06-14 17:43| 来源: 网络整理| 查看: 265

 手 执 烟 火 以 谋 生 , 心 怀 诗 意 以 谋 爱

目录

1.原理介绍

2.步骤详解

2.1 获取数据

2.2 数据中心化 (标准化)

2.3 求协方差矩阵

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

2.5 确定主成分个数

2.6 计算主成分

3.案例分析

3.1题目简介

3.2 读取数据

3.3中心化数据

3.4 求协方差矩阵

3.5 计算特征值

3.6 计算特征值对应的特征向量

3.7 确定主成分个数并计算主成分矩阵

3.8 计算主成分(降维后数据)

4.完整代码(Java)

4.1 方法类 pca.java

4.2 主类 pcamain.java

此文为学习过程所写,如有错误,敬请指正。

1.原理介绍

        在很多场景中需要对多变量数据进行观测,在一定程度上增加了数据采集的工作量。更重要的是:多变量之间可能存在相关性,从而增加了问题分析的复杂性。如果对每个指标进行单独分析,其分析结果往往是孤立的,不能完全利用数据中的信息,因此盲目减少指标会损失很多有用的信息,从而产生错误的结论。

        所以需要找到一种合理的方法,在减少需要分析的指标同时,尽量减少原指标包含信息的损失,以达到对所收集数据进行全面分析的目的。由于各变量之间存在一定的相关关系,因此可以考虑将关系紧密的变量变成尽可能少的新变量,使这些新变量是两两不相关的,那么就可以用较少的综合指标分别代表存在于各个变量中的各类信息。

        主成分分析是一种最常用的无监督降维方法,通过降维技术把多个变量化为少数几个主成分的统计分析方法。这些主成分能够反映原始变量的绝大部分信息,它们通常表示为原始变量的某种线性组合。

2.步骤详解 2.1 获取数据

        假设现有一组数据,有m条数据,每条数据都有n个评价指标,构成了m*n的原始数据矩阵,即为X,每个变量对应的数据记为X1,X2,X3......Xn。

2.2 数据中心化 (标准化)

        不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据标准化处理,以解决数据指标之间的可比性。原始数据经过数据标准化处理后,各指标处于同一数量级,适合进行综合对比评价。

        在这里我们采用零均值法(z-score)对数据进行处理,得到均值为0,标准差为1的服从标准正态分布的数据。

 其中,表示第j个指标的样本均值,

表示第j个指标的标准差,仍记中心化后数据矩阵为X。

2.3 求协方差矩阵

 对中心化后数据求其协方差矩阵,记为R,则

 或者另一种方法:

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

通过求协方差矩阵的特征方程:

解得其特征值有

对应的特征向量依次为:

2.5 确定主成分个数

        设定一个贡献率阈值,即前p个主成分特征值的累计贡献率高于该值时即可认为这p个主成分可以表示原来n个变量,一般取0.8,0.85,0.9,0.95,0.99等。

2.6 计算主成分

        在得到了主成分个数后,就可以利用前p个特征值对应的特征向量对主成分(降维后的数据)进行计算。

3.案例分析 3.1题目简介

        已知判断某一水域水质情况的好坏时可以通过x1-x9共9种指标来评判,现有A-K共11条河流的指标测量情况,但是由于指标过多导致在评判以及确定每个指标的重要程度时带来了很大麻烦,所以请你利用一定的数学方法在尽量不损失原有数据信息的前提下减少评判指标。

x1x2x3x4x5x6x7x8x9A886317505349642432B7512431453311842C794873624348727698D7395934204654459E36705351006742543F4046926068192768G20783598837035581H6729383322734775I383028724620504274J952520421354565482K403227142259681 3.2 读取数据

利用jxl包从Excel读取数据并输出

//读取数据 public double[][] read(String filepath) throws IOException, BiffException,WriteException { //创建输入流 InputStream stream = new FileInputStream(filepath); //获取Excel文件对象 Workbook rwb = Workbook.getWorkbook(stream); //获取文件的指定工作表 默认的第一个 Sheet sheet = rwb.getSheet("Sheet1"); rows = sheet.getRows(); cols = sheet.getColumns(); double[][] orig = new double[rows][cols]; //row为行 for(int i=0;i


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有