降维(Dimensionality Reduction) 是机器学习中的一种重要的特征处理手段,它可以减少计算过程中考虑到的随机变量(即特征)的个数,其被广泛应用于各种机器学习问题中,用于消除噪声、对抗数据稀疏问题。它在尽可能维持原始数据的内在结构的前提下,得到一组描述原数据的,低维度的隐式特征(或称主要特征)。简单来说,在高维数据中筛选出对我们有用的变量,减小计算复杂度提高模型训练效率和准确率,这就是我们要说的降维。

MLlib机器学习库提供了两个常用的降维方法:奇异值分解(Singular Value Decomposition,SVD) 和 主成分分析(Principal Component Analysis,PCA),下面我们将通过实例介绍其具体的使用方法。

一、公式和原理

奇异值分解(SVD)将矩阵A分解为三个矩阵:U,Σ和V,如下公式

公式:

 
奇异值分解公式

其中

左奇异矩阵 :,U 为一个标准正交矩阵,也叫实对称矩阵,怎么理解这个概念呢?就是说矩阵A的转置等于其本身,或者说矩阵U的维度为m×m ,用符号表示为

 
矩阵U

,我们称U 为左奇异矩阵。

奇异值 : Σ 是一个对角矩阵,仅在主对角线上有值,其它元素均为0,用符合表示为

 
奇异值

,我们称Σ为奇异值。

右奇异矩阵 : V也是一个正交矩阵,这会儿知道是啥意思了吧,和U的解释一样,用符号表示为

 
图5

,我们称 V 为 右奇异矩阵。

奇异值分解 : 就是想要找到一个比较小的值k,保留前k个奇异向量和奇异值,其中 U 的维度从 m×m 变成了 m×k , V 的维度从 n×n 变成了 m×k ,Σ 的维度从 m×n 变成了 k×k 的方阵,从而达到降维效果。

二、代码实现

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

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
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;

2.1、准备一个矩阵

准备好一个矩阵,这里我们采用一个简单的文件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

2.2、computeSVD方法计算分解结果

随后,将该文本文件读入成RDD[Vector],并转换成RowMatrix,即可调用RowMatrix自带的computeSVD方法计算分解结果,这一结果保存在类型为SingularValueDecomposition的svd对象中

SparkConf conf = new SparkConf().setAppName("SVD").setMaster("local");
JavaSparkContext sc = new JavaSparkContext(conf); JavaRDD<String> source = sc.textFile("data/mllib/a.data");
JavaRDD<Vector> data = source.map(line->{
String[] parts = line.split(" ");
return Vectors.dense(Double.parseDouble(parts[0]),
Double.parseDouble(parts[1]),
Double.parseDouble(parts[2]));
});
RowMatrix rm = new RowMatrix(data.rdd());

2.3、保留前3个奇异值

SingularValueDecomposition<RowMatrix,Matrix> svd = rm.computeSVD(3,false,1.0E-9d);

2.4、得到V、s、U成员

通过访问svd对象的V、s、U成员分别拿到进行SVD分解后的右奇异矩阵、奇异值向量和左奇异矩阵:

System.out.println("s=================");
System.out.println(svd.s());
System.out.println("s================="); System.out.println("V=================");
System.out.println(svd.V());
System.out.println("V================="); System.out.println("U=================");
System.out.println(svd.U());
System.out.println("U=================");

控制台输出结果:

s========================================================
[28.741265581939565,10.847941223452608,7.089519467626695]
s======================================================== V===============================================================
-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
V=============================================================== U====
null
U====

这里可以看到,由于限定了取前三个奇异值,所以奇异值向量s包含有三个从大到小排列的奇异值,而右奇异矩阵V中的每一列都代表了对应的右奇异向量。 U成员得到的是一个null值,这是因为在实际运用中,只需要V和S两个成员,即可通过矩阵计算达到降维的效果。

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

SingularValueDecomposition<RowMatrix,  Matrix> svd = rm.computeSVD(3,true,1.0E-9d);
System.out.println("U=================");
System.out.println(svd.U());
System.out.println("U=================");

控制台输出结果:

U============================================================
org.apache.spark.mllib.linalg.distributed.RowMatrix@25c2a9e3
U============================================================

三、优缺点

降维的好处:减小数据维度和需要的存储空间,节约模型训练计算时间,去掉冗余变量,提高算法的准确度,有利于数据可视化。简化数据,去除噪声点,提高算法的结果。

缺点:数据的转换可能难以理解;

适用数据类型:数值型。

四、 应用

通过SVD对数据的处理,我们可以使用小得多的数据集来表示原始数据集,这样做实际上是去除了噪声和冗余信息,以此达到了优化数据、提高结果的目的。有以下应用:

隐形语义索引:最早的SVD应用之一就是信息检索,我们称利用SVD的方法为隐性语义检索(LSI)或隐形语义分析(LSA)

推荐系统:SVD的另一个应用就是推荐系统,较为先进的推荐系统先利用SVD从数据中构建一个主题空间,然后再在该空间下计算相似度,以此提高推荐的效果。

