Spark 3.0 - 17 ML PCA 主成分分析理论与实战

news2024/10/8 22:13:42

目录

 

一.引言

二.PCA 理论

1.主成分分析定义

2.数学基础

A.数据归一化

B.协方差矩阵计算

C.计算协方差矩阵的特征向量和特征值,以识别主成分

D.构造特征向量矩阵

E.沿着主成分轴重新计算数据

三.PCA 实战

1.数据准备

2.PCA 初始化

3.数据降维

四.总结


一.引言

主成分分析 (Principal Component Analysis PCA) 是指将多个变量通过线性变化以选出少数重要变量的一种多元统计方法,又称主分量分析。在实际应用场合下,为了全面分析问题,往往提出很多与此有关的变量, 而不同变量在不同程度上反映这个场合的某些信息。主成分分析是设法将原来众多具有一定相关性的指标重新组合成一组新的互相无关的综合指标来代替,从而实现降维的目的。

二.PCA 理论

1.主成分分析定义

使用统计方法研究多变量课题时,随着变量个数的增多课题的复杂性也随之增加。一些场景下我们希望变量个数尽可能的少且损失的关键信息也越少。在很多情况下,变量之间是有一定相关性的,有时也称共线性,即二者在提供信息时存在一定重叠。主成分分析是对于原先提出的所有变量,将重复或者共线性抢的变量删除,建立尽可能少的变量且互不相关,而且这些新变量能够尽可能保持原有的信息。

2.数学基础

假设有一个二维数据集 (x1,x2,x3...,xn),要求将其从二维降维一维数据。

最直观的方法就是绕着数据旋转,看从哪个视角看过去能够保留更多地点,且以这条线为主,数据分散程度越大,方差越大,那么这个角度或者方向就是后续主成分分析的主方向。实际过程中,由于数据多为高维所以这里只适用一些易于观察的低维数据用于直观理解,下面看一下 PCA 的主要流程:

A.数据归一化

这一步骤的目的是使连续初始变量的范围标准化,使每个变量对分析的贡献相等。

更具体地说,PCA 主成分分析之前进行标准化至关重要的原因是 PCA 对初始变量的方差非常敏感。也就是说,如果初始变量的范围之间存在较大差异,则范围较大的变量将主导范围较小的变量(例如,范围在0和100之间的变量将支配范围在0到1之间的变量),这将导致偏差结果。因此,将数据转换为可比较的尺度可以防止这个问题。

数学实现上,我们可以通过减去均值并除以标准差实现归一化。

一旦标准化完成,所有变量将转换为相同的比例。

B.协方差矩阵计算

这一步骤的目的是了解输入数据集的变量是如何相对于彼此的平均值变化的,或者换句话说,看看它们之间是否存在任何关系。因为有时,变量高度相关,从而包含冗余信息。因此,为了识别这些相关性,我们计算协方差矩阵。这也可以看做是对数据共线性的分析。

协方差矩阵是一个 p×p 对称矩阵 (其中p是维数),以与所有可能的初始变量对相关的协方差作为条目。例如,对于具有 3 个变量 x、y 和 z 的三维数据集,协方差矩阵为3×3矩阵,如下所示:

由于变量与其自身的协方差是其方差 Cov(a,a) = Var(a),且 Cov(a,b) = Cov(b,a),因此协方差矩阵的对角线不变,且上三角部分和下三角部分相同。

如果 Cov(x,y) 为正,则代表两个变量的变化方向相同,反之如果 Cov(x,y) 为负,则二者呈现此消彼长之势,通过协方差矩阵我们可以获得所有变量之间关于相关性的矩阵。

C.计算协方差矩阵的特征向量和特征值,以识别主成分

特征向量和特征值是线性代数概念,我们需要根据协方差矩阵来计算,以确定数据的主要成分。在解释这些概念之前,让我们先了解一下我们所说的主成分是什么意思。

