Spark 3.0 - 16.ML SVD 奇异值分解理论与实战

news2024/11/17 13:24:12

目录

一.引言

二.奇异值分解理论

1.行矩阵 RowMatrix

2.奇异值分解算法

三.奇异值分解实战

1.构建 RowMatrix

2.奇异值分解 SVD

四.总结


一.引言

奇异值分解是矩阵分解计算的一种常用方法,矩阵分解主要用于数据降维,通过将高维的数据映射到低维,实现特征的降维与特征重要性筛选。

二.奇异值分解理论

1.行矩阵 RowMatrix

介绍奇异值分解与矩阵分解前,首先熟悉下 Spark 的 RowMatrix 行矩阵,我们可以将行矩阵看作是包含若干个行向量 vector 的特征矩阵集合,每一行就是一个具有相同格式的向量集合。

new RowMatrix(rows: RDD[Vector])
new RowMatrix(rows: RDD[Vector], nRows: Long, nCols: Int)

rows 代表数据列表、nRows 代表行数、nCols 代表列数。我们可以通过混合的方式,同时构造 SparseVector 与 DenseVertor:

    // 加载向量
    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)
    )

    //转换成RowMatrix的输入格式
    val data1 = spark.sparkContext.parallelize(data)

当然这里 SparseVector 也不一定要与 DenseVector 维度保持一致,SparseTensor 可以比 Dense 长但不能比 DenseVector 短。

2.奇异值分解算法

奇异值分解 (SVD) 是线性代数中重要的矩阵分解方法,一般来说一个矩阵可以使用其特征向量来表示,即矩阵 A 可以表示为:

A\lambda =V\lambda

这里 V 成为特征向量 λ 对应的特征值,首先需要注意的是,任意一个矩阵与一个向量相乘后,相当于进行了一次线性转换,例如:

A=\begin{bmatrix} 3 &0 \\ 0& 1 \end{bmatrix}=\begin{bmatrix} 3 &0 \\ 0& 1 \end{bmatrix}\begin{bmatrix} x\\y \end{bmatrix} = \begin{bmatrix} 3x \\y \end{bmatrix}

可以认为一个矩阵在计算过程中是一个将其在一个方向拉伸的过程,需要关心的是拉伸的方向与幅度。一般情况下,拉伸幅度在线性变换中是可以忽略或近似计算的常量,我们仅仅需要关心的就剩其拉伸的方向了。当矩阵维数确认时,可以将其分解为若干个带有方向特征的向量,获取其不同的变换方向从而确定出矩阵。

基于上述解释,可以简单的把奇异值分解 SVD 理解为 - 将一个矩阵分解为带有方向向量的矩阵相乘:

C=U\Sigma V^{T}

其中 U 是一个 mxr 的矩阵,∑ 是一个 rxr 的方阵,而 V 是一个 nxr 的矩阵,这三个方阵相乘得到一个 C 的近似。这样做的好处是可以极大的减少矩阵的存储空间,很多数字矩阵经过 SVD 处理后,可以获得10倍的空间缩减,从而大大提高效率。

三.奇异值分解实战

1.构建 RowMatrix

    val spark = SparkSession
      .builder      //创建spark会话
      .master("local")  //设置本地模式
      .appName("SVD")  //设置名称
      .getOrCreate()   //创建会话变量

    // 加载向量
    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)
    )

    data.foreach(v => {
      println(v)
    })

    //转换成RowMatrix的输入格式
    val data1 = spark.sparkContext.parallelize(data)

构建一个 SparseVector 两个 DenseVector 组成的矩阵,矩阵维度为 3x5。

2.奇异值分解 SVD

    // 建立模型
    val rm = new RowMatrix(data1)           		 //读入行矩阵
    val SVD = rm.computeSVD(2, computeU = true)	 //进行SVD计算
    println(SVD)							 //打印SVD结果矩阵

    val U = SVD.U
    val s = SVD.s
    val V = SVD.V

    println(U.numRows(), U.numCols())
    println(s)
    println(V.numRows, V.numCols)

