首页 > 其他分享 >聊聊基于Alink库的主成分分析(PCA)

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

时间:2023-10-03 12:23:11浏览次数:33  
标签:NAME Alink source 成分 聊聊 new PCA COL

概述

主成分分析(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());

}

标签:NAME,Alink,source,成分,聊聊,new,PCA,COL
From: https://www.cnblogs.com/zhiyong-ITNote/p/17740962.html

相关文章

  • 聊聊基于Alink库的随机森林模型
    概述随机森林(RandomForest)是一种集成学习(EnsembleLearning)方法,通过构建多个决策树并汇总其预测结果来完成分类或回归任务。每棵决策树的构建过程中都引入了随机性,包括数据采样和特征选择的随机性。随机森林的基本原理可以概括如下:随机抽样训练集:随机森林通过有放回抽样(Boots......
  • 速腾128线激光雷达播放pcap包,录制bag包,转PCD文件
    一下内容来自官方手册;速腾官网:https://www.robosense.cn/resources其中128线激光雷达对应文档为:《RS-Ruby产品用户手册中文》,翻到最下面就是。 一、安装官方最新驱动我的环境:Ubuntu18.04-ROSmelodicdesktop-full先安装pcapsudoapt-getinstall-ylibpcap-dev......
  • 解析pcap格式点云数据包
    1、多BB一句,不想写代码,就去速腾的驱动中复制粘贴。2、问别人的时候,应该问有没有128线速腾雷达数据帧格式资料(每个字段的意义),工具对应读取数据那一块源码能否给出来。 激光雷达每一帧的数据长度固定为1248字节,前42字节的前数据包标识、12组数据包、4字节时间戳和最后两字节雷达......
  • 聊聊基于Alink库的推荐系统
    概述Alink提供了一系列与推荐相关的组件,从组件使用得角度来看,需要重点关注如下三个方面:算法选择推荐领域有很多算法,常用的有基于物品/用户的协同过滤、ALS、FM算法等。对于不同的数据场景,算法也会在计算方式上有很大的变化。推荐方式输入信息可以有多种选择,输入结果也有......
  • 聊聊基于Alink库的决策树模型算法实现
    示例代码及相关内容来源于《Alink权威指南(Java版)》概述决策树模型再现了人们做决策的过程,该过程由一系列的判断构成,后面的判断基于前面的判断结果,不断缩小范围,最终推出结果。如下,基于决策树模型预测天气,是最常见的示例。天气的整个预测过程,就是不断地判断推测的过程。特征......
  • 面试官:聊聊ThreadLocal
    面试中ThreadLocal能问的,都在这了(qq.com)今天我们来盘一盘ThreadLocal,这篇力求对ThreadLocal一网打尽,彻底弄懂ThreadLocal的机制。话不多说,本文要解决的问题如下:为什么需要ThreadLocal应该如何设计ThreadLocal从源码看ThreadLocal的原理ThreadLocal内存泄露之......
  • 聊聊wireshark的进阶使用功能
    1.前言emmm,说起网络知识学习肯定离不来wireshark工具,这个工具能够帮助我们快速地定位网络问题以及帮助正在学习网络协议这块的知识的同学验证理论与实际的一大利器,平时更多的只是停留在初步的使用阶段。也是利用部门内部的网络兴趣小组的讨论机会,私下对wireshark的一些进阶功能,......
  • 聊聊wireshark的进阶使用功能 | 京东云技术团队
    1.前言emmm,说起网络知识学习肯定离不来wireshark工具,这个工具能够帮助我们快速地定位网络问题以及帮助正在学习网络协议这块的知识的同学验证理论与实际的一大利器,平时更多的只是停留在初步的使用阶段。也是利用部门内部的网络兴趣小组的讨论机会,私下对wireshark的一些进阶功能,比......
  • SharpPcap的使用
    上面的枚举类型DeviceModes是SharpPcap库中定义的一个枚举,用于表示不同的设备模式。这个枚举被标记为[Flags],这意味着它可以包含多个成员的组合,每个成员都对应于一个位掩码,可以使用按位或操作符来组合成多个模式。下面是DeviceModes枚举中定义的各个成员的介绍:None(无):......
  • 我的 Android 学习之路,一位 5 年中大厂的 Android 老哥跟你聊聊
    本文首发我的微信公众号:程序员徐公光阴似箭,日月如梭,时间真的过得飞快。加上实习,从事Android开发,差不多有5年了,在这里,我分享一下我的经验,在Android的学习路上,我是站在巨人的肩膀上成长起来的。大概分为三个部分一、Android职业规划二、Android学习路线三、如何进入大厂An......