机器学习之SVD奇异值分解实现图片降维

SVD奇异值分解实现图片降维

目录

  • SVD奇异值分解实现图片降维
    • 1 SVD奇异值分解
      • 1.1 概念
      • 1.2 基本步骤
        • 1.2.1 矩阵分解
        • 1.2.2 选择奇异值
        • 1.2.3 重建矩阵
        • 1.2.4 降维结果
      • 1.3 优缺点
        • 1.3.1 优点
        • 1.3.2 缺点
    • 2 函数
      • 2.1 函数导入
      • 2.2 函数参数
      • 2.3 返回值
      • 2.4 通过 k 个奇异值降维
    • 3 实际测试
      • 3.1 原图数据
      • 3.2 代码测试

1 SVD奇异值分解

1.1 概念

SVD(奇异值分解)降维是一种常用的线性降维方法,在数据科学和机器学习中有着广泛的应用。SVD的主要思想是将一个矩阵分解为三个矩阵的乘积,通过保留最重要的奇异值和对应的奇异向量,来近似原矩阵,从而达到降维的目的。

1.2 基本步骤

1.2.1 矩阵分解

给定一个m * n 的数据矩阵A,SVD将其分解为三个矩阵的乘积:
A = U*Σ *V^T
其中:

  • U是一个m * n 的正交矩阵,其列向量称为左奇异向量。
  • Σ是一个m * n的对角矩阵,对角线上的非负数称为奇异值,按从大到小的顺序排列。
  • V^T是m * n的正交矩阵的转置,其行向量称为右奇异向量。
1.2.2 选择奇异值

奇异值在对角矩阵Σ中从大到小排列,前面的几个奇异值往往包含了矩阵中大部分的信息。通过选择前 k 个最大的奇异值( k 小于矩阵的秩),可以保留矩阵的主要特征

1.2.3 重建矩阵

选择前k个奇异值后,可以构造一个新的对角矩阵Σk,只包含这k 个最大的奇异值,其他位置为零。然后使用U 和V 的前k 个列向量来重建矩阵:
Ak = Uk*Σk *Vk^T
其中Uk和 Vk分别是由U和 V 的前k 个列向量组成的矩阵。

1.2.4 降维结果

矩阵 Ak 即为降维后的矩阵,其维度为 m * n 降低到了m * k 。通常情况下, k 远小于 n,因此达到了降维的效果。
在使用SVD降维时,选择合适的k 非常关键,这通常需要通过实验来确定,以便在降维和保留信息之间找到平衡。

1.3 优缺点

1.3.1 优点
  1. 信息保留能力:SVD能够有效地提取数据的主要特征,通过保留最大的奇异值,可以最大程度地保留原始数据的方差信息。
  2. 灵活性:SVD降维不依赖于数据的分布,对于多种类型的数据都适用,包括非负数据、稀疏数据等。
  3. 简化模型:通过减少特征的数量,SVD可以帮助简化机器学习模型,减少计算量,提高模型的泛化能力,减少过拟合的风险。
  4. 易于理解:SVD的数学原理相对直观,分解后的奇异值和奇异向量能够提供数据结构的直观解释。
  5. 稳定性:SVD是一种稳定的算法,对于小的数据扰动,其结果不会产生大的变化。
1.3.2 缺点
  1. 计算复杂度高:对于大型矩阵,SVD的计算复杂度较高,尤其是当矩阵的维度很高时,计算时间和空间复杂度都会显著增加。
  2. 不适合非线性数据:SVD是一种线性降维方法,对于非线性结构的数据,其降维效果可能不如非线性降维方法(如t-SNE、Isomap等)。
  3. 对噪声敏感:虽然SVD相对稳定,但在某些情况下,小的奇异值可能反映了噪声或异常值,这可能导致降维过程中噪声被放大。
  4. 数据量要求:SVD需要将整个数据集加载到内存中进行处理,对于非常大的数据集,这可能是一个挑战。
  5. 特征解释性:虽然SVD可以提供数据结构的解释,但分解后的特征可能不如原始特征直观,这可能会降低模型的可解释性。
  6. 需要选择奇异值数量:在使用SVD降维时,需要手动或通过交叉验证等方法选择保留的奇异值数量(即降维后的维度),这个选择过程可能需要多次尝试,并且可能对最终结果有较大影响。
    总的来说,SVD降维是一个强大的工具,特别适用于需要保留数据主要方差特征的场景。然而,它的应用也受到一些限制,特别是当处理大规模数据集或非线性结构的数据时。

2 函数


2.1 函数导入

from numpy.linalg import svd

