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

news2024/11/15 11:09:40

文章目录

    • 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/

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

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

相关文章

信息安全复习四:置换密码乘积密码隐写术

一、章节梗概 置换密码、Rail Fence密码、行置换密码、乘积密码、转子机、隐写术 二、置换技术 2.1 定义 重新排列明文字母&#xff0c;达到信息加密的目的。 与替代密码不同的是&#xff0c;原来明文中的字母同样出现在密文中&#xff0c;只是顺序被打断。 古典的置换密码…

.net6 core Worker Service项目发布部署到Linux,以守护进程服务的形式部署启动

一、发布项目 1、以文件夹形式 2、目标运行时选对应的平台&#xff08;Linux-x64&#xff09; 3、文件夹选项&#xff1a;在发布前删除所有现有文件 二、部署项目&#xff08;安装.net6环境&#xff1a;参考Linux安装 dotnet sdk 6.0&#xff09; &#xff08;1&#xff09;…

《Spring MVC》 第二章 让程序run起来

前言 Spring MVC 是 Spring 框架提供的一款基于 MVC 模式的轻量级 Web 开发框架。 Spring MVC 本质是对 Servlet 的进一步封装&#xff0c;其最核心的组件是DispatcherServlet&#xff0c;它是 Spring MVC 的前端控制器&#xff0c;主要负责对请求和响应的统一地处理和分发。C…

用好Python自然语言工具包-- 实例“基于本地知识库的自动问答”

首先鸣谢thomas-yanxin 本问中示例来自他在GitHub上的开源项目“基于本地知识库的自动问答”&#xff0c;链接如下&#xff1a; thomas-yanxin/LangChain-ChatGLM-Webui: 基于LangChain和ChatGLM-6B的针对本地知识库的自动问答 (github.com) 目录 1. 基础知识&#xff1a; …

JVM调优最佳参数

项目背景 C端的项目&#xff0c;用户量比较多&#xff0c;请求比较多。 启动参数表 Xmx指定应用程序可用的最大堆大小。 Xms指定应用程序可用的最小堆大小。 &#xff08;一般情况下&#xff0c;需要设置Xmx和Xms为相等的值&#xff0c;且为一个固定的值&#xff09; 如果该值…

HCIP之链路聚合、VRRP

链路聚合 链路聚合 --- 可以将多个物理接口绑定成一个逻辑接口&#xff0c;即将N条物理链路聚合为一条逻辑链路。可以在不升级硬件的条件下&#xff0c;达到增加带宽的效果 我们将逻辑链路&#xff0c;称为聚合链路&#xff0c;在华为设备中称为ETH-TRUNK链路&#xff08;这个技…

Vue表单进阶操作

多选框另类使用场景 这个复选框和上面爱好那个复选框是不一样的&#xff0c;它不需要收集value值&#xff0c;只需要知道是否被选择&#xff0c;也就是ture或false&#xff0c;这时候就可以安装输入框的方式去写&#xff0c;直接去定义字符串&#xff0c;而不是数组 然后把全部…

“esp8266mod模块连接机智云Arduino实现pwm调节led的亮度“+_+

经过几天的漫长的探索和调试&#xff0c;终于连上机智云了。 历经的困难&#xff1a;esp8266总是连接机智云app超时&#xff0c;连接无反应&#xff0c;无数据。 1、机智云开发者中心&#xff0c;新建数据点&#xff0c;生成muc代码包&#xff0c;具体配置可以参考其他文章。…

go破冰之旅·5·常量、变量、数据类型

成体系的、快速学通Go&#xff0c;就在此时&#xff0c;持续连载&#xff01; 上一篇&#xff1a; https://lan6193.blog.csdn.net/article/details/123454411https://lan6193.blog.csdn.net/article/details/123454411上文熟悉了Go的基础符号、基础规则&#xff0c;本文我们…

前端项目代码规范

一、变量与函数的命名&#xff08;变量名和函数名是最好的注释&#xff09; 通常情况下函数小陀峰、类名大陀峰、变量短横线/小陀峰、const全大写单词要表达出正确的语义&#xff0c;如&#xff1a;array类型或其它集合类型用英语复数格式、其它类型不要用复数格式区分函数为功…

