机器学习实战:Python基于SVD奇异值分解进行矩阵分解(八)

文章目录

    • 1 前言
      • 1.1 奇异值分解
      • 1.2 奇异值分解的应用
    • 2 简单计算SVD
      • 2.1 NumPy 计算 SVD
      • 2.2 scikit-learn 计算截断 SVD
      • 2.3 scikit-learn 计算随机 SVD
    • 3 demo数据演示
      • 3.1 导入函数
      • 3.2 导入数据
      • 3.3 计算SVD
    • 4 讨论

1 前言

1.1 奇异值分解

奇异值分解(Singular Value Decomposition,SVD)是一种重要的矩阵分解技术,它可以将一个矩阵分解为三个矩阵的乘积,分别为左奇异矩阵、奇异值矩阵和右奇异矩阵。SVD 的原理可以描述如下:

对于任意 m × n m \times n m×n 的矩阵 A A A,它的 SVD 分解为:

A = U $\sigma $ V T V^T VT

其中 A 是待分解的矩阵,U 是一个正交矩阵,$\sigma $ 是一个对角矩阵 V T V^T VTV 的转置。这个公式表示将 A 分解为三个矩阵的乘积,其中 U 和 V T V^T VT 表示矩阵 A 在左右两个方向上的正交基,$\sigma $ 表示每个基向量上的缩放因子,称为奇异值。

优点:

  • SVD 可以处理非方阵和稠密矩阵,这是其他矩阵分解方法(如LU分解和QR分解)无法处理的情况。
  • SVD 可以有效地进行降维,保留最重要的特征,从而可以在不影响模型性能的情况下减少特征数量。
  • SVD 分解得到的三个矩阵可以分别表示原矩阵在行空间、列空间和主对角线方向的信息,有助于对矩阵的性质和特征进行分析。

缺点:

  • SVD 运算时间复杂度较高,在处理大型矩阵时需要大量的计算资源。
  • SVD 分解后得到的矩阵可能存在精度问题,特别是对于非常接近零的奇异值。
  • SVD 分解的结果可能存在多解的情况,这需要根据实际问题和领域知识进行进一步的分析和处理。

1.2 奇异值分解的应用

奇异值分解是一种重要的矩阵分解方法,具有广泛的应用。以下是一些常见的应用场景:

  1. 数据降维:SVD 可以对高维数据进行降维处理,减少数据的冗余信息和噪声,提取最重要的特征。这种方法在数据挖掘、机器学习等领域广泛应用。

  2. 图像处理:SVD 可以将图像矩阵分解成三个矩阵,其中一个矩阵可以表示图像的主要特征,从而可以实现图像压缩、降噪等处理。此外,SVD 在图像水印、图像检索等方面也有重要应用。

  3. 推荐系统:SVD 可以将用户-物品评分矩阵分解成三个矩阵,其中一个矩阵可以表示用户的偏好特征,另一个矩阵可以表示物品的属性特征。这种方法在推荐系统中广泛应用,例如Netflix竞赛中的著名算法。

  4. 自然语言处理:SVD 可以对文本矩阵进行分解,提取文本的重要主题和特征,用于文本分类、文本聚类、文本推荐等任务。

  5. 信号处理:SVD 可以将信号分解成一系列奇异值,这些奇异值表示信号的能量和频率分布等信息,从而可以实现信号分离、降噪、压缩等处理。

2 简单计算SVD

2.1 NumPy 计算 SVD

在numpy.linalg中使用 SVD 获得完整的矩阵 U、S 和 V。请注意,S 是一个对角矩阵,这意味着它的大部分条目都是零。这称为稀疏矩阵。为了节省空间,S 返回为奇异值的一维数组而不是完整的二维矩阵

import numpy as np
from numpy.linalg import svd

# 将矩阵定义为二维numpy数组
A = np.array([[4, 0], [3, -5]])

U, S, VT = svd(A)

print("Left Singular Vectors:")
print(U)
print("Singular Values:") 
print(np.diag(S))
print("Right Singular Vectors:") 
print(VT)
print(U @ np.diag(S) @ VT)

2.2 scikit-learn 计算截断 SVD

一般情况下用sklearn.decomposition中的TruncatedSVD修剪我们的矩阵。可以将输出中所需的特征数指定为n_components参数。n_components 应严格小于输入矩阵中的特征数:

import numpy as np
from sklearn.decomposition import TruncatedSVD

A = np.array([[-1, 2, 0], [2, 0, -2], [0, -2, 1]])
print("Original Matrix:")
print(A)