通过 SVD.U、SVD.s、SVD.V 可以分别获得 U、∑、V 矩阵,这样我们无需保存完整的大矩阵,只需保存三个相对较小的矩阵即可对原始矩阵的向量进行复原,这在一定程度上和 DNN 感知机比较像。 

(3,2)
[13.029275535600473,5.368578733451684]
(5,2)

四.总结

上面的示例中展示了低维情况下的数据变换,如果矩阵在高维状态下,通过与 vector 相乘达到线性变换的场景我们可能无法用图像表示。但是变换同样是多个方向的,我们通过特征值分解可以得到前 N 个特征向量从而提取前 N 个特征的方向,通过 N 个方向的变换近似矩阵整体的方向变换,达到降维的需求。完整的推理过程打击可以参考:Singular Value Decomposition (SVD) tutorial。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/130141.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Navicat 16 中改进了的协同合作

几年前,当 Navicat 团队加入 Navicat Cloud 协同合作工具时,几乎没有人知道一个全球大流行的疫情会使协同合作成为大多数组织的重要组成部分,尤其是那些提供任何信息技术(IT)相关服务的组织。在 2021 年的最后几天&…

ArcGIS基础实验操作100例--实验26创建多分辨率DEM

本实验专栏来自于汤国安教授《地理信息系统基础实验操作100例》一书 实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 基础编辑篇--实验26 创建多分辨率DEM 目录 一、实验背景 二、实验数据 三、实验步骤 方法一&#xff…

嵌入式C语言设计模式 --- 关于工厂模式的总结

前面三篇关于工厂模式的文章,主要介绍了三种工厂模式,分别是:简单工厂模式、工厂方法模式、抽象工厂模式。 关于这三种工厂模式,都各有利弊,应该根据不同的业务开发场景进行选择使用。 图片来源:网络 简单工厂模式 是最容易理解的一种设计模式,简单工厂模式不属于23种…

Spring循环依赖探究

1. 前言 Spring在较新版本中已经默认不允许bean之间发生「循环依赖」了,如果检测到循环依赖,容器启动时将会报错,此时可以通过配置来允许循环依赖。 spring.main.allow-circular-referencestrue什么是循环依赖? 循环依赖也叫循环…

【Python百日进阶-数据分析】Day143 - plotly箱线图:px.box()实例

文章目录四、实例4.1 plotly.express箱线图4.1.1 基本箱线图4.1.2 为 x的每个值绘制一个箱线图4.1.3 显示基础数据4.1.4 选择计算四分位数的算法4.1.5 四分位数算法之间的区别4.1.6 风格箱线图4.1.7 Dash中的箱线图四、实例 箱线图是变量通过其四分位数分布的统计表示。盒子的…

并发编程——3.共享模型之管程

目录3.共享模型之管程3.1.共享带来的问题3.1.1.Java中的体现3.1.2.问题分析3.1.3.临界区 (Critical Section)3.1.4.竞态条件 (Race Condition)3.2.synchronized 解决方案3.3.方法上的 synchronized3.4.变量的线程安全分析3.4.1.成员变量和静态变量是否线程安全?3.4.…

SpringBoot+VUE前后端分离项目学习笔记 - 【07 SpringBoot实现增删改查】

增删改查代码编写 UserController.java package com.zj.demo.controller;import com.zj.demo.entity.User; import com.zj.demo.mapper.UserMapper; import com.zj.demo.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.sp…

CVPR 2017|Deep Feature Flow for Video Recognition论文复现(pytorch版)

🏆引言:深度卷积神经网络在图像识别任务中取得了巨大的成功。然而,将最先进的图像识别网络转移到视频上并非易事,因为每帧评估速度太慢且负担不起。我们提出了一种快速准确的视频识别框架——深度特征流DFF。它只在稀疏关键帧上运…

数据结构与算法_五大算法之--回溯算法

1 回溯算法 回溯算法具有通用性,但是算法的效率不高,通常可以通过剪枝等操作提高算法的效率。 算法思想: 在包含问题的所有解空间树中,按照深度优先搜索的策略,从根节点出发,深度搜索解空间树。当搜索到某…

