降维(Dimensionality Reduction) 是机器学习中的一种重要的特征处理手段,它可以减少计算过程中考虑到的随机变量(即特征)的个数,其被广泛应用于各种机器学习问题中,用于消除噪声、对抗数据稀疏问题。它在尽可能维持原始数据的内在结构的前提下,从原始和噪声特征中提取潜在特征或在保持结构的同时压缩数据得到一组描述原数据的,低维度的隐式特征(或称主要特征)。

Spark MLlib为org.apache.spark.mllib.linalg.distributed.RowMatrix类上的降维提供支持。

MLlib机器学习库提供了两个常用的降维方法:

  • 奇异值分解(Singular Value Decomposition,SVD)
  • 主成分分析(Principal Component Analysis,PCA)

一、奇异值分解(SVD)

  

  MLlib内置的奇异值分解功能位于org.apache.spark.mllib.linalg包下的RowMatrixIndexedRowMatrix类中,所以,我们必须先通过已有数据创建出相应矩阵类型的对象,然后调用该类的成员方法来进行SVD分解:

%spark
import org.apache.spark.mllib.linalg.Matrix
import org.apache.spark.mllib.linalg.SingularValueDecomposition
import org.apache.spark.mllib.linalg.Vector
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.linalg.distributed.RowMatrix
// 创建样本矩阵,由一个稀疏向量两个稠密向量组成
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))
// 将样本矩阵生成RDD
val rows = sc.parallelize(data)
// 创建行矩阵
val mat: RowMatrix = new RowMatrix(rows) // 计算前5个奇异值和相应的奇异向量。
val svd: SingularValueDecomposition[RowMatrix, Matrix] = mat.computeSVD(5, computeU = true)
//
val U: RowMatrix = svd.U // U因子是一个行矩阵。
val s: Vector = svd.s // s奇异值存储在局部稠密向量中。
val V: Matrix = svd.V // V因子是一个局部稠密矩阵。

其中,V是右奇异向量,U是左奇异向量,s是奇异值。在实际运用中,只需要VS两个成员,即可通过矩阵计算达到降维的效果。

如果需要获得U成员,可以在进行SVD分解时,指定computeU参数,令其等于True,即可在分解后的svd对象中拿到U成员。

二、主成分分析(PCA)

  主成分分析(PCA) 是一种对数据进行旋转变换的统计学方法,其本质是在线性空间中进行一个基变换,使得变换后的数据投影在一组新的“坐标轴”上的方差最大化,随后,裁剪掉变换后方差很小的“坐标轴”,剩下的新“坐标轴”即被称为 主成分(Principal Component) ,它们可以在一个较低维度的子空间中尽可能地表示原有数据的性质。主成分分析被广泛应用在各种统计学、机器学习问题中,是最常见的降维方法之一。PCA有许多具体的实现方法,可以通过计算协方差矩阵,甚至是通过上文提到的SVD分解来进行PCA变换。

  MLlib提供了两种进行PCA变换的方法,第一种与上文提到的SVD分解类似,位于org.apache.spark.mllib.linalg包下的RowMatrix中,PCA变换示例:

%spark
import org.apache.spark.mllib.linalg.Matrix
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.linalg.distributed.RowMatrix 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))
// 生成RDD
val rows = sc.parallelize(data)
// 生成行矩阵
val mat: RowMatrix = new RowMatrix(rows) // 计算前4个主成分
// 将主成分存储到本地矩阵pc中
val pc: Matrix = mat.computePrincipalComponents(4) // 将行矩阵投影到由前4个主成分构成的线性空间。
val projected: RowMatrix = mat.multiply(pc)

输出:
pc: org.apache.spark.mllib.linalg.Matrix = -0.44859172075072673 -0.28423808214073987 0.08344545257592471 0.8364102009456849
                          0.13301985745398526 -0.05621155904253121 0.044239792581370035 0.17224337841622106
                          -0.1252315635978212 0.7636264774662965 -0.578071228563837 0.2554154886635869
                          0.21650756651919933 -0.5652958773533949 -0.7955405062786798 4.858121429822393E-5
                          -0.8476512931126826 -0.11560340501314653 -0.1550117891430013 -0.4533355491646027
注意:其中每一列代表一个主成分(新坐标轴),每一行代表原有的一个特征。

除了矩阵类内置的PCA变换外,MLlib还提供了一种“模型式”的PCA变换实现,它位于org.apache.spark.mllib.feature包下的PCA类,它可以接受RDD[Vectors]作为参数,进行PCA变换。

该方法特别适用于原始数据是LabeledPoint类型的情况,只需取出LabeledPointfeature成员(它是RDD[Vector]类型),对其做PCA操作后再放回,即可在不影响原有标签情况下进行PCA变换。

%spark
import org.apache.spark.mllib.feature.PCA
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.rdd.RDD val data: RDD[LabeledPoint] = sc.parallelize(Seq(
new LabeledPoint(0, Vectors.dense(1, 0, 0, 0, 1)),
new LabeledPoint(1, Vectors.dense(1, 1, 0, 1, 0)),
new LabeledPoint(1, Vectors.dense(1, 1, 0, 0, 0)),
new LabeledPoint(0, Vectors.dense(1, 0, 0, 0, 0)),
new LabeledPoint(1, Vectors.dense(1, 1, 0, 0, 0)))) // 计算前5个主成分。创建一个PCA类的对象,在构造器中给定主成分个数为3,并调用其fit方法来生成一个PCAModel类的对象pca,该对象保存了对应的主成分矩阵.
val pca = new PCA(3).fit(data.map(_.features)) // 将向量投影到由前3个主成分构成的线性空间,保留标签.对于LabeledPoint型的数据来说,可使用map算子对每一条数据进行处理,将features成员替换成PCA变换后的特征即可
val projected = data.map(p => p.copy(features = pca.transform(p.features)))

