降维(Dimensionality Reduction) 是机器学习中的一种重要的特征处理手段

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

Singular Value 奇异值 SVD


降维(Dimensionality Reduction) 是机器学习中的一种重要的特征处理手段,

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

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

一、奇异值分解(SVD)

概念介绍


奇异值分解(SVD)** 来源于代数学中的矩阵分解问题,对于一个方阵来说,

我们可以利用矩阵特征值和特征向量的特殊性质(矩阵点乘特征向量等于特征值数乘特征向量)

,通过求特征值与特征向量来达到矩阵分解的效果:

A = QΣQ^−1

这里,Q是由特征向量组成的矩阵,而Σ是特征值降序排列构成的一个对角矩阵(对角线上每个值是一个特征值

,按降序排列,其他值为0),特征值的数值表示对应的特征的重要性。

在很多情况下,最大的一小部分特征值的和即可以约等于所有特征值的和,而通过矩阵分解的降维就是通过在Q、Σ中

删去那些比较小的特征值及其对应的特征向量,使用一小部分的特征值和特征向量来描述整个矩阵,从而达到降维的效果。

但是,实际问题中大多数矩阵是以奇异矩阵形式,而不是方阵的形式出现的,奇异值分解是特征值分解在奇异矩阵上的推广形式,

它将一个维度为m×n奇异矩阵A分解成三个部分 :

A=UΣV^T

其中U、V是两个正交矩阵,其中的每一行(每一列)分别被称为 左奇异向量 和 右奇异向量,他们和Σ中对角线上的奇异值相对应,

通常情况下我们只需要取一个较小的值k,保留前k个奇异向量和奇异值即可,其中U的维度是m×k、V的维度是n×k、Σ是一个k×k的方阵,

从而达到降维效果。


SVD变换的例子


准备好一个矩阵,这里我们采用一个简单的文件a.mat来存储一个尺寸为(4,9)的矩阵,其内容如下:

  1 2 3 4 5 6 7 8 9
  5 6 7 8 9 0 8 6 7
  9 0 8 7 1 4 3 2 1
  6 4 2 1 3 4 2 1 5

随后,将该文本文件读入成RDD[Vector],并转换成RowMatrix,即可调用RowMatrix自带的computeSVD方法

计算分解结果,这一结果保存在类型为SingularValueDecomposition的svd对象中:


保持领先的奇异值的数量(0 < k < = n)。它可能会返回小于k如果有数值零奇异值或没有足够的丽兹值聚合前达到Arnoldi更新迭代的最大数量(以防矩阵A是坏脾气的)。

* [28.741265581939565,10.847941223452608,7.089519467626695]
 -0.32908987300830383  0.6309429972945555    0.16077051991193514
 -0.2208243332000108   -0.1315794105679425   -0.2368641953308101
 -0.35540818799208057  0.39958899365222394   -0.147099615168733
 -0.37221718676772064  0.2541945113699779    -0.25918656625268804
 -0.3499773046239524   -0.24670052066546988  -0.34607608172732196
 -0.21080978995485605  0.036424486072344636  0.7867152486535043
 -0.38111806017302313  -0.1925222521055529   -0.09403561250768909
 -0.32751631238613577  -0.3056795887065441   0.09922623079118417
 -0.3982876638452927   -0.40941282445850646  0.26805622896042314
 null

这里可以看到,由于限定了取前三个奇异值,所以奇异值向量s包含有三个从大到小排列的奇异值,

而右奇异矩阵V中的每一列都代表了对应的右奇异向量。U成员得到的是一个null值,这是因为在实际运用中,

只需要V和S两个成员,即可通过矩阵计算达到降维的效果,其具体原理可以参看这篇博文:

机器学习中的数学(5)-强大的矩阵奇异值分解(SVD)及其应用,这里不再赘述。如果需要获得U成员,

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

如下文所示:


下面我们将通过实例介绍其具体的使用方法。

package dimensionalityreduction
import org.apache.log4j.{Level, Logger}
import org.apache.spark.SparkContext
import org.apache.spark.mllib.linalg
import org.apache.spark.mllib.linalg.{Matrix, SingularValueDecomposition, Vectors}
import org.apache.spark.mllib.linalg.distributed.RowMatrix
import org.apache.spark.rdd.RDD
/**
 * Singular Value 奇异值 SVD
 *
 *     降维(Dimensionality Reduction) 是机器学习中的一种重要的特征处理手段,
 *  它可以减少计算过程中考虑到的随机变量(即特征)的个数,其被广泛应用于各种机器学习问题中,
 *  用于消除噪声、对抗数据稀疏问题。它在尽可能维持原始数据的内在结构的前提下,
 *  得到一组描述原数据的,低维度的隐式特征(或称主要特征)。
 *
 *       MLlib机器学习库提供了两个常用的降维方法:
 *   奇异值分解(Singular Value Decomposition,SVD)
 *   和
 *   主成分分析(Principal Component Analysis,PCA),
 *   下面我们将通过实例介绍其具体的使用方法。
 *
 */