APSIM作物生长模型学习

由于研究需要,将对APSIM模型使用进行一定学习,特做此笔记,也供该模型的初学者共同进步。 首先是版本选择,这个模型发展较长,有经典的classic版本和次世代版本,而经过实际验证,次世代版本和经典版…

RHCSA 第六天笔记

网络配置 1,ip 命令 ip a 2,修改配置文件(不推荐) 3,nmcli命令 4,nmtui命令 5,cockpit 网络接口是指网络中的计算机或网络设备与其他设备实现通讯的进出口。这里,主要是指计算机的网络接口即网…

学习笔记之Vue组件化编程(二)

Vue组件化编程(二)Vue组件化编程一、模块与组件,模块化与组件化1.1 对组件的理解1.2 模块1.3 组件1.4 模块化1.5 组件化(二)Vue组件化编程 一、模块与组件,模块化与组件化 1.1 对组件的理解 在传统式编写…

Centos7下mysql8.0读写分离的配置

1.前言 1.关于读写分离的原理,这里不做太多赘述。主要从服务器去读取主服务的binlog日志,完成数据同步的过程。 这里我在mac开启了2个虚拟机,ip分别为192.168.31.109 ,192.168.31.208系统为centos 2.配置主从分离之前,需要安装…

第二十五讲:OSPF路由协议邻居认证配置

在相同OSPF区域的路由器上启用身份验证的功能,只有经过身份验证的同一区域的路由器才能互相通告路由信息。这样做不但可以增加网络安全性,对OSPF重新配置时,不同口令可以配置在新口令和旧口令的路由器上,防止它们在一个共享的公共…

android血量条的制作

最近,项目中需要用到血量条,想到血量条这东西,在游戏中经常见到。那么,再android开发中如何制作血量条呢?这里本人想到了两种方法,在网上找到一种最优方案。 方法一:用多张相同的图片拼凑而成的…

Docker安装nginx以及nginx-gui控制面板

一、安装nginx 1、搜索镜像 docker search nginx2、拉取镜像 docker pull nginx3、创建Nginx挂载配置文件 # 创建挂载目录 mkdir -p /install/nginx/conf mkdir -p /install/nginx/log mkdir -p /install/nginx/html# 生成容器 # 将容器nginx.conf文件复制到宿主机 # 将容器…

公网远程连接本地socket服务【内网穿透】

文章目录1. 配置本地socket服务2. 本地socket服务暴露至公网2.1 创建隧道映射9999端口2.2 获取公网地址3. 公网连接本地socket服务端1. 配置本地socket服务 Java 服务端demo环境 jdk1.8框架:springbootmaven开发工具:IDEA 在pom文件引入第三包封装的netty框架maven坐标 <…

【MyBatis】安装 + 框架搭建 + 优化 + 增删改查(全程一条龙服务讲解~)

目录 前言 一、准备工作 1.1、下载MyBatis 1.2、数据库设计 二、搭建框架 2.1、创建Maven项目 2.2、jar包、引入依赖 2.3、创建MyBatis核心配置文件 2.4、映射文件 2.5、通过junit测试功能 2.6、框架优化 三、增删改查优化 四、小结——注意事项 前言 本篇全程从0…

软件测试工程师的发展道路

最近看到一些测试朋友&#xff0c;对测试未来比较迷茫&#xff0c;不知该如何前行&#xff0c;无方向感。目前来看&#xff0c;业界目前存在一个普遍的矛盾&#xff0c;一方面很多人会觉得测试没有发展前途&#xff0c;另一方面&#xff0c;又有非常多的企业急需专业的测试人员…

React学习05-React Router 5

React Router 5 相关理解 SPA 单页Web应用&#xff08;single page web application&#xff0c;SPA&#xff09;。整个应用只有一个完整的页面。点击页面中的链接不会刷新页面&#xff0c;只会做页面的局部更新。数据都需要通过ajax请求获取, 并在前端异步展现。 路由 什么…