MLlib学习——降维的更多相关文章

  1. 关于spark的mllib学习总结(Java版)

    本篇博客主要讲述如何利用spark的mliib构建机器学习模型并预测新的数据,具体的流程如下图所示: 加载数据 对于数据的加载或保存,mllib提供了MLUtils包,其作用是Helper metho ...

  2. MLlib学习——基本统计

    给定一个数据集,数据分析师一般会先观察一下数据集的基本情况,称之为汇总统计或者概要性统计.一般的概要性统计用于概括一系列观测值,包括位置或集中趋势(比如算术平均值.中位数.众数和四分位均值),展型(比 ...

  3. MLlib学习——基本数据类型

    数据类型--基于RDD的API 本地矢量 标记点 本地矩阵 分布式矩阵 RowMatrix(行矩阵) IndexedRowMatrix(索引行矩阵) CoordinateMatrix(坐标矩阵) Bl ...

  4. 机器学习之路:python 特征降维 主成分分析 PCA

    主成分分析: 降低特征维度的方法. 不会抛弃某一列特征, 而是利用线性代数的计算,将某一维度特征投影到其他维度上去, 尽量小的损失被投影的维度特征 api使用: estimator = PCA(n_c ...

  5. "Blessing of Dimisionality: High Dimensional Feature and Its Efficient Compression for Face Verification"学习笔记

    这\(^{[1]}\)是一篇关于如何使用高维度特征在人脸验证中的文章,作者以主要LBP为例子,论述了高维特征和验证性能存在着正相关的关系,即人脸维度越高,验证的准确度就越高.由于那时候没有用DeepL ...

  6. python大战机器学习——数据降维

    注:因为公式敲起来太麻烦,因此本文中的公式没有呈现出来,想要知道具体的计算公式,请参考原书中内容 降维就是指采用某种映射方法,将原高维空间中的数据点映射到低维度的空间中 1.主成分分析(PCA) 将n ...

  7. sklearn_线性回归

    1. 普通线性回归 Linear Regression (1)目标: class sklearn.linear_model.LinearRegression (fit_intercept=True, n ...

  8. 《OD学spark》20160924scala基础

    拓展: Hadoop 3.0 NameNode HA NameNode是Active NameNode是Standby可以有多个 HBase Cluster 单节点故障? HBaster -> ...

  9. Spark学习之基于MLlib的机器学习

    Spark学习之基于MLlib的机器学习 1. 机器学习算法尝试根据训练数据(training data)使得表示算法行为的数学目标最大化,并以此来进行预测或作出决定. 2. MLlib完成文本分类任 ...

随机推荐

  1. dnspython模块报错 AttributeError: 'CNAME' object has no attribute 'address'

    有时候用到这个模块的时候会报错 AttributeError: 'CNAME' object has no attribute 'address' 如下所示 [root@ansible ch01]# ...

  2. centos7 RPM命令使用

    rpm -qa 软件名称 ---查看软件是否安装成功 rpm -ql  软件名称 ---查看软件中都有什么 rpm -qf  文件名称(绝对路径) ---查看属于哪个软件 rpm -ivh 包     ...

  3. SpringBoot学习笔记二之Spring整合Mybatis

    原文链接: https://www.toutiao.com/i6803235766274097678/ 在learn-admin-component子工程中加入搭建环境所需要的具体依赖(因为比较长配置 ...

  4. Word2010制作自动目录

    原文链接:https://www.toutiao.com/i6488296610873737741/ 原文从网上复制: 查看"开始"选项卡,"样式"功能组,我们 ...

  5. Vue下路由History mode 出现404,无法正常刷新

    在History mode下,如果直接通过地址栏访问路径,那么会出现404错误,这是因为这是单页应用(废话)-其实是因为调用了history.pushState API 所以所有的跳转之类的操作都是通 ...

  6. h5跳转高德地图

    <a href="https://uri.amap.com/marker?position=经度,纬度&name=所在的位置名称">高德地图</a>

  7. 缓存一致性性协议MESI笔记

    概述 今天的笔记只是讲解一下MESI的概念和使用场景的介绍,MESI(Modified Exclusive Shared Or Invalid)也称为伊利诺斯协议,是一种广泛使用的支持协会策略的缓存一 ...

  8. 知乎上一个关于Android面试的问题答案

    由于链接出错,这里附上原文链接:Touch Me 前段时间面试,自己以及小伙伴们简要的汇总的一些面试问题,可以对照的参考一下吧- 建议就是在面一家公司之前了解好这个公司的app是以什么为驱动的,例如电 ...

  9. 【白话科普】《逆局》最终 boss 隐藏自己的方式是?

    二狗子最近在看一个很火的电视剧<逆局>.作为一部悬疑犯罪剧,剧中多个案件交织并进,悬念和转折拉满,让狗子看的直呼过瘾.特别最后一幕,杨副座和主角团同时对 U 盘中的关键证据"器官 ...

  10. Solon Web 开发,十一、国际化

    Solon Web 开发 一.开始 二.开发知识准备 三.打包与运行 四.请求上下文 五.数据访问.事务与缓存应用 六.过滤器.处理.拦截器 七.视图模板与Mvc注解 八.校验.及定制与扩展 九.跨域 ...