概述

主成分分析(Principal Component Analysis,PCA)是一种常用的数据降维和特征提取技术,用于将高维数据转换为低维的特征空间。其目标是通过线性变换将原始特征转化为一组新的互相无关的变量,这些新变量称为主成分,它们按照方差递减的顺序排列,以保留尽可能多的原始数据信息。

主成分分析的基本思想可以总结如下:

  1. 寻找新的特征空间:PCA通过线性变换,寻找一组新的特征空间,使得新的特征具有以下性质:

    • 主成分具有最大的方差,尽可能保留原始数据的信息。
    • 不同主成分之间彼此无关,即它们是正交的(互相垂直)。
  2. 降低数据维度:保留方差较大的主成分,舍弃方差较小的主成分,从而实现数据降维。

主成分分析的步骤如下:

  • 中心化数据:将原始数据进行中心化,使得数据的均值为零。
  • 计算协方差矩阵:计算特征之间的协方差矩阵,描述了特征之间的线性关系。
  • 计算特征值和特征向量:对协方差矩阵进行特征值分解,得到特征值和对应的特征向量。
  • 选择主成分:按照特征值的大小选择保留的主成分数量,通常选择方差较大的前几个主成分。
  • 得到新的特征空间:将原始特征投影到选定的主成分上,得到新的特征空间。

主成分分析的应用包括降维、去除数据噪声、数据可视化、特征选择等。通过保留最重要的特征,可以在减少数据维度的同时保持对数据的关键信息进行捕获。

在实际使用中,有时会将各个变量进行标准化,此时的协方差矩阵就相当于原始数据的相关系数矩阵。所以Alink的主成分分析组件提供了两种计算选择,参数CalculationType可以设置为相关系数矩阵(CORR)或者协方差矩阵(COV),默认为相关系数矩阵,即对标准化后的数据计算其主成分。

Alink库中的实现与应用

示例

以美国50个州的7种犯罪率为例,做主成分分析。这7种犯罪分别是:"murder", "rape", "robbery", "assault", "burglary", "larceny", "auto"。从这7个变量出发来评价各州的治安和犯罪情况是很难的,而使用主成分分析可以把这些变量概括为2-3个综合变量(即主成分),便于更简便的分析这些数据。

/**
* 主成分分析
* 1.基于默认的计算方式(CORR),计算主成分
* 2.设置K为4,将原先的7个维度降低到4个维度
* 3.输出向量列,使用VectorToColumnsBatchOp组组件将向量列转为4个数据列,名称分别为"prin1, prin2, prin3, prin4"
* */
static void c_1() throws Exception { MemSourceBatchOp source = new MemSourceBatchOp(CRIME_ROWS_DATA, CRIME_COL_NAMES); source.lazyPrint(10, "Origin data"); BatchOperator <?> pca_result = new PCA()
.setK(4)
.setSelectedCols("murder", "rape", "robbery", "assault", "burglary", "larceny", "auto")
.setPredictionCol(VECTOR_COL_NAME)
.enableLazyPrintModelInfo()
.fit(source)
.transform(source)
.link(
new VectorToColumnsBatchOp()
.setVectorCol(VECTOR_COL_NAME)
.setSchemaStr("prin1 double, prin2 double, prin3 double, prin4 double")
.setReservedCols("state")
)
.lazyPrint(10, "state with principle components"); pca_result
.select("state, prin1")
.orderBy("prin1", 100, false)
.lazyPrint(-1, "Order by prin1"); pca_result
.select("state, prin2")
.orderBy("prin2", 100, false)
.lazyPrint(-1, "Order by prin2"); BatchOperator.execute(); }

当然还可以先将数据标准化后再做主成分分析。如下

/**
* 主成分分析
* 1. 先将数据标准化
* 2. 设置计算方式为协方差计算,设置K为4,将原先的7个维度降低到4个维度
* 3.输出向量列,使用VectorToColumnsBatchOp组组件将向量列转为4个数据列,名称分别为"prin1, prin2, prin3, prin4"
* */
static void c_2() throws Exception { MemSourceBatchOp source = new MemSourceBatchOp(CRIME_ROWS_DATA, CRIME_COL_NAMES); Pipeline std_pca = new Pipeline()
.add(
new StandardScaler()
.setSelectedCols("murder", "rape", "robbery", "assault", "burglary", "larceny", "auto")
)
.add(
new PCA()
.setCalculationType(CalculationType.COV)
.setK(4)
.setSelectedCols("murder", "rape", "robbery", "assault", "burglary", "larceny", "auto")
.setPredictionCol(VECTOR_COL_NAME)
.enableLazyPrintModelInfo()
); std_pca
.fit(source)
.transform(source)
.link(
new VectorToColumnsBatchOp()
.setVectorCol(VECTOR_COL_NAME)
.setSchemaStr("prin1 double, prin2 double, prin3 double, prin4 double")
.setReservedCols("state")
)
.lazyPrint(10, "state with principle components");
BatchOperator.execute(); }