svd =  TruncatedSVD(n_components = 2)
A_transf = svd.fit_transform(A)

print("Singular values:")
print(svd.singular_values_)

print("Transformed Matrix after reducing to 2 features:")
print(A_transf)

2.3 scikit-learn 计算随机 SVD

随机 SVD 给出与截断 SVD 相同的结果,并且计算时间更快。截断 SVD 使用精确求解器 ARPACK,而随机 SVD 使用近似技术。

import numpy as np
from sklearn.utils.extmath import randomized_svd

A = np.array([[-1, 2, 0], [2, 0, -2], [0, -2, 1]])
u, s, vt = randomized_svd(A, n_components = 2)

print("Left Singular Vectors:")
print(u)

print("Singular Values:") 
print(np.diag(s))

print("Right Singular Vectors:") 
print(vt)

3 demo数据演示

3.1 导入函数

加载cv2需要下载一下,在shell中下载用以下命令,在jupyter中运行记得加,这里为了齐全下载了opencv-contrib-python

pip install opencv-python   (如果只用主模块,使用这个命令安装)
pip install opencv-contrib-python (如果需要用主模块和contrib模块,使用这个命令安装)
# !pip install opencv-contrib-python
import numpy as np
import matplotlib.pyplot as plt
import cv2

3.2 导入数据

构建一个简单矩阵

A = np.ones((6, 6))
A[:,:2] = A[:,:2]*2
A[:,2:4] = A[:,2:4]*3
A[:,4:] = A[:,4:]*4
print(A)

# 定义颜色
our_map = 'hot'
#our_map = 'gray'

# 构建完整矩阵
U, S, VT = np.linalg.svd(A)
S = np.diag(S)

3.3 计算SVD

写一个一个构建绘制矩阵函数的def,类似于R的function,定义为draw_svd

def draw_svd(A,U, S, VT, our_map):
  plt.subplot(221 )
  plt.title('Original matrix')
  plt.imshow(A, cmap =our_map)
  plt.axis('off')
  plt.subplot(222)
  plt.title('U  matrix')
  plt.imshow(U, cmap =our_map)
  plt.axis('off')
  plt.subplot(223)
  plt.title('Sigma matrix')
  plt.imshow(S, cmap =our_map)
  plt.axis('off')
  plt.subplot(224)
  plt.title('V matrix')
  plt.imshow(VT, cmap =our_map)
  plt.axis('off')

如果对角线 sigma 值太小,出于数值/美学目的,我们将删除相应的非常小的 (u ), (v ) 元素。例如,如果一个奇异值是 1e-08 它不会影响重建,所以我们将这些小值设置为零:

def truncate_u_v(S, U, VT):
  threshold = 0.001
  s = np.diag(S)
  index = s < threshold

  U[:,index] = 0
  VT[index,:]=0
  return U, VT
U, VT = truncate_u_v(S, U, VT)
draw_svd(A, U, S, VT, our_map) 

这里用秩r近似值(这里r = 1),也称rank-1 近似计算有多少个求和项:

r = 1
A0_r = np.matmul(U[:,:r] , S[:r,:r]) 
A0_r = np.matmul (A0_r , VT[:r,:])
plt.imshow(A0_r, cmap =  our_map)
plt.axis('off')

对于这个例子,我们之前已经看到标志可以表示为 rank-1 近似值。在 ($\sigma $) 矩阵中,第一个上部元素是唯一的非零元素。此外,请注意,矩阵 (U ) 和 (V ) 被归一化,因此它们的 L2 范数等于 1。(V ) 矩阵有一行,其元素决定了不同的颜色值。

求解前面部分的 ($2\times2 $) 矩阵的数值示例。稍后将 Python 获得的值与我们已经计算出的值进行比较:

A = [[1, 0], [1, 1]]
U, S, VT = np.linalg.svd(A)
S = np.diag(S)

print(f"U {U}\nS {S}\nVT {VT}")

4 讨论

SVD 正在将我们的矩阵 $(A ) 分解为一组向量 分解为一组向量 分解为一组向量 (v $) 和 $(u $),以及一个对角矩阵。将有用于乘法的列向量、行向量和标量。这实际上是奇异值分解,将矩阵分解为项:

如果我们有一个 rank = ($2 $),我们可以将矩阵分解为:

u 1 v 1 T + u 2 v 2 T u_{1}v_{1}^{T}+u_{2}v_{2}^{T} u1v1T+u2v2T

如果 rank = ($1 $),结果应该是这样的:

u 1 v 1 T u_{1}v_{1}^{T} u1v1T

