自学内容网 自学内容网

《机器学习》——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降维来减少计算机处理数据的内容量,减少时间和计算机内存。


原文地址:https://blog.csdn.net/lou0720/article/details/145215747

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!