聊聊基于Alink库的主成分分析(PCA)

聊聊,基于,alink,成分,分析,pca · 浏览次数 : 4

小编点评

**主成分分析 (PCA)** 是一种常用的降维和特征提取技术,用于将高维数据转换为低维的特征空间。 **基本思想:** 1. 寻找新的特征空间。 2. 计算协方差矩阵。 3. 计算特征值和特征向量。 4. 选择主成分。 5. 得到新的特征空间。 **应用:** * 降维 * 数据可视化 * 特征选择 **步骤:** 1. **中心化数据:**将原始数据中心化,使其均值为零。 2. **计算协方差矩阵:**使用协方差矩阵来度量特征之间的相关性。 3. **计算特征值和特征向量:**从协方差矩阵中提取特征值,并构建特征向量。 4. **选择主成分:**根据特征值的大小排序,选择最重要的特征。 5. **构造新的特征空间:**使用特征向量构建新的特征空间。 **示例代码:** ```python # PCA 降维示例代码 import pandas as pd from sklearn.decomposition import PCA # 加载数据 data = pd.read_csv("data.csv") # 创建 PCA 对象 pca = PCA() # 进行降维 pca_result = pca.fit_transform(data) # 打印结果 print(pca_result) ``` **其他说明:** * PCA 是一种线性降维技术,因此数据必须线性可分。 * 选择主成分的算法取决于数据和目的。 * PCA 可以用于数据可视化,因为它可以将高维数据投影到低维空间中。

正文

概述

主成分分析(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)相似的内容:

聊聊基于Alink库的主成分分析(PCA)

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

聊聊基于Alink库的随机森林模型

概述 随机森林(Random Forest)是一种集成学习(Ensemble Learning)方法,通过构建多个决策树并汇总其预测结果来完成分类或回归任务。每棵决策树的构建过程中都引入了随机性,包括数据采样和特征选择的随机性。 随机森林的基本原理可以概括如下: 随机抽样训练集:随机森林通过有放回抽

聊聊基于Alink库的推荐系统

概述 Alink提供了一系列与推荐相关的组件,从组件使用得角度来看,需要重点关注如下三个方面: 算法选择 推荐领域有很多算法,常用的有基于物品/用户的协同过滤、ALS、FM算法等。对于不同的数据场景,算法也会在计算方式上有很大的变化。 推荐方式 输入信息可以有多种选择,输入结果也有多种情况。 同时输

聊聊基于Alink库的决策树模型算法实现

示例代码及相关内容来源于《Alink权威指南(Java版)》 概述 决策树模型再现了人们做决策的过程,该过程由一系列的判断构成,后面的判断基于前面的判断结果,不断缩小范围,最终推出结果。 如下,基于决策树模型预测天气,是最常见的示例。天气的整个预测过程,就是不断地判断推测的过程。 特征分类 特征数据

C#如何创建一个可快速重复使用的项目模板

写在前面 其实很多公司或者资深的开发都有自己快速创建项目的脚手架的,有的是魔改代码生成器实现,有的直接基于T4,RazorEngine等模板引擎打造;但无论如何,其最终目的其实就是搭建一个自定义项目模板(脚手架)。 今天我们聊聊:如何基于官方的cli donet new 命令创建自己的项目模板。 什

聊聊日志聚类算法及其应用场景

阅读《[基于 Flink ML 搭建的智能运维算法服务及应用](https://mp.weixin.qq.com/s/yhXiQtUSR4hxp9XWrkiiew "基于 Flink ML 搭建的智能运维算法服务及应用")》一文后,对其中日志聚类算法有了些思考。 ### 概述 日志聚类,简而言之是对

聊聊Transformer和GPT模型

本文基于《生成式人工智能》一书阅读摘要。感兴趣的可以去看看原文。 可以说,Transformer已经成为深度学习和深度神经网络技术进步的最亮眼成果之一。Transformer能够催生出像ChatGPT这样的最新人工智能应用成果。 ## 序列到序列(seq2seq) Transformer能实现的核心

聊聊我认为的分布式、集群实现关键点

基于常见的中间件(Mysql、ElasticSearch、Zookeeper、Kafka、Redis)等分布式集群设计的机制,自己总结了在在集群设计过程中需要考虑的通用问题。 ### 节点通信机制 主节点的增加、删除、通信机制。 ### 路由算法 即数据路由到哪个节点的策略机制。在集群内有多个节点,

聊聊Spring Cloud Gateway

Spring Cloud Gateway是基于Spring Boot 2.0、Spring WebFlux和Project Reactor等技术开发的网关,它不仅提供了统一的路由请求的方式,还基于过滤链的方式提供了网关最基本的功能;解决了Spring Cloud Zuul的性能问题。

聊聊神经网络的基础知识

来自《深度学习入门:基于Python的理论与实现》 张量 Numpy、TensorFlow、Pytorch等框架主要是为了计算张量或是基于张量计算。 标量:0阶张量;12,4,3, 向量:一阶张量;[12,4,3] 矩阵:二阶张量;[ [12,4,3], [11,2,3] ] 多阶张量:多维数组;