稍微复杂一点的分解是添加标量 (($\sigma $) – σ \sigma σ),这将存储在对角矩阵中。我们对 rank-($2 $) 矩阵 ($2 $) 的基本分解:

A = σ 1 u 1 v 1 T + σ 2 u 2 v 2 T A= \sigma _{1} u_{1}v_{1}^{T}+\sigma _{2} u_{2}v_{2}^{T} A=σ1u1v1T+σ2u2v2T

这里很明显的一件事是,实际上我们可以将这些 σ \sigma σ 值视为加权系数。稍后,我们将它们存储在对角矩阵中。

SVD最常见的应用还是关于图像的,和笔者研究方向数据分析重合度不算高,后者只需要针对数据进行简单的降维即可,但对于图像压缩图像恢复
特征量谱聚类视频背景去除等对于我这个学生物统计的真的裂开,

SVD这一部分实在难啃,建议阅读原文细品:

  1. https://datahacker.rs/009-the-singular-value-decompositionsvd-illustrated-in-python/
  2. https://scicoding.com/how-to-calculate-singular-value-decomposition-svd-in-python/

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Python | 基础语法篇】02、标识符、运算符、字符串扩展及数据输入

目录 一、标识符 1.1 什么是标识符 1.2 标识符命名规则 1.2.1 标识符命名规则 - 内容限定 1.2.2 标识符命名规则 - 大小写敏感 1.2.3 标识符命名规则 - 不可使用关键字 1.3 案例演示 1.4 变量命名规范 1.4.1 变量命名规范 - 见名知意 ​1.4.2 变量命名规范 - 下划线…

MySQL——存储过程和函数从零基础到入门必学教程(涵盖基础实战)

文章目录 目录 文章目录 前言 一、创建存储过程 二、在存储过程中使用变量 1.定义变量 2.为变量赋值 三、光标的使用 1.打开光标 2.打开光标 3.使用光标 4.关闭光标 四、流程控制的作用 1.IF语句 2.CASE语句 3.LOOP语句 4.LEAVE语句 5.ITERATE语句 6.REPEAT语…

浅述 国产仪器 1761程控模块电源

1761程控模块电源是在自动测试环境中提供偏置功率和对部件或最终产品提供激励的理想设备&#xff0c;是测试系统必备的测试仪器。适用于研发、设计、生产制造等自动测试领域。 1761程控模块电源为用户选配电源提供了灵活性&#xff0c;根据需要可选购1&#xff5e;8种&#xff…

五一堵车 | AI“高速”车辆检测轻而易举监测大家安全

点击蓝字关注我们 关注并星标 从此不迷路 计算机视觉研究院 学习群&#xff5c;扫码在主页获取加入方式 计算机视觉研究院专栏 作者&#xff1a;Edison_G 五一节不管是离开小城镇还是进入大城市&#xff0c;每个高速路口都是堵车&#xff0c;现在人工智能愈来愈发达&#xff0c…

linux常用命令大全

作为开发者&#xff0c;Linux是我们必须掌握的操作系统之一。因此&#xff0c;在编写代码和部署应用程序时&#xff0c;熟练使用Linux命令非常重要。这些常用命令不得不会&#xff0c;掌握这些命令&#xff0c;工作上会事半功倍&#xff0c;大大提高工作效率。 一. 文件和目录…

OJ刷题 第十三篇

