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

news2024/12/24 10:09:09

文章目录

    • 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/454393.html

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

相关文章

【李老师云计算】实验二:Spark集群的搭建与求解最大值

索引 前言1. Spark部署1.1 下载Spark1.2 解压Spark1.3 修改环境变量1.4 修改主机Spark配置文件1.4.1 slaves.template文件配置1.4.2 spark-env.sh.template文件配置 1.5 分享主机Spark到从机1.6 启动Spark集群(★重启后的操作)1.7 通过jps查看是否启动成功1.8 通过网页查看是否…

Vue+Echarts 项目演练(上)整体页面结构的构建

项目分辨率响应式创建 项目顶部信息条创建 页面主体创建 接项目搭建与初始化之后继续对项目进行部署工作 项目展示&#xff1a; 技术栈&#xff1a; 1. vue3.0vue-router4.0axios 2. flex 布局 3. LESS 4. rem 屏幕适配 5. echarts5.0 项目分辨率响应式创建 对插件…

centos 8 配置LVS+ keepalived 高可用

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的绽放&#xff0…

3105—IIS部署

一、部署子站点 1—父站点web.config配置 新增并设定location段落 <configuration><location path"." allowOverride"false" inheritInChildApplications"false"><system.webServer><handlers><add name"aspNe…

【Matlab】基于紧格式动态线性化的无模型自适应控制

例题来源&#xff1a;侯忠生教授的《无模型自适应控制&#xff1a;理论与应用》&#xff08;2013年科学出版社&#xff09;。 对应书本 4.2 单输入单输出系统(SISO)紧格式动态线性化(CFDL)的无模型自适应控制(MFAC) 例题4.1 题目要求 matlab代码 clc; clear all;%% 期望轨迹…

neo4j jdk安装版本搭配

jdk下载版本为jdk11 neo4j 为neo4j-community-4.3.15 可使用 非常流畅 没有毛病&#xff01;&#xff01;&#xff01; 这里直接给出结论&#xff0c;对于想知道这两个版本为什么适配的小伙伴可以继续往下看 出现这个界面后在网页打开browser 输入账号和密码后就可以登录了&…

【架构设计】什么是CAP理论?

1、理论 CAP理论是指计算机分布式系统的三个核心特性&#xff1a;一致性&#xff08;Consistency&#xff09;、可用性&#xff08;Availability&#xff09;和分区容错性&#xff08;Partition Tolerance&#xff09;。 在CAP理论中&#xff0c;一致性指的是多个节点上的数据…

Vector - CAPL - CANoe硬件配置函数 - 01

CAN ACK自应答 在测试CAN&CANFD通信或者网络管理的时候&#xff0c;我们经常遇到使用报文&#xff08;网络管理报文或者通信报文&#xff09;唤醒被测件这个测试点&#xff0c;如果测试比较多的情况下&#xff0c;我们就会发现&#xff0c;如果CANoe没有接被测件或者被测件…

Python标准数据类型-Number(数字)

✅作者简介&#xff1a;CSDN内容合伙人、阿里云专家博主、51CTO专家博主、新星计划第三季python赛道Top1 &#x1f4c3;个人主页&#xff1a;hacker707的csdn博客 &#x1f525;系列专栏&#xff1a;零基础入门篇 &#x1f4ac;个人格言&#xff1a;不断的翻越一座又一座的高山…

《Java集合》ConcurrentSkipListMap

目录 数据结构findPredecessordoGetdoRemovedoPut新值插入底层创建新值的索引连接索引 数据结构 java源码中对ConcurrentSkipListMap的描述如下&#xff1a; 图中&#xff0c;第0层为具体的数据&#xff0c;第1层的每一个node都有两个子node&#xff0c;一个指向同层的右边&am…

kong(3):动态负载均衡实现

