当前位置: 首页 > article >正文

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

文章目录

  • 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 和右奇异向量 vt
    u, 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.kler.cn/a/507532.html

相关文章:

  • Digital Document System (DDS)
  • 数仓建模:如何设计可扩展性较好的同环比计算模型?
  • 2013年IMO几何预选题第4题
  • tomcat文件目录讲解
  • 梁山派入门指南4——定时器使用详解,包括定时器中断、PWM产生、输入捕获测量频率
  • “扣子”开发之四:与千帆AppBuilder比较
  • Go语言的编程范式
  • SpringBoot:RestTemplate与IllegalArgumentException
  • Springboot项目Jackson支持多种接收多种时间格式
  • C语言:-三子棋游戏代码:分支-循环-数组-函数集合
  • 如何利用CodeMeter保护您的物联网设备
  • XXL-JOB 加入 GitCode:推动分布式任务调度进阶发展
  • 【CLIP-LIT】Iterative Prompt Learning for Unsupervised Backlit Image Enhancement
  • 今日总结 2025-01-17
  • 【HBuilderX 中 Git 的使用】
  • C++通透讲解设计模式:依赖倒转(1)
  • 【MySQL】:事务
  • 什么是 OpenSSL?OpenSSL 如何工作?
  • hive连接mysql报错:Unknown version specified for initialization: 3.1.0
  • OpenCV入门学习
  • 讲一下ZooKeeper的持久化机制?
  • 【Linux】进程结束和进程等待
  • 银行卡 卡号展示隐藏****
  • 【大语言模型】ACL2024论文-38 从信息瓶颈视角有效过滤检索增强生成中的噪声
  • C# OpenCV机器视觉:极大值抑制
  • 销售团队如何选择销售业绩统计表模板?