主成分是由初始变量的线性组合或混合构成的新变量。这些组合是以这样的方式进行的,即新变量(即主成分)是不相关的,并且初始变量内的大部分信息被压缩或压缩到第一成分中。所以,这个想法是10维数据给你10个主要成分,但PCA试图将最大可能的信息放在第一个成分中,然后将最大剩余信息放在第二个成分中。通过特征值的大小,我们可以从大到小排列获取不同方向特征的重要性,通过对应的特征向量组合,我们即可获得原始信息的近似。

PCA 将特征重要性从高到低排列,我们可以根据自己的精度要求或者应用场景需求判断获取最重要的 K 维特征。这里需要认识到的一件重要事情是,主成分不太可解释,也没有任何实际意义,因为它们被构造为初始变量的线性组合。

从几何学上讲,主成分代表了解释最大方差的数据方向,也就是说,代表了数据中大部分信息的线。这里,方差和信息之间的关系是,一条线承载的方差越大,沿线数据点的离散度就越大,而沿线的离散度越大,信息就越多。简单地说,只需将主分量视为提供最佳角度来查看和评估数据的新轴,以便观察结果之间的差异更加明显。

假设我们的数据集是2维的,具有2个变量x,y,协方差矩阵的特征向量和特征值如上:

按降序排列特征值,我们得到 λ1>λ2,这意味着对应于第一个主分量(PC1)的特征向量是v1,对应于第二个分量(PC2)的特征矢量是v2。在获得主成分后,我们可以计算每个成分所占的方差(信息)百分比,我们将每个成分的特征值除以特征值之和。如果我们将此应用于上述示例,我们发现 PC1 和 PC2 分别携带 96% 和 4% 的数据方差:

p1=\frac{1.284028}{1.284028 + 0.04908323}=0.9631814443570474

可以看到以 λ1 为主成分即可保留二维数据的大部分信息,当然这是基于方差而言,并不具备一定的真实意义与可解释性。 

D.构造特征向量矩阵

正如我们在上一步中所看到的,计算特征向量并按其特征值降序排序,可以让我们按照重要性的顺序找到主成分。在这一步中,我们要做的是,选择是保留所有这些分量,还是丢弃那些意义较小的分量(低特征值),并用剩下的分量形成一个向量矩阵,我们称之为特征向量。

因此,特征向量只是一个矩阵,它将我们决定保留的分量的特征向量作为列。这使得它成为降维的第一步,因为如果我们选择在n中只保留p个特征向量(分量),那么最终的数据集将只有p个维度。

还是刚才的例子,我们选择保留主成分 λ1,因此特征向量为  λ1 对应的特征向量:

当然,选择那些特征值对应的特征向量由用户决定,如果我只想获取几个最不相关的变量来描述我的数据,那么就无需去掉后面那些不重要的成分。

E.沿着主成分轴重新计算数据

在前面的步骤中,除了标准化之外,您不需要对数据进行任何更改,只需选择主要成分并形成特征向量,但输入数据集始终保持原始轴(即,初始变量)。

在这一步骤(这是最后一步)中,目标是使用使用协方差矩阵的特征向量形成的特征向量,将数据从原始轴重新定向到由主分量表示的轴(因此称为主分量分析)。这可以通过特征向量的转置乘以原始数据得到。

假设原始矩阵维度为 MxN,主成分分析后选择前 K 个特征向量,对应特征矩阵 KxN,则降维后的数据 MxN · NxK[转置] = MxK。

参考: A Step-by-Step Explanation of Principal Component Analysis (PCA)

三.PCA 实战

1.数据准备

    val spark = SparkSession
      .builder      //创建spark会话
      .master("local")  //设置本地模式
      .appName("PCAExample")  //设置名称
      .getOrCreate()   //创建会话变量

    // 加载向量
    val data = Array(
      Vectors.sparse(5, Seq((1, 1.0), (3, 7.0))),
      Vectors.dense(2.0, 0.0, 3.0, 4.0, 5.0),
      Vectors.dense(4.0, 0.0, 0.0, 6.0, 7.0)
    )
    val df = spark.createDataFrame(data.map(Tuple1.apply)).toDF("features")

原始特征维度为 3x5,通过 sparkSession 转换为 DF 并添加到 features 列。