应用

在聚类方面的应用

主要通过降维来减少特征的维度,从而在聚类过程中降低数据的复杂度和计算成本,同时提高聚类的效果。主要实现过程如下:

  1. 使用 PCA 对数据进行降维,得到新的特征空间。设置降维后的维度,通常选择较小的维度以减少特征数。
  2. 在降维后的特征空间上应用聚类算法,比如 K-means、DBSCAN 等。
  3. 使用适当的聚类评估指标,如轮廓系数等,来评估聚类的效果。

示例代码如下:

/**
* 聚类+主成分分析
* 1. 将数据降维,只使用5%的维度数据
* 2. K-Means聚类:分别将原始数据与主成分分析后的数据做聚类操作
* */
static void c_3() throws Exception { AkSourceBatchOp source = new AkSourceBatchOp().setFilePath(DATA_DIR + SPARSE_TRAIN_FILE); source
.link(
new PcaTrainBatchOp()
.setK(39)
.setCalculationType(CalculationType.COV)
.setVectorCol(VECTOR_COL_NAME)
.lazyPrintModelInfo()
)
.link(
new AkSinkBatchOp()
.setFilePath(DATA_DIR + PCA_MODEL_FILE)
.setOverwriteSink(true)
);
BatchOperator.execute(); BatchOperator <?> pca_result = new PcaPredictBatchOp()
.setVectorCol(VECTOR_COL_NAME)
.setPredictionCol(VECTOR_COL_NAME)
.linkFrom(
new AkSourceBatchOp().setFilePath(DATA_DIR + PCA_MODEL_FILE),
source
); Stopwatch sw = new Stopwatch(); KMeans kmeans = new KMeans()
.setK(10)
.setVectorCol(VECTOR_COL_NAME)
.setPredictionCol(PREDICTION_COL_NAME); sw.reset();
sw.start();
kmeans
.fit(source)
.transform(source)
.link(
new EvalClusterBatchOp()
.setVectorCol(VECTOR_COL_NAME)
.setPredictionCol(PREDICTION_COL_NAME)
.setLabelCol(LABEL_COL_NAME)
.lazyPrintMetrics("KMeans")
);
BatchOperator.execute();
sw.stop();
System.out.println(sw.getElapsedTimeSpan()); sw.reset();
sw.start();
kmeans
.fit(pca_result)
.transform(pca_result)
.link(
new EvalClusterBatchOp()
.setVectorCol(VECTOR_COL_NAME)
.setPredictionCol(PREDICTION_COL_NAME)
.setLabelCol(LABEL_COL_NAME)
.lazyPrintMetrics("KMeans + PCA")
);
BatchOperator.execute();
sw.stop();
System.out.println(sw.getElapsedTimeSpan()); }