async/await 在 C# 语言中是如何工作的?(下)

接《async/await 在 C# 语言中是如何工作的&#xff1f;&#xff08;上&#xff09;》、《async/await 在 C# 语言中是如何工作的&#xff1f;&#xff08;中&#xff09;》&#xff0c;今天我们继续介绍 SynchronizationContext 和 ConfigureAwait。 ▌SynchronizationContext…

【SVN已解决】修改svn服务端地址为ip或者域名地址的方法

介绍 这里是小编成长之路的历程&#xff0c;也是小编的学习之路。希望和各位大佬们一起成长&#xff01; 以下为小编最喜欢的两句话&#xff1a; 要有最朴素的生活和最遥远的梦想&#xff0c;即使明天天寒地冻&#xff0c;山高水远&#xff0c;路远马亡。 一个人为什么要努力&a…

Vue之指令详解与自定义指令

指令 想要了解自定义指令&#xff0c;那肯定得先明白什么是指令。 指令的本质&#xff1a;语法糖&#xff0c;标志位。在编译阶段 render 函数里&#xff0c;会把指令编译成 JavaScript 代码。 常见的Vue内置指令有&#xff1a; v-on 即 。v-on:click”function“&#xff…

Node【Express框架【二】】

文章目录 &#x1f31f;前言&#x1f31f;中间件&#x1f31f;中间件函数&#x1f31f;什么是中间件函数&#x1f31f;中间件函数可以做什么 &#x1f31f;Express中间件的类型&#x1f31f;应用级中间件&#x1f31f;路由器级中间件&#x1f31f;错误处理中间件&#x1f31f;内…

人为惨案之kube-controller-manager 不断重启根因溯源

文章目录 背景问题发现排查CSI provision排查kube-controller-manager查看controller log紧急恢复求助chatgpt 背景 2023年4月21日10:38:07&#xff0c;在集群中测试RBAC的时候&#xff0c;在kuboard的界面神出鬼没的删除了几个clusterRole。练习一个CKA的练习题目. Create a…

如何实现计算机上的文件共享

文件共享 第一步&#xff1a;设置无线热点第二步&#xff1a;设置本地用户权限第三步&#xff1a;设置共享文件夹第四步&#xff1a;打开自己的移动热点&#xff0c;并且让对方连接自己的热点第五步&#xff1a;让对方的电脑进行连接自己共享的文件 第一步&#xff1a;设置无线…

React-Redux详解

React-Redux详解 前言 React-Redux是一个用于在React应用中管理状态的第三方库。它是基于Redux架构的&#xff0c;提供了一种在React应用中高效管理状态的方式。React-Redux通过将Redux的核心概念和React组件相结合&#xff0c;使得在React应用中使用Redux变得更加简单和方便。…

从WebGL到Babylonjs

从WebGL到Babylonjs 一、关于WebGL 前世今生 OpenGL > OpenGL ES > WebGL本质&#xff1a;通过js代码去调用OpenGL的一系列Api 二、WebGL程序的构成 1、一个简单的webgl程序 const canvas document.querySelector(canvas); const gl canvas.getContext(webgl2); c…

llama.cpp一种在本地CPU上部署的量化模型(超低配推理llama)

0x00 背景 前不久&#xff0c;Meta前脚发布完开源大语言模型LLaMA&#xff0c; 随后就被网友“泄漏”&#xff0c;直接放了一个磁力链接下载链接。 然而那些手头没有顶级显卡的朋友们&#xff0c;就只能看看而已了 但是 Georgi Gerganov 开源了一个项目llama.cpp ggergano…

HBase高可用

一、HBase高可用简介 HBase集群如果只有一个master&#xff0c;一旦master出现故障&#xff0c;将导致整个集群无法使用&#xff0c;所以在实际的生产环境中&#xff0c;需要搭建HBase的高可用&#xff0c;也就是让HMaster高可用&#xff0c;也就是需要再选择一个或多个节点也…