机器学习之 SVD降维:图像压缩示例

引言

在处理大规模数据集时,数据降维是一项非常重要的任务。通过降维,我们可以减少数据的存储需求、加快计算速度,并且在某些情况下还能提高模型的性能。SVD(Singular Value Decomposition,奇异值分解)是一种常用的矩阵分解技术,广泛应用于数据降维、图像压缩等领域。本文将介绍如何使用SVD进行图像压缩,并通过一个简单的Python示例来展示其效果。

什么是SVD?

SVD是一种矩阵分解方法,可以将一个矩阵分解为三个矩阵的乘积形式: A=UΣVTA=UΣVT 其中:

  • UU 是一个由左奇异向量组成的正交矩阵。
  • ΣΣ 是一个对角矩阵,对角线上是奇异值。
  • VTVT 是一个由右奇异向量组成的正交矩阵的转置。

在降维过程中,我们通常保留较大的奇异值对应的奇异向量,忽略较小的奇异值,从而达到降维的目的。

图像压缩示例

我们将使用一张图像作为示例,通过SVD将其压缩到较低的维度,并观察压缩前后图像的变化。

代码实现

首先,我们需要导入必要的库,并定义一个函数来执行图像压缩。

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

def pic_compress(k, pic_array):
    """
    使用SVD对图像进行压缩。
    
    参数:
    - k: 保留的奇异值数量。
    - pic_array: 输入的图像数组。
    
    返回:
    - new_pic: 压缩后的图像数组。
    - size: 压缩后的存储大小。
    """
    global u, sigma, vt, sig, new_pic
    u, sigma, vt = np.linalg.svd(pic_array)  # 进行奇异值分解
    sig = np.eye(k) * sigma[:k]
    new_pic = np.dot(np.dot(u[:, :k], sig), vt[:k, :])  # np.dot用于矩阵的乘法运算
    size = u.shape[0] * k + sig.shape[0] * sig.shape[1] + k * vt.shape[1]
    return new_pic, size

# 加载图像
img = Image.open("lufei.jpg")  # 彩色的图片
ori_img = np.array(img)

# 压缩图像
new_img, size = pic_compress(100, ori_img)  # 压缩的维度

# 打印原始大小和压缩后的大小
print("Original size: " + str(ori_img.shape[0] * ori_img.shape[1]))
print("Compressed size: " + str(size))

# 绘制图像
fig, ax = plt.subplots(1, 2)
ax[0].imshow(ori_img, cmap='gray')
ax[0].set_title("Before Compression")
ax[1].imshow(new_img, cmap='gray')
ax[1].set_title("After Compression")
plt.show()

代码解释

  1. 导入库:导入numpyPILmatplotlib库。
  2. 定义压缩函数:定义了一个pic_compress函数,该函数接受一个整数k作为参数,表示要保留的奇异值数量,以及一个图像数组pic_array
  3. SVD分解:使用np.linalg.svd函数对图像数组进行SVD分解。
  4. 构建新的矩阵:根据保留的奇异值数量构建新的矩阵,并计算压缩后的图像数组。
  5. 计算压缩后的存储大小:根据保留的奇异值数量计算压缩后的存储大小。
  6. 加载图像:使用Image.open函数加载图像,并将其转换为数组。
  7. 压缩图像:调用pic_compress函数压缩图像,并获取压缩后的图像数组和存储大小。
  8. 显示图像:使用matplotlib绘制原始图像和压缩后的图像,并显示它们。

输出结果

  

结论

通过SVD进行图像压缩,我们可以显著减小图像的存储需求,同时保持图像的基本特征。这对于处理大规模图像数据集尤其有用,可以提高数据处理的速度和效率。此外,SVD还可以用于其他类型的降维任务,如特征提取、数据可视化等。

希望这篇博客能够帮助你理解SVD降维的基本概念,并启发你在实际项目中的应用。

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值