2.2 函数参数

  • 默认值:a, full_matrices=True, compute_uv=True, hermitian=False,一般输入a参数,其他默认
  1. a一个形状为(M, N)的数组,需要被分解的矩阵
  2. full_matrices:布尔值,可选,默认为True。
    • 如果为True,则U和V*的形状分别是(M, M)和(N, N),奇异值将被填充为一个(M, N)的对角矩阵。
    • 如果为False,则U和V*的形状分别是(M, K)和(K, N),其中K = min(M, N),奇异值仍然是一个(K, )的数组。
  3. compute_uv:布尔值,可选,默认为True。
    • 如果为True,则计算U和V*。
    • 如果为False,则只计算奇异值,不计算U和V*。
  4. hermitian:布尔值,可选,默认为False。
    • 这个参数在NumPy的较新版本中已经废弃,不再推荐使用。它用于指定矩阵是否为厄米特矩阵(即共轭转置等于自身的矩阵)。如果为True,则函数计算的是矩阵的 eigendecomposition 而非 SVD。

2.3 返回值

该函数返回三个数组:

  1. U:形状为(M, M)或(M, K)的数组,取决于full_matrices参数,包含了左奇异向量。
  2. s:形状为(K, )的数组,包含了矩阵的奇异值,奇异值是按降序排列的
  3. Vh:形状为(N, N)或(K, N)的数组,取决于full_matrices参数,包含了右奇异向量的共轭转置。

2.4 通过 k 个奇异值降维

代码展示:

def pic_compress(k,pic_array):global u,sigma,vt,sig,new_pic# pic_array为数组u,sigma,vt = svd(pic_array)# 创建一个对角矩阵,对角线上的元素是前k个奇异值sig = np.eye(k) * sigma[:k]# 通过奇异值分解重构图像,只使用前k个奇异值new_pic = np.dot(np.dot(u[:,:k],sig),vt[:k,:])# 计算压缩后图像的大小size = u.shape[0] * k + sig.shape[0] * sig.shape[1] + k * vt.shape[1]# 返回重构后的图像和其大小return new_pic,size

3 实际测试


3.1 原图数据

在这里插入图片描述

3.2 代码测试

代码展示:

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
from numpy.linalg import svddef pic_compress(k,pic_array):global u,sigma,vt,sig,new_picu,sigma,vt = svd(pic_array)# 创建一个对角矩阵,对角线上的元素是前k个奇异值sig = np.eye(k) * sigma[:k]# 通过奇异值分解重构图像,只使用前k个奇异值new_pic = np.dot(np.dot(u[:,:k],sig),vt[:k,:])# 计算压缩后图像的大小size = u.shape[0] * k + sig.shape[0] * sig.shape[1] + k * vt.shape[1]# 返回重构后的图像和其大小return new_pic,sizeimg = Image.open('at1_gry.png')
ori_img = np.array(img)
new_img,size = pic_compress(50,ori_img)
print(f'original size:{ori_img.shape[0]*ori_img.shape[1]}')
print(f'compress size:{size}')
# 创建一个包含两个子图的图形
fig,ax = plt.subplots(1,2)
# 在第一个子图中显示原始图像
ax[0].imshow(ori_img,cmap='gray')
# 设置第一个子图的标题为before compress
ax[0].set_title('before compress')
ax[1].imshow(ori_img,cmap='gray')
ax[1].set_title('after compress')
plt.show()

运行结果:

可以看到降维后图片比降维前模糊

在这里插入图片描述

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

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

相关文章

PyTorch使用教程(6)一文讲清楚torch.nn和torch.nn.functional的区别

torch.nn 和 torch.nn.functional 在 PyTorch 中都是用于构建神经网络的重要组件,但它们在设计理念、使用方式和功能上存在一些显著的区别。以下是关于这两个模块的详细区别: 1. 继承方式与结构 torch.nn torch.nn 中的模块大多数是通过继承 torch.nn…

移动端布局 ---- 学习分享

响应式布局实现方法 主流的实现方案有两种: 通过rem \ vw/vh \ 等单位,实现在不同设备上显示相同比例进而实现适配. 响应式布局,通过媒体查询media 实现一套HTML配合多套CSS实现适配. 在学习移动端适配之前,还需要学习移动端适配原理: 移动端适配原理(Viewport) 了解VSCo…

cuda + cudnn安装

1.安装CUDA Toolkit 在设备管理器(此电脑–右键–属性)的显示适配器中可以查看自己的显卡型号,去下载对应的CUDA Toolkit 。或者输入以下命令查看Driver Version ,cuda Version:12.2代表12.2版本以下兼容可以进行安装 …

DevUI 2024 年度运营报告:开源生态的成长足迹与未来蓝图

在当今数字化飞速发展的时代,开源已成为推动技术创新与协作的重要力量。DevUI 作为开源领域的重要一员,其发展历程与成果备受关注。值此之际,GitCode 精心整理了 DevUI 年度运营报告,为您全面呈现 DevUI 社区在过去一年里的开源之…

python中的RPA->playwright自动化录制脚本实战案例笔记

playwright录制功能使用绕过登录操作 1、首先安装playwright pip install playwright2、 安装支持的浏览器 playwright install # 安装支持的浏览器:cr, chromium, ff, firefox, wk 和 webkit3、接着在自己的项目下运行录制命令: playwright codegen…