2.PCA 初始化

    //提取主成分,设置主成分个数
    val pca = new PCA()
      .setInputCol("features")
      .setOutputCol("pcaFeatures")
      .setK(3)
      .fit(df)

设置输入输出列,其中 K=3 代表最终保留重要性前3个特征。

3.数据降维

    //打印结果
    val result = pca.transform(df).select("pcaFeatures")
    result.show(false)

    println("特征矩阵")
    println(pca.pc)
    println("解释性方差")
    println(pca.explainedVariance)

    spark.stop()

 原始矩阵 3x5 的5维度数据,降维后得到 3x3 的3维度数据:

其中特征向量矩阵为与解释性方差如下,维度 5x3:

可以看到前三个特征值累加达到了 99%+,能够描述大部分数据信息。

四.总结

SVD 和 PCA 是目前 Spark ML 库里常见的数据降维方法。他们为大数据的数据位数过多、噪声过多提供了相应的解决方法,提高了大数据算法的运行效率。根据算法特性可知二者均为无监督降维。此外,降维的方法还有很多,包括非线性降维、监督和半监督降维,大家可以基于实际场景选择最佳的降维方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/135976.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

举一反三-自建zabbix监控php

php-fpm监控需要通过nginx服务。因此需要开启相关配置。 php-fpm如果是yum安装的,那么在/etc/php-fpm.d/www.config中编辑如下选项: pm.status_path /php_status 保存并退出编辑。重启php-fpm服务。 接下来编辑nginx配置项。编辑如下: l…

Linux下cal命令C/C++实现(显示日历信息)

大多数用户自然会将计算机上的日历视为GUI应用程序,或直接从桌面显示的东西。但也可以在Linux中使用cal命令通过命令行终端查看日历。 如果您通常使用Linux上的桌面环境,或者您来自Windows或MacOS操作系统,可能会认为这是一种过于复杂的日历…

RFID技术在固定资产管理中的作用

固定资产因具有数量庞大、分布广、变动频繁等特点造成管理难度较大,一直成为企业管理的一大重点。固定资产管理包括资产的新增、调拨、闲置、报废、维修、盘点等操作,让投入使用到报废退出使用的全过程进行全面的信息化管控。以往固定资产的一直由于管理…

AlexNet详解

入门小菜鸟,希望像做笔记记录自己学的东西,也希望能帮助到同样入门的人,更希望大佬们帮忙纠错啦~侵权立删。 ✨完整代码在我的github上,有需要的朋友可以康康✨ GitHub - tt-s-t/Deep-Learning: Store some of your own in-depth …

Python学习笔记——起步

Python 2 和 Python 3的区别 一、维护及版本更新不同 官方通知python2 2020开始已不再维护,python3的版本还在不断迭代更新 。 因为python2官方不再维护且python3的广泛使用,很多新的算法包、AI包等其他功能模块包都是基于python3开发的,p…

LaTeX使用方法

1.工具 1.生成表格:LaTeX Tables Editor 2.生成公式:Online LaTeX Equation Editor 、texmath demo、在线LaTeX公式编辑器-编辑器 2.技巧 1.插入图片: \begin{figure}[t] %t表示图片置顶,h表示指定位置,b表示置底…

条件分支if和else的使用详解

顺序结构没什么好讲的,就是从上到下的写代码,所以接下来,壹哥就直接带各位来学习分支结构里的条件分支。我们在前面说过,分支结构,或者叫做条件分支,其实有两种情况。一种是if...else...类型的条件分支&…

vue组件通信6种方式总结(常问知识点)

前言 在Vue组件库开发过程中,Vue组件之间的通信一直是一个重要的话题,虽然官方推出的 Vuex 状态管理方案可以很好的解决组件之间的通信问题,但是在组件库内部使用 Vuex 往往会比较重,本文将系统的罗列出几种不使用 Vuex&#xff…

X.509证书详解

概述 X.509是公钥基础设施(PKI)的标准格式。X.509证书就是基于国际电信联盟(ITU)制定的X.509标准的数字证书。X.509证书主要用于识别互联网通信和计算机网络中的身份,保护数据传输安全。X.509证书无处不在&#xff0c…