nginx下负载均衡配置 upstream tulingmall-product-upstream {server 192.168.65.190:8866 weight100;server 192.168.65.190:8867 weight100; } server {listen 80;location /pms/ {proxy_pass http://tulingmall-product-upstream;} } 通过 Kong Admin API 进行上述的负载均…

srm采购管理系统有那些功能

srm采购管理系统&#xff0c;是通过系统的手段对采购过程进行管理和控制&#xff0c;实现降低成本、提高效益、提高企业核心竞争力的目的。那么 srm采购管理系统有哪些功能呢&#xff1f; 计划管理 srm采购管理系统提供了各种物料需求计划的功能&#xff0c;以帮助企业制定并控…

前端项目实战:网易云静态页面——导航栏

文章目录 一、实现目标二、顶部实现&#xff08;背景为黑色部分&#xff09;1. 内容布局2. 左边部分网易云logo左边的列表列表元素高亮指向每个列表元素的小红色三角“下载客户端”后的hot标志 3. 右边部分登陆创作者中心搜索 三、底部实现&#xff08;背景为红色部分&#xff…

Echarts 项目演练(上)整体页面结构的构建

项目分辨率响应式创建 项目顶部信息条创建 页面主体创建 接项目搭建与初始化之后继续对项目进行部署工作 项目展示&#xff1a; 技术栈&#xff1a; 1. vue3.0vue-router4.0axios 2. flex 布局 3. LESS 4. rem 屏幕适配 5. echarts5.0 项目分辨率响应式创建 对插件…

arduino esp-01s开发环境配置(备忘)

很久没玩arduion了&#xff0c;前天一个网友提了一个问题要我帮忙&#xff0c;结果电脑重新做了系统&#xff0c;又要重新设置环境&#xff0c;结果忘记了&#xff0c;做个备忘&#xff0c;省得以后又要重新研究。 1、附加开发板管理器网址&#xff1a;http://arduino.esp8266…

L1-002 打印沙漏

L1-002 打印沙漏 分数 20 全屏浏览题目 切换布局 作者 陈越 单位 浙江大学 本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”&#xff0c;要求按下列格式打印 ************ *****所谓“沙漏形状”&#xff0c;是指每行输出奇数个符号&#xff1b;各行符号中…

机器学习——为什么逻辑斯特回归(logistic regression)是线性模型

问&#xff1a;逻辑斯蒂回归是一种典型的线性回归模型。 答&#xff1a;正确。逻辑斯蒂回归是一种典型的线性回归模型。它通过将线性回归模型的输出结果映射到[0,1]区间内&#xff0c;表示某个事物发生的概率&#xff0c;从而适用于二分类问题。具体地说&#xff0c;它使用sig…

Flink CDC 在易车的应用实践

摘要&#xff1a;本文整理自易车数据平台负责人王林红&#xff0c;在 Flink Forward Asia 2022 数据集成专场的分享。本篇内容主要分为四个部分&#xff1a; Flink 应用场景DTS 平台建设Flink CDC Hudi 应用实践未来规划 点击查看直播回放和演讲 PPT 一、Flink 应用场景 Flink…

Mybatis-Plus详解(新建maven项目、查询所有信息、打印SQL日志、实现CRUD(增删改查)、分页、条件查询且分页,前后端分离式开发)

Mybatis-Plus详解(新建maven项目、查询所有信息、打印SQL日志、实现CRUD(增删改查)、分页、条件查询且分页&#xff0c;前后端分离式开发) MyBatis-Plus(opens new window) (简称MP) 是一个MyBatis(opens new window)的增强工具&#xff0c;在MyBatis的基础上只做增强不做改变…

【牛客网】最难的问题与因子个数

目录 一、编程题 1.最难的问题 2.因子个数 一、编程题 1.最难的问题 链接&#xff1a;最难的问题__牛客网 (nowcoder.com) NowCoder生活在充满危险和阴谋的年代。为了生存&#xff0c;他首次发明了密码&#xff0c;用于军队的消息传递。假设你是军团中的一名军官&#xff…