spark机器学习从0到1奇异值分解-SVD (七)的更多相关文章

  1. spark机器学习从0到1介绍入门之(一)

      一.什么是机器学习 机器学习(Machine Learning, ML)是一门多领域交叉学科,涉及概率论.统计学.逼近论.凸分析.算法复杂度理论等多门学科.专门研究计算机怎样模拟或实现人类的学习行 ...

  2. spark机器学习从0到1特征提取 TF-IDF(十二)

        一.概念 “词频-逆向文件频率”(TF-IDF)是一种在文本挖掘中广泛使用的特征向量化方法,它可以体现一个文档中词语在语料库中的重要程度. 词语由t表示,文档由d表示,语料库由D表示.词频TF ...

  3. 机器学习中的数学-矩阵奇异值分解(SVD)及其应用

    转自:http://www.cnblogs.com/LeftNotEasy/archive/2011/01/19/svd-and-applications.html 版权声明: 本文由LeftNotE ...

  4. spark机器学习从0到1基本数据类型之(二)

        MLlib支持存储在单个机器上的局部向量和矩阵,以及由一个或多个RDD支持的分布式矩阵. 局部向量和局部矩阵是用作公共接口的简单数据模型. 底层线性代数操作由Breeze提供. 在监督学习中使 ...

  5. spark机器学习从0到1特征变换-标签和索引的转化(十六)

      一.原理 在机器学习处理过程中,为了方便相关算法的实现,经常需要把标签数据(一般是字符串)转化成整数索引,或是在计算结束后将整数索引还原为相应的标签. Spark ML 包中提供了几个相关的转换器 ...

  6. spark机器学习从0到1特征选择-卡方选择器(十五)

      一.公式 卡方检验的基本公式,也就是χ2的计算公式,即观察值和理论值之间的偏差   卡方检验公式 其中:A 为观察值,E为理论值,k为观察值的个数,最后一个式子实际上就是具体计算的方法了 n 为总 ...

  7. spark机器学习从0到1机器学习工作流 (十一)

        一.概念 一个典型的机器学习过程从数据收集开始,要经历多个步骤,才能得到需要的输出.这非常类似于流水线式工作,即通常会包含源数据ETL(抽取.转化.加载),数据预处理,指标提取,模型训练与交叉 ...

  8. spark机器学习从0到1决策树(六)

      一.概念 决策树及其集合是分类和回归的机器学习任务的流行方法. 决策树被广泛使用,因为它们易于解释,处理分类特征,扩展到多类分类设置,不需要特征缩放,并且能够捕获非线性和特征交互. 诸如随机森林和 ...

  9. spark机器学习从0到1特征抽取–Word2Vec(十四)

      一.概念 Word2vec是一个Estimator,它采用一系列代表文档的词语来训练word2vecmodel.该模型将每个词语映射到一个固定大小的向量.word2vecmodel使用文档中每个词 ...

随机推荐

  1. thinkphp--create()的使用方法(个人感悟)

    M方法和D方法的区别 ThinkPHP 中M方法和D方法都用于实例化一个模型类,M方法 用于高效实例化一个基础模型类,而 D方法 用于实例化一个用户定义模型类. 使用M方法 如果是如下情况,请考虑使用 ...

  2. tp5--开启与关闭调试模式

    https://www.cnblogs.com/finalanddistance/p/8906000.html TP5 显示错误信息   在TP5中,我们运行的代码有错误无法执行时,只显示页面错误,而 ...

  3. 【Python可视化】使用Pyecharts进行奥运会可视化分析~

    项目全部代码 & 数据集都可以访问我的KLab --[Pyecharts]奥运会数据集可视化分析-获取,点击Fork即可- 受疫情影响,2020东京奥运会将延期至2021年举行: 虽然延期,但 ...

  4. python学习23之标准库

    '''''''''标准库1.datetime 日期时间模块存在于Lib/datetime.py文件内'''from datetime import datetime,date,time #from d ...

  5. wireshark的基础认识

    简单的抓包分析 使用过滤功能: 数据分别经过:物理层-> 数据链路层->网络层 ->传输层 ->应用层 下面将详细的查分各个层所涉及的东西. 物理层:单位是比特流 数据链路层; ...

  6. LaTex中文article模板(支持代码、数学、TikZ)

    代码 请使用XeLatex编译 main.tex \documentclass{article} \usepackage{ctex} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ...

  7. Java初学者最近三次作业的心得体会

    作为一个初学者,简单的谈一下自己的作业心得体会.如果你是完全没有接触过Java的学习,本篇博文可能会有些收获,如果你已经学习Java有一段时间了,那么可以放弃这篇文章了,因为这篇文章讲解的是基本的东西 ...

  8. WSFC与DFS

    WSFC里面的文件服务器群集,文件始终是一份,数据始终存放在群集磁盘中,通过群集来维持文件服务器这项服务始终持续可用,在2012之前同一时间WSFC只能有一台节点对外提供文件服务,2012开始群集引入 ...

  9. 阿里云ECS安装JAVA+MYSQL+NGINX

    2019独角兽企业重金招聘Python工程师标准>>> 1.准备工作 查看linux版本: linux版本为CentOS 7.4 查看系统信息: 系统为64位 确保服务器系统处于最新 ...

  10. 一维滑动窗口(SlidingWindow)

    滑动窗口(Sliding Window)问题经常使用快慢指针(slow, fast pointer)[0, slow) 的区域为滑动窗口已经探索过的区域[slow, fast]的区域为滑动窗口正在探索 ...