22102 - 将字符串反序 时间限制 : 1 秒 内存限制 : 128 MB 请将一个给定的字符串反序(字符长度为1到10000&#xff0c;且有可能包含空格)。 输入 反序前的字符串 输出 反序后的字符串 样例 输入 abcd 输出 dcba 答案&#xff1a; C版本1&#xff1a;&#xff08;掌握&…

( 哈希表) 217. 存在重复元素 ——【Leetcode每日一题】

❓217. 存在重复元素 难度&#xff1a;简单 给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 &#xff0c;返回 true&#xff1b;如果数组中每个元素互不相同&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3,1] 输出&#xff1a;true…

冷链物流运转 3D 可视化监控,助力大数据实时监控

智慧物流是以信息化为依托并广泛应用物联网、人工智能、大数据、云计算等技术工具&#xff0c;在物流价值链上的 6 项基本环节&#xff08;运输、仓储、包装、装卸搬运、流通加工、配送&#xff09;实现系统感知和数据采集的现代综合智能型物流系统。随着冷链信息化、数字化发展…

【Linux】8、查看 Linux 主机运行状态、压缩和解压缩命令、Linux 的环境变量

目录 一、查看 Linux 系统资源占用二、硬盘信息监控三、网络监控命令四、Linux 文件上传和下载命令五、压缩和解压(1) 压缩格式(2) tar 命令 六、Linux 的环境变量 一、查看 Linux 系统资源占用 ✒️ 可通过 top 命令查看系统的 CPU、内存的使用情况&#xff08;类似 Windows …

AutoGPT安装教程

最近安装AutoGPT时遇到了一些问题&#xff0c;写下这篇文章记录一下 1 下载AutoGPT AutoGPT链接&#xff1a;https://github.com/Significant-Gravitas/Auto-GPT/tree/v0.2.2 下载AutoGPT 推荐下载stable 版本 2 申请openai 的api key 获取api的key&#xff0c;这里就不介…

【MySQL高级】——InnoDB索引MyISAM索引

一、索引概述 MySQL官方对索引的定义为&#xff1a;索引&#xff08;Index&#xff09;是帮助MySQL高效获取数据的数据结构。 索引的本质&#xff1a;索引是数据结构。你可以简单理解为“排好序的快速查找数据结构”&#xff0c;满足特定查找算法。 这些数据结构以某种方式指向…

史上最全的接口测试,吐血整理从零到接口自动化实战...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 接口测试&#xf…

C++中的stack容器

文章目录 stack的介绍stack的使用 stack的介绍 stack是一种容器适配器&#xff0c;专门用在具有后进先出操作特性的环境中&#xff0c;只能在容器的一端进行插入删除&#xff1b;stack是作为容器适配器被实现的&#xff0c;容器适配器即是对特性类封装作为其底层的容器&#xf…

SCADA平台的HMI功能

01 前言 虹科Panorama SCADA平台支持桌面HMI、Web HMI和移动HMI的功能。桌面HMI主要是在桌面工作站实现数据可视化&#xff0c;能够获取到最全面的数据信息以及实现功能&#xff1b;Web HMI可以通过在软件中添加Web HMI服务器&#xff0c;运行程序后&#xff0c;可以在Web 客户…

被修饰成单栋的倾斜摄影处理思路

作者&#xff1a;kele 前言 倾斜摄影数据是三维项目系统中的常客。在某些项目中&#xff0c;为了给倾斜摄影上的建筑赋予属性信息&#xff0c;实现点击建筑高亮并展示属性的功能&#xff0c;客户将倾斜摄影数据进行了模型单体化&#xff08;使用pdmodeler或者其它软件&#xf…

Apache Flink

Apache Flink 1 Flink的特点2 流式计算架构2.1 Lambda架构2.2 Kappa架构2.3 IOTA架构 3 Flink部署3.1 Standalone模式3.2 Standalone-HA模式3.3 Flink on Yarn模式3.3.1 Session mode3.3.2 Per-Job mode3.3.3 Application mode 4 Flink运行时的组件4.1 JobManager&#xff08;作…

【嵌入式环境下linux内核及驱动学习笔记-(8-内核 I/O)-信号驱动】

目录 3 信号驱动的异步通知3.1 linux异步通知编程3.1.1 什么是信号3.1.2 信号的工作流程: 3.2. 应用层3.2.1 信号接收 signal函数3.2.2 应用层 fcntl 函数3.2.3 应用层信号驱动机制步骤 3.3 驱动层3.3.1 驱动层模板3.3.2 驱动层 实现fasync函数3.3.3 fasync_helper3.3.4 struct…

从历史天气预报 API 看气象大数据的商业价值

引言 近年来&#xff0c;随着气象观测技术的不断提升和气象大数据的快速发展&#xff0c;越来越多的企业开始将气象数据应用于商业领域。其中&#xff0c;历史天气预报 API 作为一种可获取历史气象数据的接口&#xff0c;具有广泛的商业应用价值。 本文将从历史天气预报 API …

Delphi 知识 彻底搞懂Delphi中的匿名方法

前言&#xff1a; 顾名思义&#xff0c;匿名方法是一个没有与之相关的名字的过程或函数。一个匿名方法将一个代码块视为一个实体&#xff0c;可以分配给一个变量或作为一个方法的参数使用。此外&#xff0c;匿名方法可以引用变量&#xff0c;并在定义该方法的上下文中为变量绑定…

【Unity入门】19.定时调用Invoke

【Unity入门】定时调用Invoke 大家好&#xff0c;我是Lampard~~ 欢迎来到Unity入门系列博客&#xff0c;所学知识来自B站阿发老师~感谢 &#xff08;一&#xff09;计时器 &#xff08;1&#xff09;Invoke 单词调用 计时器我们并不陌生&#xff0c;在cocos上有着schedule类是…