Spring之底层架构核心概念-过滤器

文章目录1.excludeFilters:排除过滤器2.includeFilters:包含过滤器3.问题:spring为什么能通过是否有Component注解来判断是否需要去注册bean呢?3.1 看源码3.2 原因4.总结1.excludeFilters:排除过滤器 用excludeFilters排除UserService 这个类后&#xf…

nature级别图表:单细胞转录组细胞比例统计可视化函数

单细胞转录组细胞比例: 关于单细胞比例的计算和作图我们之前出过3期,单细胞比例的展示是很多单细胞文章必不可少的内容:跟着Cell学单细胞转录组分析(六):细胞比例计算及可视化 相信跟着学习的小伙伴已经掌握了。最近学习一篇《nature medici…

JavaScript 数组-概念,创建数组,遍历数组,新增元素

JavaScript 数组-概念,创建数组,遍历数组,新增元素 目录JavaScript 数组-概念,创建数组,遍历数组,新增元素1. 数组的概念2. 创建数组2.1 数组的创建方式2.2 利用 new 创建数组2.3 利用数组字面量创建数组2.…

模式分类识别 | BiLSTM双向长短期记忆神经网络数据多特征分类预测(Matlab完整程序)

模式分类识别 | BiLSTM双向长短期记忆神经网络数据多特征分类预测(Matlab完整程序) 目录 模式分类识别 | BiLSTM双向长短期记忆神经网络数据多特征分类预测(Matlab完整程序)分类结果基本介绍程序设计参考资料分类结果

深度学习实验(五)——循环神经网络编程

深度学习实验五:循环神经网络编程 本次实验练习使用torch.nn中的类设计一个循环神经网络进行MNIST图像分类。 在本次实验中,你要设计一个CNN,用于将282828 \times 282828的MNIST图像转换为MMDM\times M\times DMMD的特征图,将该特征图看作是…

我,做了两年程序员,存了巨款5000,你们拿什么跟我比?

🕐没错,标题所见,从21年1月份开始从事程序员工作也过了两年了,今年还是没有存到钱。 今年换了一份工作,四月份的时候,从惠州换到了广州工作,从制造业转行到了政务行业,工资涨了&…

Keithley 2604B数字源表-安泰测试

Keithley 2600B 系列系统 SMU 仪器是业界标准电流-电压源和测量解决方案,适用于高度自动化生产测试应用。 双通道和单通道型号都紧密集成一个精密电源、真正电流源、数字万用表和具有脉冲生成功能的电子负载。 另外,TSP? 技术可运行完整测试程序&#x…

多点双向重发布的应用

目录 1.拓扑图 2.实验思路 3.主要配置 4.测试 5.实验总结 1.拓扑图 2.实验思路 在配置完RIP和OSPF之后,在2,3号设备上进行多点的双向重发布由于在进行了多点的双向重发布之后,会出现大量的负载均衡,导致选路不佳的问题解决办…

前端工程师leetcode算法面试必备-二叉树深度广度遍历

一、前言 Medium 难度主要考察结合二叉树性质的 CRUD 操作,而这一切的基础都离不开遍历二叉树。 二叉树是图的子集,因而同样适用以下两种搜索思想: **DFS(深度优先搜索):**沿着根节点递归下去&#xff0c…

普通程序员怎么赚多份钱?解锁更多赚钱新姿势

在当下这个社会,学会如何make money很重要。 咱们是个俗人,赚钱才是社会生存的头等大事。这不是高山流水的世界,而是能力创造财富,对于程序员来说,更是如此。 作为程序员,我们有更多挣钱的姿势!…

通过一个测试项目了解EF CORE

首先用vs2019创建一个.net core项目 可以是控制台应用程序,也可以是asp.net core项目 如果你使用控制台应用程序, 则可以在Main方法中直接使用EF Core进行CRUD操作。这通常用于测试或开发时快速进行数据库操作。 如果你使用ASP.NET Core应用程序, 则可以在控制器中使用EF Cor…