欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 艺术 > 《机器学习》——SVD(奇异分解)降维

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

2025/2/5 19:54:06 来源:https://blog.csdn.net/lou0720/article/details/145215747  浏览:    关键词:《机器学习》——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 和右奇异向量 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降维来减少计算机处理数据的内容量,减少时间和计算机内存。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com