object SingularValue {
  def main(args: Array[String]): Unit = {
    /**
     * 一、奇异值分解(SVD)
     *
     *  1、概念介绍
     *
     *      奇异值分解(SVD)** 来源于代数学中的矩阵分解问题,对于一个方阵来说,
     *    我们可以利用矩阵特征值和特征向量的特殊性质(矩阵点乘特征向量等于特征值数乘特征向量)
     *    ,通过求特征值与特征向量来达到矩阵分解的效果:
     *
     *    A = QΣQ^−1
     *
     *    这里,Q是由特征向量组成的矩阵,而Σ是特征值降序排列构成的一个对角矩阵(对角线上每个值是一个特征值
     *    ,按降序排列,其他值为0),特征值的数值表示对应的特征的重要性。
     *
     *      在很多情况下,最大的一小部分特征值的和即可以约等于所有特征值的和,而通过矩阵分解的降维就是通过在Q、Σ中
     *    删去那些比较小的特征值及其对应的特征向量,使用一小部分的特征值和特征向量来描述整个矩阵,从而达到降维的效果。
     *
     *        但是,实际问题中大多数矩阵是以奇异矩阵形式,而不是方阵的形式出现的,奇异值分解是特征值分解在奇异矩阵上的推广形式,
     *    它将一个维度为m×n奇异矩阵A分解成三个部分 :
     *    A=UΣV^T
     *
     *        其中U、V是两个正交矩阵,其中的每一行(每一列)分别被称为 左奇异向量 和 右奇异向量,他们和Σ中对角线上的奇异值相对应,
     *    通常情况下我们只需要取一个较小的值k,保留前k个奇异向量和奇异值即可,其中U的维度是m×k、V的维度是n×k、Σ是一个k×k的方阵,
     *    从而达到降维效果。
     *
     */
    /**
     * 2、SVD变换的例子
     *
     *
     * 准备好一个矩阵,这里我们采用一个简单的文件a.mat来存储一个尺寸为(4,9)的矩阵,其内容如下:
     *
      1 2 3 4 5 6 7 8 9
      5 6 7 8 9 0 8 6 7
      9 0 8 7 1 4 3 2 1
      6 4 2 1 3 4 2 1 5
        随后,将该文本文件读入成RDD[Vector],并转换成RowMatrix,即可调用RowMatrix自带的computeSVD方法
      计算分解结果,这一结果保存在类型为SingularValueDecomposition的svd对象中:
    */
    Logger.getLogger("org").setLevel(Level.OFF)
    val sc = new SparkContext("local[*]", "li")
    val data: RDD[linalg.Vector] = sc.textFile("/home/rjxy/IdeaProjects/spark/spark_mllib_course/src/main/resources/data/a.mat")
      .map(
        (_: String).split(" ").map((_: String).toDouble)
      )
      .map((line: Array[Double]) => Vectors.dense(line))
    val matrix: RowMatrix = new RowMatrix(data)
    //保持领先的奇异值的数量(0 < k < = n)。它可能会返回小于k如果有数值零奇异值或没有足够的丽兹值聚合前达到Arnoldi更新迭代的最大数量(以防矩阵A是坏脾气的)。
    val value: SingularValueDecomposition[RowMatrix, Matrix] = matrix.computeSVD(3)
    println(value.s)
    println(value.V)
    println(value.U)
    /**
     * [28.741265581939565,10.847941223452608,7.089519467626695]
      -0.32908987300830383  0.6309429972945555    0.16077051991193514
      -0.2208243332000108   -0.1315794105679425   -0.2368641953308101
      -0.35540818799208057  0.39958899365222394   -0.147099615168733
      -0.37221718676772064  0.2541945113699779    -0.25918656625268804
      -0.3499773046239524   -0.24670052066546988  -0.34607608172732196
      -0.21080978995485605  0.036424486072344636  0.7867152486535043
      -0.38111806017302313  -0.1925222521055529   -0.09403561250768909
      -0.32751631238613577  -0.3056795887065441   0.09922623079118417
      -0.3982876638452927   -0.40941282445850646  0.26805622896042314
      null
     *
     *    这里可以看到,由于限定了取前三个奇异值,所以奇异值向量s包含有三个从大到小排列的奇异值,
     * 而右奇异矩阵V中的每一列都代表了对应的右奇异向量。U成员得到的是一个null值,这是因为在实际运用中,
     * 只需要V和S两个成员,即可通过矩阵计算达到降维的效果,其具体原理可以参看这篇博文:
     * 机器学习中的数学(5)-强大的矩阵奇异值分解(SVD)及其应用,这里不再赘述。如果需要获得U成员,
     * 可以在进行SVD分解时,指定computeU参数,令其等于True,即可在分解后的svd对象中拿到U成员,
     * 如下文所示:
     */
    val value1: SingularValueDecomposition[RowMatrix, Matrix] = matrix.computeSVD(3, computeU = true)
    println(value1.s)
    println(value1.V)
    val u: RowMatrix = value1.U
    val rows: RDD[linalg.Vector] = u.rows
    println(rows.foreach(println))
    PrincipalComponentAnalysis
  }
}
目录
相关文章
|
2月前
|
机器学习/深度学习 算法 数据可视化
机器学习模型中特征贡献度分析:预测贡献与错误贡献
本文将探讨特征重要性与特征有效性之间的关系,并引入两个关键概念:预测贡献度和错误贡献度。
276 3
|
6月前
|
机器学习/深度学习 人工智能 并行计算
人工智能平台PAI产品使用合集之机器学习PAI中特征重要性的原理不知道如何解决
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。
|
5月前
|
机器学习/深度学习 人工智能 JSON
人工智能平台PAI产品使用合集之创建特征视图时遇到报错,该如何排查
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。
|
4月前
|
存储 机器学习/深度学习 人工智能
人工智能平台PAI使用问题之特征平台是否可以与Java进行对接
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。
|
5月前
|
机器学习/深度学习 存储 人工智能
人工智能平台PAI产品使用合集之选择使用Hologres作为在线特征存储,响应延时大概在多久
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。
|
5月前
|
机器学习/深度学习 数据采集 存储
人工智能平台PAI产品使用合集之FeatureStore是否支持推荐场景下的session特征
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。
|
5月前
|
机器学习/深度学习 人工智能 前端开发
人工智能平台PAI产品使用合集之创建了实时特征视图,里面的数据是通过什么传入的
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。
|
5月前
|
机器学习/深度学习 算法 C++
机器学习归一化特征编码(二)
这篇文档讨论了机器学习中的特征编码,特别是独热编码(OneHotEncoder)在处理离散变量时的作用。它指出,对于多分类变量,独热编码是常用方法,但对二分类变量通常不需要。在Python的`sklearn`库中,`OneHotEncoder`可以用来实现这一过程,并可以通过设置`drop='if_binary'`来忽略二分类变量。文档还提到了逻辑回归,解释了正则化参数`C`和`penalty`,并列举了不同的优化算法,如`liblinear`、`lbfgs`等。
|
5月前
|
机器学习/深度学习 API Python
机器学习特征降维
这篇内容概述了特征降维在机器学习中的重要性,包括三个主要方法:低方差过滤法、PCA(主成分分析)和相关系数法。低方差过滤法通过删除方差低于阈值的特征来减少无关信息;PCA通过正交变换降低数据的维数,保留大部分信息;相关系数法(如皮尔逊和斯皮尔曼相关系数)用于评估特征间的相关性,去除高度相关的特征以简化模型。这些技术有助于提高模型效率和泛化能力。
|
5月前
|
机器学习/深度学习 算法 数据处理
机器学习归一化特征编码(一)
特征缩放是机器学习预处理的关键步骤,它包括归一化和标准化。归一化通过最大最小值缩放,将数据转换到[0,1]区间,有助于梯度下降算法更快收敛,减少数值较大特征的影响。标准化则通过减去均值并除以标准差,确保数据具有零均值和单位方差,适用于关注数据分布情况的算法。例如,欧氏距离计算时,未归一化的特征可能导致模型偏向数值较大的特征。归一化能提升模型精度,尤其是当距离度量如欧式距离时。常见的实现方法有`MinMaxScaler`,它将每个特征值缩放到用户指定的范围,如[0,1]。而`StandardScaler`执行Z-Score标准化,数据分布符合标准正态分布。

热门文章

最新文章

下一篇
无影云桌面