如何选择适合特定项目需求的人工智能学习框架?

人工智能学习框架(AI Learning Framework)是一种用于开发、训练和部署人工智能模型的软件平台,旨在简化AI模型的设计、训练和部署过程。这些框架通常提供一系列工具、库和预构建模块,使开发者能够快速实现机器学习任务&#xff0c…

Spring Bug解决

报错: Exception in thread "main" org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type com.itxl.spring6.iocxml.User available: expected single matching bean but found 2: user,user1 at org.sp…

U盘被格式化后的数据救赎与防范策略

一、U盘格式化后的数据困境 在日常的工作与生活中,U盘作为数据传输与存储的重要工具,扮演着不可或缺的角色。然而,当U盘不幸遭遇格式化操作后,存储在其中的宝贵数据瞬间化为乌有,给用户带来极大的困扰。格式化后的U盘…

【AI论文】LlamaV-o1:重新思考大型语言模型(LLMs)中的逐步视觉推理方法

摘要:推理是解决复杂多步骤问题的基本能力,特别是在需要逐步顺序理解的视觉环境中尤为重要。现有的方法缺乏一个全面的视觉推理评估框架,并且不强调逐步解决问题。为此,我们通过三项关键贡献,提出了一个在大型语言模型…

【HTTP】详解

目录 HTTP 基本概念啥是HTTP,有什么用?一次HTTP请求的过程当你在浏览器中输入一个浏览器地址,它会发送什么 ?---(底层流程)HTTP的协议头请求头(对应客户端)一些请求头请求方法 响应头…

EasyExcel - 行合并策略(二级列表)

😼前言:博主在工作中又遇到了新的excel导出挑战:需要导出多条文章及其下联合作者的信息,简单的来说是一个二级列表的数据结构。 🕵️‍♂️思路:excel导出实际上是一行一行的记录,再根据条件对其…

第9章:基于Vision Transformer(ViT)网络实现的迁移学习图像分类任务:早期秧苗图像识别

目录 1. ViT 模型 2. 早期秧苗分类 2.1 数据集 2.2 训练 2.3 训练结果 2.4 可视化网页推理 3. 下载 1. ViT 模型 视觉变换器(ViT)是一种神经网络架构,它将变换器架构的原理应用于视觉数据。最初,Transformers主要用于自然…

ros2-7.5 做一个自动巡检机器人

7.5.1 需求及设计 又到了小鱼老师带着做最佳实践项目了。需求:做一个在各个房间不断巡逻并记录图像的机器人。 到达目标点后首先通过语音播放到达目标点信息, 再通过摄像头拍摄一张图片保存到本地。 7.5.2 编写巡检控制节点 在chapt7_ws/src下新建功…

【React】新建React项目

目录 create-react-app基础运用React核心依赖React 核心思想:数据驱动React 采用 MVC体系package.jsonindex.html好书推荐 官方提供了快速构建React 项目的脚手架: create-react-app ,目前使用它安装默认是19版本,我们这里降为18…

Linux手写FrameBuffer任意引脚驱动spi屏幕

一、硬件设备 开发板:香橙派 5Plus,cpu:RK3588,带有 40pin 外接引脚。 屏幕:SPI 协议 0.96 寸 OLED。 二、需求 主要是想给板子增加一个可视化的监视器,并且主页面可调。 平时跑个模型或者服务,…

网络安全构成要素

一、防火墙 组织机构内部的网络与互联网相连时,为了避免域内受到非法访问的威胁,往往会设置防火墙。 使用NAT(NAPT)的情况下,由于限定了可以从外部访问的地址,因此也能起到防火墙的作用。 二、IDS入侵检…

React Native的现状与未来:从发展到展望

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

数据结构——链表(概念,类型,java实现、增删、优缺点)

我是一个计算机专业研0的学生卡蒙Camel🐫🐫🐫(刚保研) 记录每天学习过程(主要学习Java、python、人工智能),总结知识点(内容来自:自我总结网上借鉴&#xff0…

在 macOS 上,用命令行连接 MySQL(/usr/local/mysql/bin/mysql -u root -p)

根据你提供的文件内容,MySQL 的安装路径是 /usr/local/mysql。要直接使用 mysql 命令,你需要找到 mysql 可执行文件的路径。 在 macOS 上,mysql 客户端通常位于 MySQL 安装目录的 bin 子目录中。因此,完整的路径应该是&#xff1…

【QT】: 初识 QWidget 控件 | QWidget 核心属性(API) | qrc 文件

🔥 目录 1. 控件概述 控件体系的发展阶段 2. QWidget 核心属性 2.1 核心属性概览2.2 用件可用(Enabled) 2.3 坐标系(Geometry) **实例 1: 控制按钮的位置**实例 2: 表白 程序 2.4 窗口标题(windowTiltle&a…