《机器学习》——SVD(奇异分解)降维

news/2025/1/18 13:45:27/

文章目录

  • SVD基本定义
  • SVD降维的步骤
  • SVD降维使用场景
  • SVD 降维的优缺点
  • SVD降维实例
    • 导入所需库
    • 定义SVD降维函数
    • 导入图像
    • 处理图像
    • 处理图像
    • 打印降维结果并显示处理后两个图像的对比图

SVD基本定义

在这里插入图片描述

简单来说就是,通过SVD(奇异值分解)对矩阵数据进行减少处理,并不影响数据的整体完整性。
在这里插入图片描述

SVD降维的步骤

在这里插入图片描述

SVD降维使用场景

  • 图像压缩
    • 在数字图像处理中,图像可以表示为一个矩阵。通过 SVD 降维,可以只保留图像矩阵中最重要的部分,从而实现图像的压缩。例如,对于一个黑白图像矩阵A,经过 SVD 分解后,选择合适的K值来保留主要的奇异值,这样可以在损失一定图像质量的情况下大大减少数据存储量。
  • 文本处理中的潜在语义分析(LSA)
    • 在文本挖掘领域,文档 - 词汇矩阵可以通过 SVD 降维。假设我们有一个矩阵,其中行代表文档,列代表词汇。通过 SVD 降维,可以发现文档之间以及词汇之间的潜在语义关系。降维后的向量可以更好地表示文档的语义内容,用于文本分类、信息检索等任务。

SVD 降维的优缺点

  • 优点
    • 它是一种线性代数中的经典方法,理论基础扎实。在很多情况下可以很好地提取数据中的主要特征。与其他一些降维方法相比,SVD 不需要对数据进行复杂的预处理(如数据标准化等),因为它是基于矩阵本身的分解特性。
  • 缺点
    • 计算奇异值分解的时间复杂度较高,特别是对于大规模数据矩阵。在实际应用中,如果数据量非常大,计算 SVD 可能会非常耗时。另外,选择合适的K值可能比较困难,需要一定的经验或者通过反复试验来确定最佳值。

SVD降维实例

实例是对图片数据的降维处理。
在这里插入图片描述

导入所需库

import numpy as np
from PIL import Image
import matplotlib.pyplot as plt

需要的库,可自行下载pip install xxxx

定义SVD降维函数

通过定义一个SVD降维的函数来处理数据,会很方便。

def pic_compress(k, pic_array):# 全局变量global u, sigma, vt, sig, new_pic# 对输入的图像数组进行奇异值分解,得到左奇异向量 u,奇异值矩阵 sigma 和右奇异向量 vtu, sigma, vt = np.linalg.svd(pic_array)# 生成一个 k 阶的对角矩阵,对角元素为前 k 个奇异值sig = np.eye(k) * sigma[:k] # eye定义的为单位矩阵# 利用奇异值分解的结果重构图像,只保留前 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

导入图像

# 打开图像文件
img = Image.open("HFC.jpg")

处理图像

# 打开图像文件
img = Image.open("HFC.jpg")
# 将图像转换为灰度图像
img_w = img.convert('L')
# 将灰度图像转换为 numpy 数组
ori_img = np.array(img_w)

处理图像

通过调用函数来处理图像

# 调用压缩函数,将图像压缩到 100 维
new_img, size = pic_compress(100, ori_img)

打印降维结果并显示处理后两个图像的对比图

# 打印原始图像的数据量大小
print("original size:" + str(ori_img.shape[0] * ori_img.shape[1]))
# 打印压缩后图像的数据量大小
print("compress size:" + str(size))
# 创建一个包含两个子图的图像布局
fig, ax = plt.subplots(1, 2)
# 在第一个子图中显示原始图像
ax[0].imshow(ori_img, cmap='gray')
ax[0].set_title("before compress")
# 在第二个子图中显示压缩后的图像
ax[1].imshow(new_img, cmap='gray')
ax[1].set_title("after compress")
# 显示图像
plt.show()

在这里插入图片描述

这里可以明显的看出,数据量的减少,但是图片并没有什么改变,故此可有通过SVD降维来减少计算机处理数据的内容量,减少时间和计算机内存。


http://www.ppmy.cn/news/1564161.html

相关文章

vulnhub靶场【Raven系列】之2 ,对于mysql udf提权的复习

前言 靶机:Raven-2,IP地址为192.168.10.9 攻击:kali,IP地址为192.168.10.2 都采用虚拟机,网卡为桥接模式 文章所用靶机来自vulnhub,可通过官网下载,或者通过链接:https://pan.quark.cn/s/a65…

Java中 try-with-resources 自动关闭资源的使用

目录 前言 一、基本概念 二、语法 三、使用方法与代码示例 示例 1:使用 try-with-resources 读取文件 示例 2:多个资源的管理 四、注意事项 五、优缺点 优点 缺点 六、总结 前言 在 Java 开发中,资源管理是一个非…

【Flink系列】6. Flink中的时间和窗口

6. Flink中的时间和窗口 在批处理统计中,我们可以等待一批数据都到齐后,统一处理。但是在实时处理统计中,我们是来一条就得处理一条,那么我们怎么统计最近一段时间内的数据呢?引入“窗口”。 所谓的“窗口”&#xff…

软考中级 软件设计师 第一章 第六节 流水线技术

目录 1、概念 2、图解 3、算法 3.1、时间算法 3.2、吞吐率 1、概念 流水线是指在程序执行时多条指令重叠进行操作的一种准并行处理实现技术。 各种部件同时处理是针对不同指令而言的,它们可以同时为多条指令的不同部分进行工作,以提高各部件的利用…

EE213 Lab2 hspice simulation Static Device Characteristics

目录 0 前言 1 仿真目标 2 IDS-VDS 3 IDS-VGS 4 VTH 5 IDS-VGS(log) 6 Body bias(Ids-Vbs) 7 Body bias(Vth-Vbs) 8 Ids-Temperature 0 前言 记录一下来到skd上的强度比较大的一门课,数字集成电路2的lab设计还是蛮好的,该帖非详细教程只是单纯…

Java进阶-在Ubuntu上部署SpringBoot应用

随着云计算和容器化技术的普及,Linux 服务器已成为部署 Web 应用程序的主流平台之一。Java 作为一种跨平台的编程语言,具有广泛的应用场景。本文将详细介绍如何在 Ubuntu 服务器上部署 Java 应用,包括环境准备、应用发布、配置反向代理&#…

hive连接mysql报错:Unknown version specified for initialization: 3.1.0

分享下一些报错的可能原因吧 1.要开启hadoop 命令&#xff1a;start-all.sh 2.检查 hive-site.xml 和 hive-env.sh。 hive-site.xml中应设置自己mysql的用户名和密码 我的hive-site.xml如下&#xff1a; <configuration><property><name>javax.jdo.opt…

微信小程序 实现拼图功能

微信小程序 实现拼图 效果示例功能描述代码示例 效果示例 微信小程序 碎片拼图 功能描述 在微信小程序中&#xff0c;实现一个简单的拼图小游戏。用户需要将四张碎片图片拖动到目标图片的正确位置&#xff0c;具体功能如下&#xff1a; 拖动功能&#xff1a; 用户可以通过手指…