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

devtools/2025/1/19 22:27:51/

文章目录

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

相关文章

基于 Python 和 Django 的课程管理系统设计与实现

标题:基于 Python 和 Django 的课程管理系统设计与实现 内容:1.摘要 摘要:本文介绍了基于 Python 和 Django 的课程管理系统的设计与实现。文章首先阐述了课程管理系统的背景和意义,接着详细描述了系统的设计与实现过程,包括系统架构、功能模…

nginx 配置ssl_dhparam好处及缺点

ssl_dhparam 是 Nginx 配置指令之一,用于配置 Diffie-Hellman 参数,这是一种用于密钥交换的加密算法。配置 Diffie-Hellman 参数可以提高 SSL/TLS 的安全性。 以下是 ssl_dhparam 的优点和缺点: 优点: 提高 SSL/TLS 安全性&…

6、原来可以这样理解C语言_函数(1/8)函数的概念

目录 一、函数的概念 一、函数的概念 数学中我们其实就⻅过函数的概念,⽐如:⼀次函数 ykxb ,k和b都是常数,给⼀个任意的x,就 得到⼀个y值。 其实在C语⾔也引⼊函数(function)的概念&#xff0c…

StyleGaussian: Instant 3D Style Transferwith Gaussian Splatting 论文解读

目录 一、概述 二、相关工作 1、辐射场 2、3D编辑 3、风格迁移 三、StyleGaussian 1、特征嵌入 2、风格迁移 3、解码 四、实验 1、不同backbone下的量化和定性指标 2、解码器设计上的测试 3、内容损失平衡 4、风格平滑插值 一、概述 提出了StyleGaussian&#…

python-leetcode-快乐数

202. 快乐数 - 力扣(LeetCode) class Solution:def isHappy(self, n: int) -> bool:def get_next(number):return sum(int(digit) ** 2 for digit in str(number))seen set()while n ! 1 and n not in seen:seen.add(n)n get_next(n)return n 1

RabbitMQ确保消息可靠性

消息丢失的可能性 支付服务先扣减余额和更新支付状态(这俩是同步调用),然后通过RabbitMq异步调用支付服务更新订单状态。但是有些情况下,可能订单已经支付 ,但是更新订单状态却失败了,这就出现了消息丢失。…

第八届西湖论剑初赛PWN题部分题解

PWN Vpwn 下载附件,里面两个文件一个Vpwn,一个库文件,先check一下Vpwn文件看看 64位保护全开,拖进IDA中进行分析,查看main函数 __int64 __fastcall main(int a1, char **a2, char **a3) {int v3; // ebxint v5; // [rsp8h] [rbp-68h] BYREF…

麒麟系统WPS提示字体缺失问题

在日常办公和学习中,WPS作为一款功能强大且易于操作的文档编辑软件,有时候在接收或打开他人发送的WPS文档时,也有可能会遇到系统提示缺少字体的尴尬情况。这不仅影响了文档的正常显示,还可能打乱原本的工作节奏。那么,…