聊聊基于Alink库的主成分分析(PCA)的更多相关文章

  1. 05-04 scikit-learn库之主成分分析

    目录 scikit-learn库之主成分分析 一.PCA 1.1 使用场景 1.2 代码 1.3 参数 1.4 属性 1.5 方法 二.KernelPCA 三.IncrementalPCA 四.Spa ...

  2. 主成分分析 —PCA

    一.定义 主成分分析(principal components analysis)是一种无监督的降维算法,一般在应用其他算法前使用,广泛应用于数据预处理中.其在保证损失少量信息的前提下,把多个指标转化 ...

  3. 一步步教你轻松学主成分分析PCA降维算法

    一步步教你轻松学主成分分析PCA降维算法 (白宁超 2018年10月22日10:14:18) 摘要:主成分分析(英语:Principal components analysis,PCA)是一种分析.简 ...

  4. 05-03 主成分分析(PCA)

    目录 主成分分析(PCA) 一.维数灾难和降维 二.主成分分析学习目标 三.主成分分析详解 3.1 主成分分析两个条件 3.2 基于最近重构性推导PCA 3.2.1 主成分分析目标函数 3.2.2 主 ...

  5. 机器学习之主成分分析PCA原理笔记

    1.    相关背景 在许多领域的研究与应用中,通常需要对含有多个变量的数据进行观测,收集大量数据后进行分析寻找规律.多变量大数据集无疑会为研究和应用提供丰富的信息,但是也在一定程度上增加了数据采集的 ...

  6. 运用sklearn进行主成分分析(PCA)代码实现

    基于sklearn的主成分分析代码实现 一.前言及回顾 二.sklearn的PCA类介绍 三.分类结果区域可视化函数 四.10行代码完成葡萄酒数据集分类 五.完整代码 六.总结 基于sklearn的主 ...

  7. 多维数据处理之主成分分析(PCA)

    在灵巧手与假手理论中,为了研究人手的运动协同关系,需要采集各个关节的运动学量或者多个采集点的肌电信号,然而由于人手关节数目或者EMG采集点数量较多,加上多次采样,导致需要过多的数据需要处理.然而事实上 ...

  8. 系统评价——主成分分析PCA的R语言实现(六)

    主成分分析(Principal Component Analysis,PCA),是将多个变量通过线性变换以选出较少个数重要变量的一种多元统计分析方法,起到数据约减和集成的作用.在许多领域的研究与应用中 ...

  9. WebGIS中基于控制点库进行SHP数据坐标转换的一种查询优化策略

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.前言 目前项目中基于控制点库进行SHP数据的坐标转换,流程大致为:遍 ...

  10. 深度学习入门教程UFLDL学习实验笔记三:主成分分析PCA与白化whitening

    主成分分析与白化是在做深度学习训练时最常见的两种预处理的方法,主成分分析是一种我们用的很多的降维的一种手段,通过PCA降维,我们能够有效的降低数据的维度,加快运算速度.而白化就是为了使得每个特征能有同 ...

随机推荐

  1. 关于Unity3D第一视角下镜头穿墙的问题解决方法

    昨天做室内模型的时候,遇到一个非常棘手的问题,那就是第一视角在室内运行的时候,会出现穿墙的效果.类似下图效果,在靠近墙壁的时候,出现了镜头看见了墙壁外的情况,很显然这是不符合逻辑的.我们要做的就是避免 ...

  2. Dubbo负载均衡策略之 一致性哈希

    本文主要讲解了一致性哈希算法的原理以及其存在的数据倾斜的问题,然后引出解决数据倾斜问题的方法,最后分析一致性哈希算法在Dubbo中的使用.通过这篇文章,可以了解到一致性哈希算法的原理以及这种算法存在的 ...

  3. .NET源码解读kestrel服务器及创建HttpContext对象流程

    .NET本身就是一个基于中间件(middleware)的框架,它通过一系列的中间件组件来处理HTTP请求和响应.因此,本篇文章主要描述从用户键入请求到服务器响应的大致流程,并深入探讨.NET通过kes ...

  4. Android-NDK开发——基本概念

    在Android开发中,有时候出于安全,性能,代码共用的考虑,需要使用C/C++编写的库.虽然在现代化工具链的支持下,这个工作的难度已经大大降低,但是毕竟万事开头难,初学者往往还是会遇到很多不可预测的 ...

  5. 用CSS实现带动画效果的单选框

    预览一下效果:http://39.105.101.122/myhtml/CSS/singlebox2/singleRadio.html 布局结构为: 1 <div class="rad ...

  6. 据说,Transformer 不能有效地进行时间序列预测?

    简介 几个月前,我们介绍了 Informer 这个模型,相关论文 (Zhou, Haoyi, et al., 2021) 是一篇获得了 AAAI 2021 最佳论文奖的时间序列论文.我们也展示了一个使 ...

  7. Lakehouse: A New Generation of Open Platforms that Unify Data Warehousing and Advanced Analytics

    在Delta Lake官网上提到的一篇新一代湖仓架构的论文. 这篇论文由Databricks团队2021年发表于CIDR会议. 这个会议是对sigmod和vldb会议的补充. 可以看到这篇论文和前一篇 ...

  8. MyBatis(log4j)

    log4j介绍 Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件,甚至是套接口服务器.NT的事件记录器.UNIX Syslog守护 ...

  9. 长连接:chatgpt流式响应背后的逻辑

    一.前言: 提起长连接,我们并不陌生,最常见的长连接非websocket莫属了.即使没有在项目中实际用过,至少也应该有所接触.长连接指在一次网络通信中,客户端与服务器之间建立一条持久的连接,可以在多次 ...

  10. 【博客重构之路】webman-admin安装指南

    原文地址[博客重构之路]webman-admin安装指南 视频地址[bilibili] webman是什么 webman是一款基于workerman开发的高性能HTTP服务框架.webman用于替代传 ...